Программа зависает при попытке выполнить оператор if

#java #processing

#java #обработка

Вопрос:

Я новичок в обработке, и мне дали задание создать игру с мухобойкой. Они дали нам скелетный код, и я работал над этим. На данный момент я застрял с проблемой. Весь процесс зависает без сообщения об ошибке всякий раз, когда функция collisionDetect(); возникает при нажатии мыши, я думаю, что я сузил его до чего-то, связанного с массивом swat, но это было частью предоставленного скелетного кода, и я не совсем уверен, что вызывает проблему

Вот мой код до сих пор:

 PImage fly,flybye,swatter,swatted;
float[] fX,fY;  // fly locations array
float[] swat;  // fly swatted binary boolean array, 1 = swatted, 0 = not swatted
int score=0;  // increments when swatted.


void setup(){
  size(800,400);
  fX=new float[0];
  fY=new float[0];
  swat=new float[0];
  // load images
  fly = loadImage("fly.png");
  fly.resize(50,50);
  flybye = loadImage("flybye.png");
  flybye.resize(50,50);
  swatter = loadImage("swatter.png");
  swatted = loadImage("swatted.png");

  fX =append(fX, random(50,750)); //first fly - random location
  fY =append(fY, random(25,375));
  swat =append(swat,0); // used as a boolean and matches to each individual fly, 0 = fly not swatted, 1 = swatted.
}

void populate(){ // draw the flies in memory to the screen.
  for(int i=0;i<fX.length;i  ){
    if(swat[i]==1){ // if swatted
      // resize the fly image and place based on fx/fy array values
      image(flybye, fX[0], fY[0]);
    } else { // not swatted
      image(fly,fX[0],fY[0]);
    }
  }
}

void collisionDetect(){ //collision detection - detect collision between swatter and fly
  for(int i=0; i<swat.length;i  ){ // bounding box detection
    if(mouseX-37 > fX[0]-40 amp;amp; mouseX-37 < fX[0] 40 amp;amp; mouseY-30 > fY[0]-40 amp;amp; mouseY-30 < fY[0] 40){ // condition should look at location of mouse and individual coordinates in fX and fY
      swat[0] = 1; // swatted
      image(flybye, fX[0], fY[0]);
      fX =append(fX, random(50,750)); //new fly placed in random location when old fly dies.
      fY =append(fY, random(50,350));
      swat =append(swat,0); // new fly not swatted
      score  ; //increment score
    }
  }
}

void draw(){ 
  background(255);


  //noCursor(); //added to hide cursor for a more fluid look
  populate(); // draw flys to screen.
  fill(0);
  // set a text size and location for the score.
  if(mousePressed){ // image swap
    println("Error1");
    collisionDetect();
    image(swatted, mouseX-37, mouseY-30);   //draw swatter image to around mouse locaiton - might want to play with this to get it to look right.
    println("Error");
  }else{
    image(swatter, mouseX-37, mouseY-30); // if not pressed then alternative image.
  }

}
 

Ответ №1:

Проблема заключается в том, что вы добавляете элементы в контейнер swat во время его обхода:

 for(int i=0; i<swat.length;i  ) {
    if (...)
        ...
        swat = append(swat, 0);
        ...
    }
}
 

Подсчитайте столкновение при обходе swat . Игнорируйте прихлопнутую муху. Добавьте новый fly после обнаружения столкновения в отдельный цикл:

 void collisionDetect(){

    int newFlys = 0;
    for(int i=0; i<swat.length;i  ){ // bounding box detection
        if ( swat[0] == 1 )
            continue;
        if(mouseX-37 > fX[0]-40 amp;amp; mouseX-37 < fX[0] 40 amp;amp; mouseY-30 > fY[0]-40 amp;amp; mouseY-30 < fY[0] 40){
            swat[0] = 1; // swatted
            newFlys   ;
            image(flybye, fX[0], fY[0]);
            score  ; //increment score
        }
    }

    for (int i=0; i < newFlys;   i){
        fX = append(fX, random(50,750)); //new fly placed in random location when old fly dies.
        fY = append(fY, random(50,350));
        swat =append(swat,0); // new fly not swatted
    }
}