Лучшая практика использования Sprites в игре с использованием AndEngine GLES2

В настоящее время у меня есть статическая ссылка на все мои спрайты и загрузка и инициализация их в моем OnCreateResource mthod SimpleBaseGameActivity, но теперь мне приходится переопределять onAreaTouched прослушиватель на spirtes и способ, которым я могу переопределить его при инициализации Sprite. Но у меня есть статический метод создания Atlas и Texture Region для каждого спрайта. И я использую эти спрайты в классе сцены, и я хочу переопределить их там. Я могу зарегистрироватьTouchArea для этого конкретного спрайта на моей сцене, чтобы это можно было сделать. Но я хочу переопределить OnAreaTouched таким образом, чтобы можно было повторно использовать код. Вот как я сейчас создаю и загружаю спрайты.

defualtCageSprite = createAndLoadSimpleSprite("bg.png", this, 450, 444);

И это мой метод createAndLoadSimpleSprite.

public static Sprite createAndLoadSimpleSprite(String name,
        SimpleBaseGameActivity activity, int width, int height) {

    BitmapTextureAtlas atlasForBGSprite = new BitmapTextureAtlas(
            activity.getTextureManager(), width, height);
    TextureRegion backgroundSpriteTextureRegion = BitmapTextureAtlasTextureRegionFactory
            .createFromAsset(atlasForBGSprite, activity, name, 0, 0);
    Sprite sprite = new Sprite(0, 0, backgroundSpriteTextureRegion,
            activity.getVertexBufferObjectManager());
    activity.getTextureManager().loadTexture(atlasForBGSprite);

    return sprite;
}

Теперь, как я могу переопределить onAreaTouched для некоторых спрайтов, не теряя повторного использования кода.

Ответ 1

Есть ли причина, по которой вам нужно загружать текстуры во время выполнения? Обычным способом является загрузка необходимых текстур на один атлас при загрузке приложения, чтобы затем вы могли быстро их использовать позже.

Что касается повторного использования кода, идея Todilo об перечислениях, похоже, в значительной степени зависит от того, что вам нужно. Скажем, например, что у вас есть два типа объектов - объекты, которые исчезают, когда вы касаетесь их и объекты, которые взлетают, когда вы касаетесь их. Вы перечисляете обе категории и помещаете фрагмент кода в код обработки событий касания, который проверяет, должен ли объект исчезать или летать.

Если вы не знаете, что объекты должны делать при касании перед запуском приложения, существует более динамичный способ достижения такого же результата. Просто создайте два списка во время выполнения и поместите ссылку на объект в один из списков в соответствии с тем, что должен делать объект при касании. Затем в обработке событий касания сделайте что-то вроде этого:

if (disappearList.contains(touchedObject)) {
    disappear(object)
}
if (flyUpList.contains(touchedObject)) {
    flyUp(object)
}

Слишком плохо AndEngine не позволяет пользователям устанавливать слушателей на спрайты, это упростит ситуацию.

EDIT: Добавлено объяснение использования BlackPawnTextureBuilder: Ваш атлас должен быть типа BuildableBitmapTextureAtlas, тогда вы добавляете все текстуры, подобные этому

BitmapTextureAtlasTextureRegionFactory.createFromAsset(buildableAtlas, this, "image.png"));

и после этого

try {
    this.buildableAtlas.build(new BlackPawnTextureBuilder<IBitmapTextureAtlasSource, BitmapTextureAtlas>(1));
} catch (final TextureAtlasSourcePackingException e) {
    Debug.e(e);
}

Я не знаю, будет ли это работать для анимированных спрайтов или нет, вам придется попробовать. Кроме того, нет переопределения onTouch, вам придется сделать это в методе onAreaTouched. Одним из примеров такого условия является

if (pSceneMotionEvent.getAction() == MotionEvent.ACTION_DOWN && disappearList.contains(pTouchArea)) {disappear();}

Ответ 2

Вы уверены, что не хотите больше функциональности, чем переопределить ontouch? Как насчет создания класса, наследующего для спрайта, для тех, кто нуждается в onarea, для переопределения и всех других потребностей.