Вы довольно близки.
В функции 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;}
Надеюсь, это поможет!