在一个通用池AndEngine中使用不同的sprite纹理

时间:2014-01-13 11:34:42

标签: android andengine pool

我想使用至少9张图片&他们将通过游泳池使用。但我只能使用一个纹理用于​​Pool Class&不能用其他的休息。

我的代码:赞:

public class BubblePool extends GenericPool<Bubble> {

public static BubblePool instance;
private PixelPerfectTiledTextureRegion aITiledTextureRegion;

public BubblePool(PixelPerfectTiledTextureRegion aTextureRegion) {
    if (aTextureRegion == null) {
        throw new IllegalArgumentException(
                "The Texture Region must not be null");
    }
    this.aITiledTextureRegion = aTextureRegion.deepCopy();
    instance = this;
}

public static BubblePool sharedBubblePool() {
    // if (instance == null) {
    // instance = new BubblePool();
    // }
    return instance;
}

protected void onHandleRecycleItem(final Bubble b) {
    b.clearEntityModifiers();
    b.clearUpdateHandlers();
    b.setVisible(false);
    b.detachSelf();
    Log.v("****Bubble*****", " Recycled ");
}

@Override
protected synchronized void onHandleObtainItem(final Bubble b) {

    b.reset();
    // b.animate(new long[] { 110, 110, 110 }, 0, 2, true);
    // e.init();// starting modifiers
    b.setVisible(true);
    b.setIgnoreUpdate(false);

}

@Override
protected Bubble onAllocatePoolItem() {

    return new Bubble(0, 0, aITiledTextureRegion,
            ResourcesManager.getInstance().vbom);
}

}

我最初创造了30个相同的精灵&amp;回收以便在Scene中更快地使用。

public void initiateBubble(
        final PixelPerfectTiledTextureRegion aITiledTextureRegion) {

    bubbleList = new LinkedList<Bubble>();
    bubblePoolObj = new BubblePool(aITiledTextureRegion);


    ArrayList<Bubble> bubbles = new ArrayList<Bubble>();
    for (int i = 0; i < 30; i++) {
        Bubble ee = bubblePoolObj.obtainPoolItem();
        bubbles.add(ee);
    }
    for (Bubble easyEnemy : bubbles) {
        bubblePoolObj.recyclePoolItem(easyEnemy);
    }
    bubbles.clear();
}

然后我将池对象称为

Bubble aBubble = bubblePoolObj.obtainPoolItem();
  if (!aBubble.hasParent()) {
    // attachChild(aEasyEnemy);
    // add first layer
                            getChildByIndex(FIRST_LAYER).attachChild(aBubble);

}

我如何使用不同的纹理&amp;只通过一个游泳池重复使用?

希望,你了解我的问题。

1 个答案:

答案 0 :(得分:2)

我以前做过这个,这是我做的方式[可能不是最好的方法,但它有效]

我假设你也想要初始化不同的纹理[在这种情况下我会放3个,每个将有10个]当你获得它们时它们将是随机的。

我还假设你将为不同的纹理使用相同的Bubble对象。

你需要在池中使用一个新的int [或者你可以使用一个枚举器]

int textureOrder = 0;

然后将onAllocatePoolItem()修改为此

 @Override
    protected Bubble onAllocatePoolItem() {
        switch(textureOrder){
            case 0:
                return new Bubble(0, 0, aITiledTextureRegionA,ResourcesManager.getInstance().vbom);
            case 1:
                return new Bubble(0, 0, aITiledTextureRegionB,ResourcesManager.getInstance().vbom);
            case 2:
                return new Bubble(0, 0, aITiledTextureRegionC,ResourcesManager.getInstance().vbom);
            default:
                //this is in case you specified something unknown, you can log an error or something
                return new Bubble(0, 0, aITiledTextureRegionA,ResourcesManager.getInstance().vbom);
        }
    }

你必须在那之前准备3个纹理区域[在你的情况下,它将在池构造函数中]

现在添加一个新方法并将其命名为obtainPoolItem(int textureOrder) 它会像这样

public Bubble obtainPoolItem(int textureOrder){
    this.textureOrder = textureOrder;
    return this.obtainPoolItem();
}

此方法基本上设置了您想要创建的纹理IF和仅在池为空时,如果池不为空,则提供的int将不起作用。

现在在你的initiateBubble()方法中,有3个for循环,每个循环总共10个,用3个不同的数字调用我们的新的obtainPoolItem()[或者有嵌套循环]来创建30个气泡,每个类型10个。

您可能想要调用shufflePoolItems(),以便获得更好的随机元素

现在您可以继续使用以前的代码来获取池项,或者如果您想要在政治上正确,您可能需要在池中创建一个名为obtainPoolItemRandom()的新方法,该方法只调用[并返回] obtainPoolItem(int )你的范围中有一个随机的int,如果你的游泳池耗尽,你仍然会生成随机纹理,如果你没有这样做,你只能从最后一个类型的纹理生成

我希望这是有道理的,如果你需要更多的澄清,请留下评论,我会改进答案