AndEngine animate sprites on parallax background help! :)

Example

Hi, My name is Jonas and I am attending a university course in Android programming. I always have to go hard and go AndEngine.

In the above image, you can see that I am using a Parallax background with three layers. I scroll so the bottom layer with the blue line, which is the ice path, is scrolled. I want to animate this picture and place it on the track.

Picture i want to animate

When I load it, when I animate two people in the backgroud that animates just like the emulator goes apeshit and shows me a small triangle of the image in the corner of the screen. The animated picture that works is this:

(Picture that works.)

My horse animation is big or is it something else I am doing wrong. There is not much to find on the Internet about this! I would really appreciate all the help I can get!

This is my code example and I know these are ripoff of andEngine examples, but I'm here to find out.

package com.example.towerofhanoi;

import org.andengine.engine.camera.Camera;
import org.andengine.engine.options.EngineOptions;
import org.andengine.engine.options.ScreenOrientation;
import org.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy;
import org.andengine.entity.scene.Scene;
import org.andengine.entity.scene.background.AutoParallaxBackground;
import org.andengine.entity.scene.background.ParallaxBackground.ParallaxEntity;
import org.andengine.entity.sprite.AnimatedSprite;
import org.andengine.entity.sprite.Sprite;
import org.andengine.entity.util.FPSLogger;
import org.andengine.opengl.texture.TextureOptions;
import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas;
import       org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory;
import org.andengine.opengl.texture.region.ITextureRegion;
import org.andengine.opengl.texture.region.TiledTextureRegion;
import org.andengine.opengl.vbo.VertexBufferObjectManager;
import org.andengine.ui.activity.SimpleBaseGameActivity;

/**
 * (c) 2010 Nicolas Gramlich
 *
 * @author Nicolas Gramlich
 * @since 19:58:39 - 19.07.2010
 */
public class MainActivity extends SimpleBaseGameActivity {
// ===========================================================
// Constants
// ===========================================================

private static final int CAMERA_WIDTH = 720;
private static final int CAMERA_HEIGHT = 480;

// ===========================================================
// Fields
// ===========================================================

private BitmapTextureAtlas mBitmapTextureAtlas;
private TiledTextureRegion mPlayerTextureRegion;
private TiledTextureRegion mEnemyTextureRegion;

private BitmapTextureAtlas mAutoParallaxBackgroundTexture;

private ITextureRegion mParallaxLayerBack;
private ITextureRegion mParallaxLayerMid;
private ITextureRegion mParallaxLayerFront;

// ===========================================================
// Constructors
// ===========================================================

// ===========================================================
// Getter & Setter
// ===========================================================

// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================

@Override
public EngineOptions onCreateEngineOptions() {
    final Camera camera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);

    return new EngineOptions(true, ScreenOrientation.LANDSCAPE_FIXED, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), camera);
}

@Override
public void onCreateResources() {
    BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");

    this.mBitmapTextureAtlas = new BitmapTextureAtlas(this.getTextureManager(), 256, 128, TextureOptions.BILINEAR);
    this.mPlayerTextureRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(this.mBitmapTextureAtlas, this, "player.png", 0, 0, 3, 4);
    this.mEnemyTextureRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(this.mBitmapTextureAtlas, this, "enemy.png", 73, 0, 3, 4);
    this.mBitmapTextureAtlas.load();

    this.mAutoParallaxBackgroundTexture = new BitmapTextureAtlas(this.getTextureManager(), 1024, 1024);
    this.mParallaxLayerFront = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mAutoParallaxBackgroundTexture, this, "parallax_background_layer_front.png", 0, 0);
    this.mParallaxLayerBack = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mAutoParallaxBackgroundTexture, this, "parallax_background_layer_back.png", 0, 188);
    this.mParallaxLayerMid = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mAutoParallaxBackgroundTexture, this, "parallax_background_layer_mid.png", 0, 669);
    this.mAutoParallaxBackgroundTexture.load();
}

@Override
public Scene onCreateScene() {
    this.mEngine.registerUpdateHandler(new FPSLogger());

    final Scene scene = new Scene();
    final AutoParallaxBackground autoParallaxBackground = new AutoParallaxBackground(0, 0, 0, 5);
    final VertexBufferObjectManager vertexBufferObjectManager = this.getVertexBufferObjectManager();
    autoParallaxBackground.attachParallaxEntity(new ParallaxEntity(0.0f, new Sprite(0, CAMERA_HEIGHT - this.mParallaxLayerBack.getHeight(), this.mParallaxLayerBack, vertexBufferObjectManager)));
    autoParallaxBackground.attachParallaxEntity(new ParallaxEntity(-5.0f, new Sprite(0, 80, this.mParallaxLayerMid, vertexBufferObjectManager)));
    autoParallaxBackground.attachParallaxEntity(new ParallaxEntity(-10.0f, new Sprite(0, CAMERA_HEIGHT - this.mParallaxLayerFront.getHeight(), this.mParallaxLayerFront, vertexBufferObjectManager)));
    scene.setBackground(autoParallaxBackground);

    /* Calculate the coordinates for the face, so its centered on the camera. */
    final float playerX = (CAMERA_WIDTH - this.mPlayerTextureRegion.getWidth()) / 2;
    final float playerY = CAMERA_HEIGHT - this.mPlayerTextureRegion.getHeight() - 5;

    /* Create two sprits and add it to the scene. */
    final AnimatedSprite player = new AnimatedSprite(playerX +230, playerY-180, this.mPlayerTextureRegion, vertexBufferObjectManager);
    player.setScaleCenterY(this.mPlayerTextureRegion.getHeight());
    player.setScale(2);
    player.animate(new long[]{100, 100, 100}, 6, 8, true);

    final AnimatedSprite enemy = new AnimatedSprite(playerX + 200, playerY -180, this.mEnemyTextureRegion, vertexBufferObjectManager);
    enemy.setScaleCenterY(this.mEnemyTextureRegion.getHeight());
    enemy.setScale(2);
    enemy.animate(new long[]{200, 200, 200}, 6, 8, true);

    scene.attachChild(player);
    scene.attachChild(enemy);

    return scene;
}

// ===========================================================
// Methods
// ===========================================================

// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
}

      

thanks in advance...

/ Jonas

+3


source to share


1 answer


You are using the same textureatlas to create both textures. Here's your definition of textureatlas:

this.mBitmapTextureAtlas = new BitmapTextureAtlas(this.getTextureManager(), 256, 128, TextureOptions.BILINEAR);

      

Their dimension Y (128) is too small for this image. Instead, make a second texture atlas for the player image with at least 256 height (he wants a strength of 2) and it will cover it.

Also, I want to make sure you do this on purpose:



  this.mPlayerTextureRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(this.mBitmapTextureAtlas, this, "player.png", 0, 0, 3, 4);

      

These last two numbers (3 and 4) represent the number of columns and rows in your sprite. But when I look at your horse, I only see three or three, not three or four:

enter image description here

You might want these spaces to represent three additional cells in your animation, but make sure you do this on purpose. The createTiledFromAsset () method assumes that the sprites are placed inside the mesh.

+1


source







All Articles