0

我正在使用 AndEngine 制作游戏。现在,我有一个ArrayList填充了几个Sprite对象。我还有另一个Sprite我要检查碰撞,然后SpriteArrayList一小段延迟后删除。但是,我认为我正在处理这个错误,因为我的ArrayList:

for (int i = 0; i < mIceArray.size(); i++) {
    if (this.collidesWith(mIceArray.get(i))) {
        final int mIndex = i;
        TimerHandler iceRemovalTimer = new TimerHandler(0.1f, new ITimerCallback() {
            @Override
            public void onTimePassed(final TimerHandler pTimerHandler) {
                removeIce(mIceArray.get(mIndex));
                mIceArray.remove(mIndex);
                unregisterUpdateHandler(pTimerHandler);
                }
        });
        mEngine.registerUpdateHandler(iceRemovalTimer);
    }
}

如果有人有建议,他们将不胜感激!谢谢!

编辑:此代码在我的其他 SpriteonManagedUpdate()方法中

4

1 回答 1

3

你没有发布你的错误日志,以及你在哪里初始化你的mIceArray. 但我预料到了你的问题:

您尝试mIceArray根据碰撞状态和计时器在迭代期间修改您的。这会欺骗你的运行时调试。原因可能是:

  • mIceArray在您的精灵在场景上更新之前,您不会启动。
  • mIceArray.get(index)当索引处的项目已被删除时,从行中提取错误。

为此,您使用:

synchronized (mIceArray)
{
    for(....)
    {
        //your code to check mIceArray
        //and store (mark) the object to be removed from array
    }
    //remove obj outside the for loop
}

为什么不试试 AndEngine 解决方案:

  • CollisionHandlerwithICollisionCallback用于场景碰撞检查,或
  • ContactListner用于物理碰撞处理。
于 2012-09-05T04:34:21.433 回答