蛇游戏 - 碰撞错误

时间:2011-09-25 20:21:45

标签: java user-interface collision

所以我正在制作一个 snake game ,但是如果我从一个方向快速移动到另一个方向那么它就说我与身体发生碰撞并结束游戏(例如,如果我要离开,我击落然后再次离开,真的很快或者向下和向右很快,等等。)

我已经尝试了一些东西。我通过将其设为.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 :(得分:0)

您何时致电paintComponent?我怀疑你有一种方法可以定期向前移动蛇,但paintComponent负责使蛇更长。

你应该移动碰撞并将蛇移动到与蛇移动方向移动头部相同的方法。

否则,在一次移动更新中可能会多次调用paintComponent,这会导致数组中x和y的重复。