Лучшая практика использования 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 для некоторых спрайтов, не теряя повторного использования кода.

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

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

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

 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();} 

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