Итак, я делаю игру змея , но если я очень быстро перехожу из одного направления в другое, то он говорит, что я столкнулся с телом, и заканчивает игрунапример, если я иду налево и ударю вниз, а затем снова налево очень быстро или вниз и вправо очень быстро и т. д.)
Я уже пробовал несколько вещей.Я изменил способ проверки на коллизию, сделав его .intersects
вместо проверки if (x == body[i][0] && y = body[i][1]
).Я также сделал несколько System.out.println()
, чтобы увидеть, может быть, там что-то не так.Я заметил, что иногда одно из значений повторяется (x или y в зависимости от направления), но я не могу понять, почему ... Я понимаю, что повторение - это то, почему оно портит столкновение, но я не могу найтиместо, где это будет повторяться.
x и y изменяются потоком.
Вот часть "кода" моего кода.Если вам нужны другие фрагменты кода, пожалуйста, дайте мне знать.
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (numOfFood == 1) {//Checks wether there is food on the GUI
g.setColor(Color.BLUE);
g.fillRect(foodX,foodY,12,12);
}
else {
foodX = random.nextInt(103)*12; //Both this and the below line get a random x or y value to put on GUI for food placement
foodY = random.nextInt(57)*12;
numOfFood = 1;
}
Rectangle headRect = new Rectangle( x, y, 12, 12 ); //Actual rectangle of the head
Rectangle foodRect = new Rectangle(foodX, foodY, 12, 12); //Food rectangle
g.setColor(Color.RED);
g.fillRect(x,y,12,12); //Draws head of Snake
g.setColor(Color.WHITE);
g.fillRect(x+2,y+2,8,8); //Draws a white square in the head of the snake
for (int i = 0; i < n; ++i) { //Collision Checker
Rectangle bodyRect = new Rectangle(body[i][0],body[i][1],12,12);
if ( headRect.intersects(bodyRect)) {
for (int j = 0; j < n; ++j) {
body[j][0] = -1;
body[j][1] = -1;
}
numOfFood = 1;
n = 0;
x = 624;
y = 348;
endGame = true;
}
}
g.setColor(Color.RED);
if (n > 0) { //Puts the snakes body behind the head
for (int i = 0;i < n; ++i) {
g.fillRect(body[i][0],body[i][1],12,12);
}
}
for (int i = n-1;i >= 0; --i) { //Inserts the head at the first part of the array so that the body moves
if (body[i][0] != -1 && body[i][1] != -1) {
body[i+1][0] = body[i][0];
body[i+1][1] = body[i][1];
}
if (i == 0) {
body[i][0] = x;
body[i][1] = y;
}
}
if (headRect.intersects(foodRect)) { //If the food rectangle and the head rectangle intersect then the snake got the food.
numOfFood = 0;
n++;
}
}