Попытка сделать столкновения между двумя разными классами - PullRequest
0 голосов
/ 14 декабря 2018

Извините, я не публикую здесь свой код, но формат испортился, и он не будет опубликован должным образом.Я пытаюсь создать игру, в которой игрок управляет кораблем, а астероиды движутся с правой стороны экрана, и игрок должен их избегать.За свою жизнь я не могу понять, как заставить астероиды сталкиваться с игроком, в результате чего игрок проигрывает, и мог бы использовать некоторую помощь.

Мой код для моей игры

1 Ответ

0 голосов
/ 15 декабря 2018

Вы довольно близки.

В функции move () вы вычисляете новую позицию игрока по x и y:

  void move() {
    int r = d>>1;
    sx = constrain(sx + v*(int(isRight) - int(isLeft)), r, width  - r);
    sy = constrain(sy + v*(int(isDown)  - int(isUp)), r, height - r);
  }

Затем вы проверяете игрокапозиция в границах астероида.

Это ваш код в функции Display ():

 void display() {
    image(ship, sx, sy, 100, 50);
    if (sx > a1x && sx < a1x && sy > a1y && sy < a1y){
      image(explo, sx, sy, 200, 200);
    }

Это в правильном направлении, но проверяет, есть ли x и yигрока и астероида совпадают точно .Это очень невероятно, потому что это точный угол как игрока, так и астероида.Кроме того, игрок может перемещаться более чем на 1 пиксель за кадр, заставляя его пропустить триггер.

Вместо этого попробуйте это: if (sx > a1x && sx < a1x +asteroid.aw && sy > a1y && sy < a1y+asteroid.ah)

Это проверит, находится ли игрок х / у вграницы астероида.И должен получить желаемый результат.Однако это еще не учитывает высоту / ширину космического корабля игрока.Так что вы должны также проверить if (sx+player.width > a1x && sx+player.width< a1x +asteroid.aw && sy+player.height> a1y && sy+player.height< a1y+asteroid.ah)

Наконец, я бы сделал общий комментарий к вашему коду.Здесь много повторений.Я предполагаю, что вы изучаете, так что все в порядке, но позвольте мне дать вам несколько указателей, которые сделают написание кода намного проще: использование ArrayLists и расширение использования объектов

ArrayList<Asteroid> List_Of_Asteroids = new ArrayList<Asteroid>();
List_Of_Asteroids.add(new Asteroid(random(X1,X2), random(Y1,Y2))

Это создает список, где вы можете добавлять или удалять объекты астероидов.Это позволяет легко выполнять одно и то же действие для всех астероидов, потому что вы должны набрать его только один раз.Делает для меньшего количества кода также.Например:

player.move();
for (Asteroid rock : List_Of_Asteroids){
    if (player.collisionCheck(rock)){
        gameOver();  //triggers explosion image and subtracts life / ends game 
    }
}
display();

Всего 5 строк, чтобы проверить все астероиды, даже если их 100. Все, что связано с объектами, должно быть записано в самом объекте.В вашем коде положение астероидов х / у сохраняется в основном цикле.Вы можете легко перенаправить их на объекты.Если вы посмотрите на два фрагмента кода выше, вы можете получить доступ к астероиду x / y следующим образом (внутри класса игрока):

boolean collisionCheck(Asteroid a){
    if (x > a.ax && x < a.ax+a.aw && y > a.ay && y < a.ay+a.ah){
       return true;
    else{
       return false;}

Надеюсь, это поможет!

...