Универсальный пул AndEngine для 6 спрайтов - PullRequest
1 голос
/ 22 декабря 2011

Я использую AndEngine для создания игры.

Я случайно добавил в свой код спрайты, которые появляются примерно каждую секунду.

Мне сообщили, что использование Generic Pool сэкономит сборку мусора в моем случае, что приведет к задержке игры в определенные моменты времени.

Итак, вот что мне удалось придумать для моего GenericPool ..

public class FruitPool extends GenericPool<Sprite> {
private Sprite msprite;


public FruitPool(Sprite sprite) {
if (sprite == null) {
// Need to be able to create a Sprite so the Pool needs to have a TextureRegion
throw new IllegalArgumentException("The texture region must not be NULL");
}
msprite = sprite;
}

/**
* Called when a Bullet is required but there isn't one in the pool
*/
@Override
protected Sprite onAllocatePoolItem() {
return msprite;

}

/**
* Called when a Bullet is sent to the pool
 */
 @Override
protected void onHandleRecycleItem(final Sprite sprite) {
 msprite = sprite;
 msprite.setIgnoreUpdate(true);
 msprite.setVisible(false);
 }

 /**
 * Called just before a Bullet is returned to the caller, this is where you write your initialize code
 * i.e. set location, rotation, etc.
 */
 @Override
 protected void onHandleObtainItem(final Sprite fruit) {
 fruit.reset();
 }
 }

Итак, как вы, ребята, видите, я создал пул, к которому я могу добавить Спрайт.

Проблема в том, что у меня есть метод, который случайным образом выбирает число от 1 до 6. И я использую параметр Switch, чтобы выбрать, какой спрайт будет добавлен на сцену.

Как я могу сделать это с GenericPool? Имеет ли он шесть разных спрайтов и может ли выбрать, какой из них будет добавлен на сцену?

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

Спасибо за помощь в Advance, ребята!

1 Ответ

2 голосов
/ 22 декабря 2011

Прежде всего, это не , как работают пулы.В пуле каждый вызов obtain должен получить еще один необработанный объект.Это означает:

FruitPool pool = new FruitPool(...);
Sprite sprite1 = pool.obtain();
Sprite sprite2 = pool.obtain();

Теперь sprite1 и sprite2 должны не ссылаться на один и тот же объект.Но с вашей реализацией они делают и, следовательно, не будут работать, когда вы получите и используете 2 элемента одновременно.

Вы должны реализовать это так:

public class FruitPool extends GenericPool<Sprite> {
// ===========================================================
// Constants          
// ===========================================================

// ===========================================================          
// Fields         
// =========================================================== 
private final TextureRegion mTextureRegion;
// ===========================================================          
// Constructors          
// =========================================================== 
public FruitPool(final TextureRegion pFruitTextureRegion) {
    this.mTextureRegion = pFruitTextureRegion;
}
// ===========================================================          
// Getter & Setter          
// =========================================================== 

// ===========================================================          
// Methods for/from SuperClass/Interfaces          
// ===========================================================  
@Override
protected Sprite onAllocatePoolItem() {
    return new Sprite(0, 0, this.mTextureRegion);
}
@Override
protected void onHandleObtainItem(final Sprite pItem) {
    pItem.reset();
}
@Override
protected void onHandleRecycleItem(final Sprite pItem) {
    pItem.setVisible(false);
    pItem.setIgnoreUpdate(true);
}
// ===========================================================          
// Methods          
// ===========================================================  

// ===========================================================          
// Inner and Anonymous Classes          
// ===========================================================  
}

Таким образом, из пула можно одновременно запросить несколько спрайтов, и пул фактически выполнит свое назначение.

По вашему вопросу, пул реализован с использованием стек , так что вы не можете вынуть из него определенный предмет - только тот, что вверху.Затем я рекомендую вам создать 6 различных фруктовых пулов, каждый для другого типа фруктов.

Вы должны либо расширить Sprite и включить поле type для типа текущего фрукта, так что вы 'd знаю, в какой фруктовый пул вы должны его отправить, когда закончите, или используйте методы setUserData и getUserData, чтобы сохранить информацию о типе текущего фрукта.

...