0

我正在使用一个扩展 GenericPool 的类来处理精灵的获取和回收。我想做的是在该类中有一个方法可以在一定时间后回收。就像是:

public void recyleIn(Sprite sprite, float durationSeconds) {}

并且有一个方便/花花公子的 DelayModifier 似乎是实现它的正确方法。所以我们会有如下内容:

public void recyleIn(MySprite mySprite, float durationSeconds) {
    mySprite.registerEntityModifier(
            new DelayModifier(
                    durationSeconds,

    new IEntityModifierListener() {

        @Override
        public void onModifierStarted(IModifier<IEntity> pModifier, IEntity pItem) {

        }

        @Override
        public void onModifierFinished(IModifier<IEntity> pModifier, IEntity pItem) {
            recycle(mySprite);
        }
    }

    ));
}

现在问题来了:除非 Sprite 是“最终的”,否则我不能调用 recycle() 方法或在那里进行回收。通常这不会是一个问题,我只是制作一个“最终”的深度复制并使用它。但在这种情况下,制作副本违背了在池中回收的最初目的。(例如,如果我还是要制作副本,为什么还要费心回收和使用池?)

关于此类事情的正确方法/模型的任何想法?提前致谢。


更新:

嗯..我刚刚意识到我可以在 onModifierFinished() 方法中使用 IEntity 参数。(由于某种原因,我习惯于忽略这些参数。)所以我可以在 onModifierFinished() 中做这样的事情:

recycle((MySprite) pItem);

我仍然会对任何人对最佳方法的想法感到好奇,但我想我可能只是错过了这里显而易见的事情。

4

1 回答 1

0

我将继续回答我自己的问题,以帮助处于这种情况的人。简短的回答是使用 IEntity 参数而不是它之外的对象是正确的。我在执行此操作时遇到的第二个问题是,我想在此方法中将 IEntity 从场景中分离出来,但是在 AndEngine 中,重要的是,当 IEntity 从场景中分离时,它必须在 UpdateThread 中发生——否则你有绘制场景时可能会出现错误,同时从场景中移除某些东西。最终结果如下所示:

        @Override
        public void onModifierFinished(IModifier<IEntity> pModifier, final IEntity pItem) {
            pool.getContext().runOnUpdateThread(new Runnable() {
                @Override
                public void run() {
                    pItem.detachSelf();
                }
            });

        }

另一个小而重要的一点是 Ientity 参数上的“final”修饰符——这是必需的,以便可以在 run() 线程中调用它。

于 2013-01-31T20:17:29.620 回答