AndEngine的GenericPool处理6个精灵

时间:2011-12-22 06:26:22

标签: java android andengine

我正在使用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人员的帮助!

1 个答案:

答案 0 :(得分:2)

首先,池是如何工作的。 在池中,每次调用obtain都应获取另一个未回收的对象。这意味着:

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

现在,sprite1sprite2应该引用同一个对象。但是通过您的实现,他们,因此当您同时获得和使用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,这样您就可以知道在完成后应该将哪个水果池发送给它,或者使用setUserDatagetUserData方法可保存有关当前水果类型的信息。