当添加多个相同的spritre时,如何指定要分离的精灵?

时间:2014-10-26 06:17:10

标签: java android andengine sprite

我写了这个方法,在矿石精灵上面展示一块空岩石,一旦从中开采出资源,经过一段时间后,它就会消失,所以矿石可以再次开采,就像runescape一样。

它显示采矿后的空矿石,但问题是,在五种矿石中,只有一个空矿石精灵会消失,其余的一直存在。我认为它是因为当调用它时,它不知道哪个“emptyOre”精灵是哪个。有没有办法让它们独一无二,或者有不同的方法来做到这一点?

public static void emptyOre(final float oreX, final float oreY, float displayTime){

    emptyOre = new Sprite(oreX, oreY,
            AssetLoaderUtil.emptyOreTextureRegion,
            mContext.getVertexBufferObjectManager());
    SceneManager.mWorldScene.attachChild(emptyOre);
    //SceneManager.mWorldScene.registerTouchArea(emptyOre);
    emptyOre.setVisible(true);
    emptyOre.setZIndex(2);


    TimerHandler spriteTimerHandler;

    float mEffectSpawnDelay = displayTime;

    SceneManager.mWorldScene.registerUpdateHandler(spriteTimerHandler = new TimerHandler(
            mEffectSpawnDelay, new ITimerCallback() {
                @Override
                public void onTimePassed(
                        final TimerHandler pTimerHandler) {

                    mContext.runOnUpdateThread(new Runnable() {

                        public void run() {
                            SceneManager.mWorldScene
                                    .detachChild(emptyOre);
                        }

                    });

                    //SceneManager.mWorldScene.detachChild(emptyOre);

                    //emptyOre.setVisible(false);


                }
            }));


}

1 个答案:

答案 0 :(得分:0)

我不希望这听起来很苛刻,但问题是你不了解基本的Java编程。您已将emptyOre字段定义为static。即使您忘记在粘贴的代码中包含此内容,我也可以告诉您,您的方法也是static

这意味着该字段仅存在于整个类及其每个实例的一个副本中(但您可能只有一个实例)。您创建对象的方式只会保存最后的emptyOre

如果您不需要从其他任何地方访问emptyOre,则应在方法范围内对其进行定义:

final Sprite emptyOre = new Sprite(oreX, oreY,
        AssetLoaderUtil.emptyOreTextureRegion,
        mContext.getVertexBufferObjectManager()); 

请注意,您必须将其设为final,因为您希望在匿名类(处理程序)中使用它。这个实例是最终的意思是nbody可以将引用更改为另一个实例。这样,匿名类将记住要使用哪个emtpyOre以及何时再次调用该方法时,会创建另一个emptyOre

但是,您无法从此方法之外访问此实例。通常,您需要将实例保存到列表或地图中。取决于您希望如何访问它们。