我正在开发一个游戏项目。到目前为止这么好,但我只是坚持ome基本的东西,我无法找到解决方案,并使其正常工作。我决定来这里问你一些建议。
问题: 首先,我有两个级别,每个级别都有一个机器人。后来我注意到,只有第一级的机器人更新了它的行为。如果我只加载下一个级别,则不会调用机器人更新方法,我知道为什么。 我将ListIterator打印到控制台,机器人就在那里。但是当我通过主更新方法中的列表进行迭代时,它似乎并没有调用其中的对象更新方法。我仍然可以与玩家一起移动并从地图中获取钻石,这两个钻石也是列表的一部分,因此这些方法被称为。我可以为你提供一些较小的代码块,如果你需要获得一些具体的信息,如果我有它们,只需将它留在评论中。这里有一些主要的块,在我看来并不合适。 如果只有第一级的机器人移动,我又制作了4个机器人。只有Bot的第一个实例移动。同一类的所有其他项目什么都不做。
0.Declaration:
private ArrayList<AbstractObject> supp = new ArrayList<AbstractObject>();
private ListIterator<AbstractObject> objects=supp.listIterator();
1.主要更新方法:
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
}
}
}
Bot类中的更新方法:
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
任何想法为什么只有一线机器人移动?其他线对象可以正常工作。
答案 0 :(得分:0)
迭代器只能工作一次。您似乎只是初始化迭代器一次,然后期望每次调用update
时它都能正常工作。
三个选项:
(错误)在update:
中重新初始化迭代器 objects = supp.iterator();
(更好)不使用迭代器;使用for循环:
for (AbstractObject obj: supp) {
obj.update();
}
(最佳)使用流:
supp.stream().forEach(AbstractObject::update);
如果更新可能会删除某个项目,那么您最好的选择是在处理完列表后删除它们。例如,在名为AbstractObject
的{{1}}中创建一个布尔方法。然后您可以使用以下内容:
shouldBeRemoved
使用上述三种方法之一处理列表后。