Первое и главное, что я сделал - начал выносить код из одного файла в отдельные.
Так появился класс Hero. Пока в него попала только функция создания и движения.
Функцию движения чуток оптимизировал, чтобы при каждом проходе не создавать\убивать 4 int-переменные.
package ru.sapfil.AETest2;
import org.andengine.entity.sprite.Sprite;
import org.andengine.opengl.texture.region.ITextureRegion;
import org.andengine.opengl.vbo.VertexBufferObjectManager;
import org.andengine.ui.activity.SimpleBaseGameActivity;
class Hero extends Sprite{
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Fields
// ===========================================================
private static float sX = 100;
private static float sY = 100;
private float speed = 100;
private static int SCREEN_RIGHT_LIMIT_FOR_HERO_SPRITE;
private static int SCREEN_DOWN_LIMIT_FOR_HERO_SPRITE;
// ===========================================================
// Constructors
// ===========================================================
Hero(final SimpleBaseGameActivity myActivity, ITextureRegion mHeroFaceTextureRegion,
VertexBufferObjectManager pVertexBufferObjectManager ){
super(sX, sY, mHeroFaceTextureRegion, pVertexBufferObjectManager);
SCREEN_RIGHT_LIMIT_FOR_HERO_SPRITE =
(int) (myActivity.getEngine().getCamera().getWidth()-this.getWidth());
SCREEN_DOWN_LIMIT_FOR_HERO_SPRITE =
(int) (myActivity.getEngine().getCamera().getHeight()-this.getHeight());
}
// ===========================================================
// Getter & Setter
// ===========================================================
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
// ===========================================================
// Methods
// ===========================================================
public void move (float dt, float acs_dx, float acs_dy){
if ((acs_dx != 0) || (acs_dy != 0)) {
// вычисление новых координат и проверка касания с краем экрана
sX -= (acs_dx * (dt * speed));
sY += (acs_dy * (dt * speed));
if (sX < 0) // касание экрана слева
sX = 0;
if (sX > SCREEN_RIGHT_LIMIT_FOR_HERO_SPRITE) // касание экрана справа
sX = SCREEN_RIGHT_LIMIT_FOR_HERO_SPRITE;
if (sY < 0)
sY = 0; // касание экрана сверху
if (sY > SCREEN_DOWN_LIMIT_FOR_HERO_SPRITE)
sY = SCREEN_DOWN_LIMIT_FOR_HERO_SPRITE; // касание экрана снизу
this.setPosition(sX, sY);
}
}
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
}Ну а в основном файле переделал загрузку текстур. Теперь мы используем текстурные атласы. Вместо блока try-catch теперь вот такой вот аккуратненький кусочек:
BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
this.mHeroTexture = new BitmapTextureAtlas(this.getTextureManager(), 64, 64);
this.mHeroFaceTextureRegion =
BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mHeroTexture, this, "ship.png",0,0);
this.mHeroTexture.load();
this.mBackGroundTexture = new BitmapTextureAtlas(this.getTextureManager(), 512, 512);
this.mBackGroundTextureRegion =
BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBackGroundTexture, this, "Back1.png",0,0);
this.mBackGroundTexture.load();Если однажды кто-то это прочитает и у него возникнут вопросы - добро пожаловать в комменты.
П.С. В очередной раз я забыл вот о чем. accellerometerSpeedX и accellerometerSpeedY - не зависят от ориентации экрана. Х - это всегда по длинной стороне, а У - всегда по короткой. Соответственно, если ориентация портретная- возникает небольшая путаница.
Этот комментарий был удален автором.
ОтветитьУдалить