Первое и главное, что я сделал - начал выносить код из одного файла в отдельные.
Так появился класс 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 - не зависят от ориентации экрана. Х - это всегда по длинной стороне, а У - всегда по короткой. Соответственно, если ориентация портретная- возникает небольшая путаница.
Этот комментарий был удален автором.
ОтветитьУдалить