中
我正在使用AndEngine制作游戏。现在,我有一个由几个Sprite
对象填充的ArrayList
。我有另一个Sprite
,我要检查它的冲突,然后在一个小延迟后删除ArrayList
中的Sprite
。然而,我认为我错了,因为我在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);
}
}
如果有人有建议,我们将不胜感激!谢谢
编辑:这段代码在我的另一个Sprite的onManagedUpdate()
方法
您没有发布错误日志,以及在哪里初始化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解决方案:
CollisionHandler
与ICollisionCallback
用于场景碰撞检查,或ContactListner
用于Physcis碰撞处理