2011-12-22 2 views
1

Я использую AndEngine для создания игры.AndEngine's GenericPool Handling 6 Sprites

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

Мне сообщили, что использование 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, ребята!

ответ

2

Прежде всего, то есть не как работают пулы. В бассейне каждый звонок до 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 для типа текущих фруктов, так что вы знаете, к которому фрукты бассейн вы должны отправить его, когда вы сделали, или использовать setUserData и getUserData методы, чтобы сохранить информацию о типе текущих фруктов.

+1

Wow, Thanks alot Jong! Теперь я понимаю это намного лучше! SO в основном я поставляю область текстуры в пул, и я могу использовать poolItem.obtainItem(), например, чтобы получить мои первые плоды. Мне просто нужно создать 6 разных пулов для каждого из них. Теперь, как это работает, если один из них выходит из экрана?Как работает рециркуляция? И снова использовать тот же спрайт? –

+1

Когда вы закончите с спрайтом (например, выключается экран), вы называете его методом пула 'recyclePoolItem'. Теперь пул держит этот спрайт, и в следующий раз, когда вы вызовете 'getPoolItem', он вернет его, а не выделит новый (и это цель пула). – Jong

+1

Спасибо, много Jong. Ты помог много! Благодаря!! –

 Смежные вопросы

  • Нет связанных вопросов^_^