重装时我的Helis不会显示

时间:2013-12-18 03:55:56

标签: java arraylist processing reset

我在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本身不会显示。此外,墙壁重新启动正常。阵列清空,新墙从屏幕右侧进入。我究竟做错了什么?

1 个答案:

答案 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不再有用)。