1

我正在尝试使用 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);
            }
        }
}

抱歉,这有点简短,但是因为我不确定问题出在哪里,所以我不知道要提供什么代码。我目前无法在真实设备上对其进行测试,但想知道这是否只是与模拟器有关,因为据我所知,代码是正确的,而且我已经尝试了很多东西。如果您需要任何帮助来帮助我,请告诉我!

谢谢

4

1 回答 1

3

删除一个时,您似乎正在跳过 ArrayList 。假设您在目标(5)上并且它无效。然后它从列表中删除第 5 个元素并将所有内容从那里移到下一个,所以旧的第 6 个现在是第 5 个。然后,当您循环返回时,您next()正好越过的第 5 个元素。

通常我在这种情况下做的是:

(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--;
        }
    }
于 2011-06-21T07:19:28.717 回答