пятница, 16 марта 2012 г.

Andengine. Обновление объектов/спрайтов

Оригинал статьи

Это руководство по применение обработчиков обновления спрайтов/объектом. Оно охватывает следующие моменты:
1. Создание спрайта
2. Подключение слушателя к спрайтам/объектам, которые могут быть обновлены
3. Обработка нажатий на спрайты

Итак, приступим. Во-первых нам нужно будет создать новый спрайт. Убедитесь, что у вас есть текстуры и установите TextureRegion, а затем создайте следующую функцию в своём классе:

private void createSprite()
{
 final Sprite sprite = new Sprite(100, 100, mYourSpritesTextureRegion);
 this.mEngine.getScene().getTopLayer().addEntity(sprite);
}

Не забудьте изменить имя TextureRegion mYourSpritesTextureRegion на то, которое вы используете для своего спрайта!
После этого, определите метод onLoadScene() и протестируйте выше приложение. Вы должны увидеть спрайт на вашем экране в точке X=100 и Y=100.

Теперь мы хотим получить возможность что-нибудь сделать с нашим спрайтом. Давайте сделаем изменение положения спрайта при его перетаскивании. Для этого необходимо изменить метод createSprite(), добавить в него слушателя, который будет вызываться при нажатии. Вот обновленный код:

private void createSprite()
{
 final Scene scene = this.mEngine.getScene();
 
 final Sprite sprite = new Sprite(100, 100, mYourSpritesTextureRegion) {
  @Override
  public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float pTouchAreaLocalX, float pTouchAreaLocalY) {
   
  }
 }; 
 scene.registerTouchArea(sprite);
 
 scene.getTopLayer().addEntity(sprite);
}
 
Что мы сделали, так это добавили IOnAreaTouchedListener на спрайт и зарегистрировали на сцене. Теперь, когда мы нажимаем на спрайт, будет вызван метод onAreaTouched() и мы можем управлять в этом методе обновлением спрайта.
Для того, чтобы спрайт двигался за пальцем, когда вы его касаетесь, необходимо добавить следующий код в метод onAreaTouched():

sprite.setPosition(pSceneTouchEvent.getX(), pSceneTouchEvent.getY());

Если вы сейчас исполните этот код, результаты будут выглядеть несколько странно, т.к. позиция спрайта определяется его левым верхним углом. Для исправления этого необходимо обновить код:

sprite.setPosition(pSceneTouchEvent.getX() - this.getWidth()/2, pSceneTouchEvent.getY() - this.getHeight()/2);

Снова запустите приложение, теперь вы должны получить спрайт, послушно бегающий за вашим пальцем. 

Всё это можно оформить в виде отдельного класса MySprite унаследованного от Sprite, перегрузив его методы:

private class MySprite extends Sprite {
  
    public MySprite(float pX, float pY, TextureRegion pTextureRegion) {
        super(pX, pY, pTextureRegion);
 // TODO Auto-generated constructor stub
    }

    @Override
    protected void onManagedUpdate(float pSecondsElapsed) {
        // TODO Auto-generated method stub
 super.onManagedUpdate(pSecondsElapsed);
    }

    @Override
    public boolean onAreaTouched(TouchEvent pSceneTouchEvent) {
        setPosition(pSceneTouchEvent.getX(), pSceneTouchEvent.getY());
 return true;
    }
}

И создавать спрайт следующим образом:
    final MySprite mySprite = new MySprite(100, 100, texReg);
    scene.registerTouchArea(mySprite);
    scene.getTopLayer().addEntity(mySprite);
 
 

Комментариев нет: