我在Processing中制作了一个多人斩波器克隆。这是我的代码:
ArrayList<Heli> helis = new ArrayList<Heli>();
ArrayList<Heli> permaHelis = new ArrayList<Heli>();
ArrayList<Wall> walls = new ArrayList<Wall>();
IntDict keys = new IntDict();
float speed = 3;
float loop = 0;
float distance = 20;
float place = 100;
int numDead;
PFont f;
void setup() {
size(1000, 500);
f = createFont("Trebuchet MS", 25);
textFont(f);
permaHelis.add(new Heli(place, height/2, 20, 0.1, "w", color(255, 100, 100), "Dr.Swerve"));
//permaHelis.add(new Heli(place+150, height/2, 20, 0.1, str(UP), color(255, 255, 0), "Grebbles"));
for (int i = 0; i<=permaHelis.size()-1;i++) {
helis.add(permaHelis.get(i));
}
}
void draw() {
noStroke();
background(200);
if (loop == distance) {
walls.add(new Wall(width+100, random(height), random(25, 100), speed, color(0, 255, 0)));
loop=0;
}
for (int i = 0; i<helis.size();i++) {
for (int j = 0; j<walls.size();j++) {
walls.get(j).iterate();
walls.get(j).display();
if (walls.get(j).x+walls.get(j).size<=0) {
walls.remove(i);
}
if (dist(helis.get(i).x, helis.get(i).y, walls.get(j).x, walls.get(j).y)<helis.get(i).size/2+walls.get(j).size/2||helis.get(i).y<0||helis.get(i).y+helis.get(i).size>height) {
helis.get(i).explode=true;
helis.get(i).run = false;
}
}
helis.get(i).iterate();
helis.get(i).display();
}
for (int i = 0; i < helis.size();i++) {
if (helis.get(i).run==false&&helis.get(i).dead == false) {
helis.get(i).dead = true;
numDead++;
}
}
这是错误的一点。
if (numDead==helis.size()) {
fill(0);
text("Restart? (Press R)", width/2, height/2);
if (keyPressed&&key=='r') {
walls = new ArrayList<Wall>();
helis = new ArrayList<Heli>();
for (int i = 0; i<=permaHelis.size()-1;i++) {
helis.add(permaHelis.get(i));
}
numDead = 0;
}
}
loop++;
}
底部还有一个小钥匙。
void keyEvent(int pressed) {
if (key==CODED) {
keys.set(str(keyCode), pressed);
}
else {
keys.set(str(key), pressed);
}
}
void keyPressed() {
keyEvent(1);
}
void keyReleased() {
keyEvent(0);
}
因此,当我按R重新启动时,heli得分保持不变,位于屏幕顶部,但是Helis本身不会显示。此外,墙壁重新启动正常。阵列清空,新墙从屏幕右侧进入。我究竟做错了什么?
答案 0 :(得分:0)
一些注意事项:
你这样做的地方:
for (int i = 0; i<=permaHelis.size()-1;i++) {
helis.add(permaHelis.get(i));
}
您可以使用this:
helis.addAll(permaHelis);
在这个片段中,你为每个直升机重新显示每个墙壁,这是不好的(因为如果你有十个螺旋,每个墙壁每帧显示十次!)。您可以为walls
列表创建一个单独的循环来显示它。
for (int i = 0; i<helis.size();i++) {
for (int j = 0; j<walls.size();j++) {
walls.get(j).iterate();
walls.get(j).display();
我认为你这里有一个错字。它应该是walls.remove(j);
吗?
if (walls.get(j).x+walls.get(j).size<=0) {
walls.remove(i);
}
最后,关于你的问题。没有类的代码我不能肯定地说,但我认为正在发生的是这个。你创建你的permaHeli,很好。你把它添加到普通的helis列表中,很好,但它不会复制对象,它只会添加对它的引用。所以,当你做helis.get(i).dead = true;
之类的事情时,你实际上也在改变原来的permaHeli!然后,当你点击R并重置它时,它会清除列表并添加一个已经死亡的直升机。尝试将println(helis.get(i).dead);
放在for循环中以查看是否为真。如果是,您需要做的就是创建一个新的heli,而不是重新使用permaHelis列表(但也许permaHelis不再有用)。