среда, 7 ноября 2012 г.

Наводим порядочек - вынос части кода в отдельный файл.


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

1 комментарий: