我正在使用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();
}
}
所以当你们看到我创建了一个我可以添加Sprite的游泳池时。
问题是我有一个随机选择1到6之间的数字的方法。我使用Switch语句选择将哪个精灵添加到场景中。
我怎么能用GenericPool做到这一点?拥有六个不同的精灵,并能够选择哪一个添加到场景中?
我想也许我可以创建一个方法,将每个Sprite添加到我的游戏池中,然后我卡在我找到一种方法来选择从池中选择哪个精灵的部分,例如提供选择精灵所需的int。
感谢Advance人员的帮助!
答案 0 :(得分: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
方法可保存有关当前水果类型的信息。