ListIterator 中只有一个对象实例移动
Only one instance of object from ListIterator moves
我正在做一个游戏项目。到目前为止一切顺利,但我只是停留在一些基本的事情上,我找不到解决方案并使其正常工作。我决定来这里问问大家的建议。
问题:
首先,我有 2 个级别,每个级别都有一个机器人。后来我注意到,只有第一层的机器人会更新它的行为。如果我只加载下一个级别,则不会调用机器人更新方法,我也不知道为什么。
我将 ListIterator 打印到控制台,机器人就在那里。但是当我在主更新方法中遍历列表时,它似乎没有调用其中的对象更新方法。我仍然可以与玩家一起移动并从地图中获取钻石,它们也是列表的一部分,因此调用了这些方法。如果您需要获取有关某些特定事物的一些信息(如果我有或没有),我可以为您提供一些较小的代码块,只需将其留在评论中即可。以下是我认为无法正常工作的一些主要模块。
如果只有第一层中的机器人移动,我又为它制作了 4 个机器人。只有 Bot 的第一个实例移动。相同的所有其他项目 class 什么都不做。
0.Declaration:
private ArrayList<AbstractObject> supp = new ArrayList<AbstractObject>();
private ListIterator<AbstractObject> objects=supp.listIterator();
1.Main更新方法:
public void update() {
resetList(); //sets the cursor at begining
if(menu.getChoice()==-1){
menu.update();
}
else if(menu.getChoice()==2)
System.exit(0);
else if(menu.getChoice()==0){
if(currentLevel>lvlm.getLevel() || currentLevel<lvlm.getLevel()){
clearList(); //remove all items in the list
init(lvlm.getLevelPath());
currentLevel=lvlm.getLevel();
}
while(objects.hasNext()){
objects.next().update(); //calls all updates from each object in the list
}
}
}
机器人中的更新方法Class:
public void update() {
movingCount++;
switch(getFacing()){
case 2:
moved=true;
setFacing(2);
setVectorX(-0.5);
break;
case 3:
moved=true;
setFacing(3);
setVectorX(0.5);
break;
case 0:
case 1:
setVectorX(0);
moved=false;
}
if(movingCount>=200){
setFacing(randInt(0,3));
movingCount=0;
}
moveOnX(); //updates pos
moveOnY(); //updates pos
getAnimationL().runAnimation();
getAnimationR().runAnimation();
}
EDIT_1:
好的,所以机器人只在文件的第一行移动。
级别 1
P播放器
B机器人
D-钻石
1 面墙
1111111 B B
1P D 1
11111 1
1F 1 B
1111111
B B B
知道为什么只有一线机器人会移动吗?其他线对象正常工作。
迭代器只工作一次。您似乎正在初始化迭代器一次,然后期望它在每次调用 update
时都能正常工作。
三个选项:
(不好)在更新中重新初始化迭代器:
objects = supp.iterator();
(更好)不要使用迭代器;使用 for 循环:
for (AbstractObject obj: supp) {
obj.update();
}
(最佳)使用流:
supp.stream().forEach(AbstractObject::update);
如果更新可能会删除某个项目,那么您最好的选择是在处理完列表后将其删除。例如,在 AbstractObject
中创建一个名为 shouldBeRemoved
的布尔方法。然后您可以使用以下内容:
supp.removeIf(AbstractObject::shouldBeRemoved);
使用上述三种方法之一处理列表后。
我正在做一个游戏项目。到目前为止一切顺利,但我只是停留在一些基本的事情上,我找不到解决方案并使其正常工作。我决定来这里问问大家的建议。
问题: 首先,我有 2 个级别,每个级别都有一个机器人。后来我注意到,只有第一层的机器人会更新它的行为。如果我只加载下一个级别,则不会调用机器人更新方法,我也不知道为什么。 我将 ListIterator 打印到控制台,机器人就在那里。但是当我在主更新方法中遍历列表时,它似乎没有调用其中的对象更新方法。我仍然可以与玩家一起移动并从地图中获取钻石,它们也是列表的一部分,因此调用了这些方法。如果您需要获取有关某些特定事物的一些信息(如果我有或没有),我可以为您提供一些较小的代码块,只需将其留在评论中即可。以下是我认为无法正常工作的一些主要模块。 如果只有第一层中的机器人移动,我又为它制作了 4 个机器人。只有 Bot 的第一个实例移动。相同的所有其他项目 class 什么都不做。
0.Declaration:
private ArrayList<AbstractObject> supp = new ArrayList<AbstractObject>();
private ListIterator<AbstractObject> objects=supp.listIterator();
1.Main更新方法:
public void update() {
resetList(); //sets the cursor at begining
if(menu.getChoice()==-1){
menu.update();
}
else if(menu.getChoice()==2)
System.exit(0);
else if(menu.getChoice()==0){
if(currentLevel>lvlm.getLevel() || currentLevel<lvlm.getLevel()){
clearList(); //remove all items in the list
init(lvlm.getLevelPath());
currentLevel=lvlm.getLevel();
}
while(objects.hasNext()){
objects.next().update(); //calls all updates from each object in the list
}
}
}
机器人中的更新方法Class:
public void update() { movingCount++; switch(getFacing()){ case 2: moved=true; setFacing(2); setVectorX(-0.5); break; case 3: moved=true; setFacing(3); setVectorX(0.5); break; case 0: case 1: setVectorX(0); moved=false; } if(movingCount>=200){ setFacing(randInt(0,3)); movingCount=0; } moveOnX(); //updates pos moveOnY(); //updates pos getAnimationL().runAnimation(); getAnimationR().runAnimation();
}
EDIT_1: 好的,所以机器人只在文件的第一行移动。
级别 1 P播放器 B机器人 D-钻石 1 面墙
1111111 B B
1P D 1
11111 1
1F 1 B
1111111
B B B
知道为什么只有一线机器人会移动吗?其他线对象正常工作。
迭代器只工作一次。您似乎正在初始化迭代器一次,然后期望它在每次调用 update
时都能正常工作。
三个选项:
(不好)在更新中重新初始化迭代器:
objects = supp.iterator();
(更好)不要使用迭代器;使用 for 循环:
for (AbstractObject obj: supp) { obj.update(); }
(最佳)使用流:
supp.stream().forEach(AbstractObject::update);
如果更新可能会删除某个项目,那么您最好的选择是在处理完列表后将其删除。例如,在 AbstractObject
中创建一个名为 shouldBeRemoved
的布尔方法。然后您可以使用以下内容:
supp.removeIf(AbstractObject::shouldBeRemoved);
使用上述三种方法之一处理列表后。