AndEngine - Sprites留在屏幕上......有时候

时间:2011-06-20 18:17:01

标签: java android eclipse andengine

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

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

由于

1 个答案:

答案 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--;
        }
    }