Snake Game - Ошибка столкновения - PullRequest
0 голосов
/ 26 сентября 2011

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

Я уже пробовал несколько вещей.Я изменил способ проверки на коллизию, сделав его .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++;
    }
}

1 Ответ

0 голосов
/ 26 сентября 2011

Когда вы звоните paintComponent? Я подозреваю, что у вас есть один метод, который непрерывно перемещает змею вперед через равные промежутки времени, но paintComponent отвечает за увеличение длины змеи.

Вы должны перемещать столкновение и перемещать змею тем же способом, который отвечает за перемещение головы в направлении движения змеи.

В противном случае paintComponent может быть вызвано много раз за одно обновление обновления, и это ответственно за дубликаты x и y в вашем массиве.

...