gpt4 book ai didi

java - 从 ArrayList 中删除对象会导致延迟

转载 作者:行者123 更新时间:2023-12-01 15:33:16 25 4
gpt4 key购买 nike

我有一个 ArrayList,它在我的 Android 游戏中保存飞机(敌人)。这些飞机从屏幕的一侧移动到另一侧,用户必须躲避它们。当平面的 x 值小于 -50 时,它将从 ArrayList 中删除。发生这种情况时,会导致当前屏幕上的所有飞机轻微“跳跃”。它们消失了几毫秒,然后重新绘制,但比它们应该在的位置晚了 2 像素。

这里是paint方法,其中planes是ArrayList

public void onDraw(){
bg1.onDraw(c);
bg2.onDraw(c);
chopper.onDraw(c);

score.onDraw(c);

// PAINTS THE PLANE OR DELETES IF OFF SCREEN
for (int i = 0; i < planes.size(); i++) {
Plane p = planes.get(i);
if(p.getX()<-50){
planes.remove(p);
}else{
p.onDraw(c);

if (p.getX() < 170) {
detectPlaneCollision(p, c);
}
}

}
}

有办法解决这个问题吗?我应该使用不同的数据结构吗?

谢谢

汤姆

最佳答案

我认为你的问题与你选择的数据结构无关,而是因为你正在修改你的 List当您循环播放时

假设您的列表中有三架飞机 - [P1,P2,P3]。

  • 在循环的第一次迭代时 i0 ,您处理 P1
  • P1 有 getX() < -50所以你删除它,现在列出列表[P2,P3]
  • 在循环的下一次迭代中 i现在是1所以你处理P3。
  • 这意味着 P2 永远不会被处理,因此永远不会被绘制,从而使其短暂消失。

尝试使用Iterator这将允许您在循环 List 时安全地删除项目。 .

Iterator<Plane> i = planes.iterator();

while (i.hasNext()) {
Plane p = i.next();

if (p.getX() < -50) {
i.remove();
} else {
p.onDraw(c);

if (p.getX() < 170) {
detectPlaneCollision(p, c);
}
}
}

尽管如此,因为您不关心处理 Plane 的顺序您可以考虑将它们存储在 Set 中而不是List 。一个Set不必担心在添加和删除项目时维护项目的顺序。

关于java - 从 ArrayList 中删除对象会导致延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9293186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com