3

Example

Hi, My name is Jonas and i am attending a university course in Android programming. I always have to take the hard way and going AndEngine.

In the above picture you can see that i am using a Parallax background with three layers. I am making a sidescroller so the bottom layer with the blue line that is an ice track is scrolling. I want to animate this picture and put it on the track.

Picture i want to animate

When i load it as i animate the two people in the backgroud that is animated in the same way the emulator is going apeshit and showing me a small triangle of the picture in the corner of the screen. A animated picture that works is this one:

(Picture that works.)

Is my animated picture of the horse to big or is it something else i am doing wrong. There is not much i find on the internet about this matter! I would really appreciate all the help i can get!

This is an example of my code and i know it is a ripoff of andEngine Examples but i am here to learn.

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

Alexey
  • 714
  • 8
  • 21
user2063918
  • 31
  • 1
  • 3
  • 1
    Are you using GLES 1 or GLES 2? Also, have you tried your app on an actual device? The emulator has a tendency of being silly. – eBehbahani Feb 14 '13 at 16:45

1 Answers1

1

You're using the same textureatlas to generate both textures. Here's your textureatlas definition:

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

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

Also, I want to make sure you're doing this intentionally:

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

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

enter image description here

It might be you want that whitespace as three additional cells in the animation, but make sure you're doing that on purpose. The createTiledFromAsset() method assumes the sprites are fitting within a grid.

Cameron Fredman
  • 1,259
  • 11
  • 24