Я пытаюсь создать фон для своей игры, создающий впечатление, что некоторые вещи более чем другие. так что скажу, что у меня есть небо, солнце, облака и земля. небо и солнце самые дальние, облака посередине и земля впереди. теперь, если игрок увеличивает или кадрирует камеру, я хочу, чтобы дальнейшие слои двигались меньше, чем более близкие слои, чтобы создать впечатление, что они действительно больше (земля больше всего движется, а облака меньше движутся, а солнце почти не двигается) так же, как и поведение auto parallax, за исключением того, что это статический фон, так что обычно ничего не движется, если игроки не увеличивают или уменьшают масштаб.
эта концепция реализована в сердитых птицах с игровыми предметами (птицами, свиньями, блоками...), а земля находится впереди, самый высокий слой горы посередине, а небо и облака - самые дальние.
теперь, если вы понимаете, что я пытаюсь выполнить, пожалуйста, дайте мне представление, как это сделать, потому что это заставило меня сходить с ума в последние несколько дней, и я просто не мог даже поставить концепцию для ее реализации. любой код также будет отличным.
Вы можете попытаться использовать Andengine для такой цели:
http://www.youtube.com/watch?v=ug5vfys6MIA
также см.: http://www.andengine.org/forums/features/parallaxlayer-t5390.html
Это действительно легко добиться такого эффекта, вот пример:
@Override
public void onLoadResources() {
BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
this.mBitmapTextureAtlas = new BitmapTextureAtlas(256, 128, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
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.mAutoParallaxBackgroundTexture = new BitmapTextureAtlas(1024, 1024, TextureOptions.DEFAULT);
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.mEngine.getTextureManager().loadTextures(this.mBitmapTextureAtlas, this.mAutoParallaxBackgroundTexture);
}
@Override
public Scene onLoadScene() {
this.mEngine.registerUpdateHandler(new FPSLogger());
final Scene scene = new Scene();
final AutoParallaxBackground autoParallaxBackground = new AutoParallaxBackground(0, 0, 0, 5);
autoParallaxBackground.attachParallaxEntity(new ParallaxEntity(0.0f, new Sprite(0, CAMERA_HEIGHT - this.mParallaxLayerBack.getHeight(), this.mParallaxLayerBack)));
autoParallaxBackground.attachParallaxEntity(new ParallaxEntity(-5.0f, new Sprite(0, 80, this.mParallaxLayerMid)));
autoParallaxBackground.attachParallaxEntity(new ParallaxEntity(-10.0f, new Sprite(0, CAMERA_HEIGHT - this.mParallaxLayerFront.getHeight(), this.mParallaxLayerFront)));
scene.setBackground(autoParallaxBackground);
/*
* Calculate the coordinates for the face, so its centered on the camera.
*/
final int playerX = (CAMERA_WIDTH - this.mPlayerTextureRegion.getTileWidth()) / 2;
final int playerY = CAMERA_HEIGHT - this.mPlayerTextureRegion.getTileHeight() - 5;
/* Create two sprits and add it to the scene. */
final AnimatedSprite player = new AnimatedSprite(playerX, playerY, this.mPlayerTextureRegion);
player.setScaleCenterY(this.mPlayerTextureRegion.getTileHeight());
player.setScale(2);
player.animate(new long[] { 200, 200, 200 }, 3, 5, true);
final AnimatedSprite enemy = new AnimatedSprite(playerX - 80, playerY, this.mEnemyTextureRegion);
enemy.setScaleCenterY(this.mEnemyTextureRegion.getTileHeight());
enemy.setScale(2);
enemy.animate(new long[] { 200, 200, 200 }, 3, 5, true);
scene.attachChild(player);
scene.attachChild(enemy);
return scene;
}