我正在尝试使用AndEngine创建Android游戏,并且已经取得了一些成功。我正在尝试制作一个Target Tap克隆,主要是在屏幕上点击一些不同的目标来移除它们(有点像打鼹鼠)。
它与一个目标完美配合,我可以很轻松地点击它去除它。问题是,当屏幕上有多个目标时,他们不会 总是 消失,但添加点和其他所有应该在您点击时发生的事情。
我正在删除精灵(据我所知)在runOnUpdateThread(...)块中执行此操作的正确方法。
Game.runOnUpdateThread(new Runnable() {
@Override
public void run() {
// Loop through all targets and check validity
for (Iterator<Target> i = Game.this.mTargets.iterator(); i.hasNext();) {
Target t = i.next(); // Target extends Sprite
// If the target isn't valid, remove it from the scene and ArrayList
if (!t.isValid()) {
scene.unregisterTouchArea(t);
scene.detachChild(t);
Game.this.mTarget.remove(t);
}
}
}
对不起,这有点简短,但因为我不确定问题出在哪里,我不知道要提供什么代码。我目前无法在真实设备上测试它,但想知道这是否可能只是与模拟器有关,因为据我所知,代码是正确的,我已经尝试了很多东西。如果您需要帮助我,请告诉我!
由于
答案 0 :(得分:3)
当你删除一个时,看起来你正在跳过ArrayList。假设你在目标(5)上,它出现无效。然后它从列表中删除第5个元素并从那里向下移动所有内容,因此旧的第6个元素现在是第5个。然后当你循环回来时,你点击next()
正好超过 new 5th元素。
通常我在这种情况下做的是:
(a)向后浏览列表,或
(b)如果我删除一个布尔值,则将其设置为true,并在下一次迭代中执行next()函数之前检查它。或者,更有可能......
(c)不要使用迭代器,而是使用get()
函数,即
for (int i=0;i<Game.this.mTarget.size();i++) {
Target t = Game.this.mTarget.get(i); // Target extends Sprite
// If the target isn't valid, remove it from the scene and ArrayList
if (!t.isValid()) {
scene.unregisterTouchArea(t);
scene.detachChild(t);
Game.this.mTarget.remove(t);
// Decrease i to keep in sync with the new list
i--;
}
}