processing collision test return 开头为false

processing collision test return false at the beginning

我正在为程序做碰撞测试,我试图将测试插入 draw(),我希望它显示“GameOver”并且不会有任何进一步的事件导致任何变化。

float x;
float y;
float w;
float h;

float xPed;
float yPed;
float yPedc;

float objectX;
float objectY;
float objectWidth;
float objectHeight;

float triangleWidth;
float triangleHeight;

float dia;
int speed = 2;

boolean gameOver;

int N_LANES = 1;

void setup() {

    size(1200, 400);
    background(255);

    x = width / 60;
    y = height / 40;
    w = width / 80;

    xPed = width / 2;

    triangleWidth = height / 4;

    triangleHeight = 2.5 * w;

    yPed = height - 3 * w;

    yPedc = 2.5 * w / 2;

    dia = w / 2;
    h = w / 2;

    objectX = x + 2 * w;

    objectY = y + 5 * h;

    objectWidth = 4 * w;

    objectHeight = 10 * h;

    gameOver = false;
}

void  draw() {

    //reset background
    background(255);
    line(0, height/4, width, height/4);
    
    vehicle();
    pedestrian();

    // collision detect
    if (gameOver == true) {

        textSize(100);
        fill(255, 0, 0);
        text("Game Over", width / 3, height / 2);

    }

}

void vehicle() {

    //moving vehicle
    x += speed;

    // reset vehicle
    noFill();

    if (x > width) {

        x = 0;

    } else if (x < 0) {
        x = width;
    }
    
    for (int i = 0; i < N_LANES; i++) {
        //head of vehicle
        fill(0, 194, 0, 50);
        rect(x, y, w, h);
        rect(x + 3 * w, y, w, h);
        rect(x, y + h, 4 * w, 4 *h);

        //eyes of vehicle
        fill(0);
        rect(x + w, 3 * y, w * 0.85, h);
        rect(x + 3 * w, 3 * y, w * 0.85, h);

        //body of vehicle
        fill(0, 240, 0, 80);
        rect(x + 1.5 * w, 6.3 * h, 1.5 * w, 3 *h );
        //left arm
        line(x + 1.5 *w, 6.3 * h, x + 0.5 * w, 7.3 * h);
        //right arm
        line(x + 3 * w, 6.3 * h, x + 4 * w, 7.3 * h);
        //left leg 
        line(x + 1.5 * w, 9.3 * h, x + w, 11.3 * h);
        //right leg
        line(x + 3 * w, 9.3 * h, x + 3.5 * w, 11.3 * h);

    }

}

// draw pedestrian
void pedestrian() {

    fill(255, 140, 0, 70);

    //body of pedestrian

    triangle(xPed, yPed, xPed - triangleWidth / 2, yPed + 2.5 * w, xPed + triangleWidth / 2, yPed + 2.5 * w);

    fill(0);

    circle(xPed + triangleWidth / 4, yPed, dia);

    circle(xPed - triangleWidth / 4, yPed, dia);

    fill(255, 165, 0);

    ellipse(xPed, yPed + w, 1.5 * dia, 3 * dia);
    
}

// arrow key moving
void keyPressed() {
    if (gameOver != true) {

        if (key == CODED) {

            if (keyCode == UP) {
                yPed -= height / 4;

                if (yPed <= 0) {
                    yPed = height - 3 * w;
                }
            }

            if (keyCode == DOWN) {
                yPed += height / 4;

                if (yPed > height) {
                    yPed = height - 3 * w;
                }
            }

            if (keyCode==LEFT) {
                xPed -= height / 4;
                if (xPed < 0 + triangleWidth / 2) {
                    xPed = width / 2;
                }
            }

            if (keyCode==RIGHT) {
                xPed += height / 4;

                if (xPed > width - triangleWidth / 2) {
                    xPed = width / 2;
                }

            }

        }

    }

}

boolean gameOver() {
    // optional visualise collision objects
    rect(objectX, objectY, objectWidth, objectHeight);
    rect(xPed, yPed, triangleWidth, triangleHeight);
    // x axis
    float distX = abs( (objectX + objectWidth / 2) - (xPed + triangleWidth / 2) );
    // y axis
    float distY = abs( (objectY + objectHeight / 2) - (yPedc + triangleHeight / 2) );
    // half combined x distance
    float combinedHalfWidth = ( (objectWidth / 2) + (triangleWidth / 2) );
    // half combined y distance
    float combinedHalfHeight = ( (objectHeight / 2) + (triangleHeight / 2) );
    
    // check collision
    if (distX < combinedHalfWidth) {
        if (distY < combinedHalfHeight) {
            return true;
        }
    }
    
    return false;

}

我试图将 gameOver 布尔值插入绘图中,它每次都 returns 相同的值。 只是想知道逻辑问题或编码问题是什么。

正如 Rabbid76 提到的,您应该首先正确格式化代码。

让我们假设代码是从带有代码片段的 pdf 中复制的,这就是格式混乱的原因。

该代码仍有一些明显的错误:

  • 令人困惑的是,您同时使用了布尔变量 gameOver 和布尔函数 gameOver(),并且变量并不总是更新。 (实际上 gameOver 仅在 setup() 中设置一次,而 gameOver() 实际进行碰撞检测 从未被调用 。我建议要么更新布尔变量,要么更简单,只需调用 gameOver() 来根据需要计算碰撞。这是您的代码无法按预期运行的原因之一。
  • 您正在检查两个对象之间的碰撞:车辆和行人。但是,有 3 组坐标:x, y, xPed, objectX, objectY。在绘图中渲染时,车辆使用 x,y,但是,在检查碰撞时,gameOver() 使用 objectX, objectY(不匹配且不更新)。这是碰撞未按预期运行的另一个原因。
  • 除了您提出的问题外,N_LANES 用于 for 循环,但从未声明过。即使我声明它,for 循环使用完全相同的 x,y 坐标,使 for 循环变得多余。

这是您的代码的格式化版本,带有额外的边界框,突出显示了碰撞函数正在检查的内容(并注释了一些未使用的变量):

float x;
float y;
float w;
float h;

float xPed;
float yPed;
//float yPedc;

float objectX;
float objectY;
float objectWidth;
float objectHeight;

float triangleWidth;
float triangleHeight;

float dia;
int speed = 2;

//boolean gameOver;

int N_LANES = 1;

void setup() {

    size(1200, 400);
    background(255);

    x = width / 60;
    y = height / 40;
    w = width / 80;

    xPed = width / 2;

    triangleWidth = height / 4;

    triangleHeight = 2.5 * w;

    yPed = height - 3 * w;

    //yPedc = 2.5 * w / 2;

    dia = w / 2;
    h = w / 2;

    objectX = x + 2 * w;

    objectY = y + 5 * h;

    objectWidth = 4 * w;

    objectHeight = 10 * h;

    //gameOver = false;
}

void  draw() {

    //reset background
    background(255);
    line(0, height/4, width, height/4);
    
    vehicle();
    pedestrian();

    // collision detect
    if (gameOver() == true) {

        textSize(100);
        fill(255, 0, 0);
        text("Game Over", width / 3, height / 2);

    }

}

void vehicle() {

    //moving vehicle
    x += speed;

    // reset vehicle
    noFill();

    if (x > width) {

        x = 0;

    } else if (x < 0) {
        x = width;
    }
    
    for (int i = 0; i < N_LANES; i++) {
        //head of vehicle
        fill(0, 194, 0, 50);
        rect(x, y, w, h);
        rect(x + 3 * w, y, w, h);
        rect(x, y + h, 4 * w, 4 *h);

        //eyes of vehicle
        fill(0);
        rect(x + w, 3 * y, w * 0.85, h);
        rect(x + 3 * w, 3 * y, w * 0.85, h);

        //body of vehicle
        fill(0, 240, 0, 80);
        rect(x + 1.5 * w, 6.3 * h, 1.5 * w, 3 *h );
        //left arm
        line(x + 1.5 *w, 6.3 * h, x + 0.5 * w, 7.3 * h);
        //right arm
        line(x + 3 * w, 6.3 * h, x + 4 * w, 7.3 * h);
        //left leg 
        line(x + 1.5 * w, 9.3 * h, x + w, 11.3 * h);
        //right leg
        line(x + 3 * w, 9.3 * h, x + 3.5 * w, 11.3 * h);

    }

}

// draw pedestrian
void pedestrian() {

    fill(255, 140, 0, 70);

    //body of pedestrian

    triangle(xPed, yPed, xPed - triangleWidth / 2, yPed + 2.5 * w, xPed + triangleWidth / 2, yPed + 2.5 * w);

    fill(0);

    circle(xPed + triangleWidth / 4, yPed, dia);

    circle(xPed - triangleWidth / 4, yPed, dia);

    fill(255, 165, 0);

    ellipse(xPed, yPed + w, 1.5 * dia, 3 * dia);
    
    // visualise bounding box
    //fill(255, 140, 0, 70);
    //rect(xPed - triangleWidth / 2, yPed, triangleWidth, triangleHeight);
}

// arrow key moving
void keyPressed() {
    if (gameOver() != true) {

        if (key == CODED) {

            if (keyCode == UP) {
                yPed -= height / 4;

                if (yPed <= 0) {
                    yPed = height - 3 * w;
                }
            }

            if (keyCode == DOWN) {
                yPed += height / 4;

                if (yPed > height) {
                    yPed = height - 3 * w;
                }
            }

            if (keyCode==LEFT) {
                xPed -= height / 4;
                if (xPed < 0 + triangleWidth / 2) {
                    xPed = width / 2;
                }
            }

            if (keyCode==RIGHT) {
                xPed += height / 4;

                if (xPed > width - triangleWidth / 2) {
                    xPed = width / 2;
                }

            }

        }

    }

}

boolean gameOver() {
    // optional visualise collision objects
    rect(objectX, objectY, objectWidth, objectHeight);
    rect(xPed, yPed, triangleWidth, triangleHeight);
    // x axis
    float distX = abs( (objectX + objectWidth / 2) - (xPed + triangleWidth / 2) );
    // y axis
    float distY = abs( (objectY + objectHeight / 2) - (yPed + triangleHeight / 2) );
    // half combined x distance
    float combinedHalfWidth = ( (objectWidth / 2) + (triangleWidth / 2) );
    // half combined y distance
    float combinedHalfHeight = ( (objectHeight / 2) + (triangleHeight / 2) );
    
    // check collision
    if (distX < combinedHalfWidth) {
        if (distY < combinedHalfHeight) {
            return true;
        }
    }
    
    return false;

}

这是应用了上面 3 个注意事项中的几个的代码版本,在一定程度上解决了碰撞和 gameOver 状态问题:

float x;
float y;
float w;
float h;

float xPed;
float yPed;

float objectWidth;
float objectHeight;

float triangleWidth;
float triangleHeight;

float dia;
int speed = 2;

void setup() {

    size(1200, 400);
    background(255);

    x = width / 60;
    y = height / 40;
    w = width / 80;

    xPed = width / 2;

    triangleWidth = height / 4;

    triangleHeight = 2.5 * w;

    yPed = height - 3 * w;

    dia = w / 2;
    h = w / 2;

    objectWidth = 4 * w;

    objectHeight = 10 * h;
}

void  draw() {

    //reset background
    background(255);
    line(0, height/4, width, height/4);
    
    vehicle();
    pedestrian();

    // collision detect
    if (gameOver()) {

        textSize(100);
        fill(255, 0, 0);
        text("Game Over", width / 3, height / 2);

    }

}

void vehicle() {

    //moving vehicle
    x += speed;

    // reset vehicle
    noFill();

    if (x > width) {

        x = 0;

    } else if (x < 0) {
        x = width;
    }
    
    //head of vehicle
    fill(0, 194, 0, 50);
    rect(x, y, w, h);
    rect(x + 3 * w, y, w, h);
    rect(x, y + h, 4 * w, 4 *h);

    //eyes of vehicle
    fill(0);
    rect(x + w, 3 * y, w * 0.85, h);
    rect(x + 3 * w, 3 * y, w * 0.85, h);

    //body of vehicle
    fill(0, 240, 0, 80);
    rect(x + 1.5 * w, 6.3 * h, 1.5 * w, 3 *h );
    //left arm
    line(x + 1.5 *w, 6.3 * h, x + 0.5 * w, 7.3 * h);
    //right arm
    line(x + 3 * w, 6.3 * h, x + 4 * w, 7.3 * h);
    //left leg 
    line(x + 1.5 * w, 9.3 * h, x + w, 11.3 * h);
    //right leg
    line(x + 3 * w, 9.3 * h, x + 3.5 * w, 11.3 * h);
}

// draw pedestrian
void pedestrian() {

    fill(255, 140, 0, 70);

    //body of pedestrian
    triangle(xPed, yPed, xPed - triangleWidth / 2, yPed + 2.5 * w, xPed + triangleWidth / 2, yPed + 2.5 * w);

    fill(0);

    circle(xPed + triangleWidth / 4, yPed, dia);

    circle(xPed - triangleWidth / 4, yPed, dia);

    fill(255, 165, 0);

    ellipse(xPed, yPed + w, 1.5 * dia, 3 * dia);
    
    // visualise bounding box
    //fill(255, 140, 0, 70);
    //rect(xPed - triangleWidth / 2, yPed, triangleWidth, triangleHeight);
}

// arrow key moving
void keyPressed() {
    if (!gameOver()) {

        if (key == CODED) {

            if (keyCode == UP) {
                yPed -= height / 4;

                if (yPed <= 0) {
                    yPed = height - 3 * w;
                }
            }

            if (keyCode == DOWN) {
                yPed += height / 4;

                if (yPed > height) {
                    yPed = height - 3 * w;
                }
            }

            if (keyCode==LEFT) {
                xPed -= height / 4;
                if (xPed < 0 + triangleWidth / 2) {
                    xPed = width / 2;
                }
            }

            if (keyCode==RIGHT) {
                xPed += height / 4;

                if (xPed > width - triangleWidth / 2) {
                    xPed = width / 2;
                }

            }

        }

    }

}

boolean gameOver() {
    // optional visualise collision objects
    rect(x, y, objectWidth, objectHeight);
    rect(xPed, yPed, triangleWidth, triangleHeight);
    // x axis
    float distX = abs( (x + objectWidth / 2) - (xPed + triangleWidth / 2) );
    // y axis
    float distY = abs( (y + objectHeight / 2) - (yPed + triangleHeight / 2) );
    // half combined x distance
    float combinedHalfWidth = ( (objectWidth / 2) + (triangleWidth / 2) );
    // half combined y distance
    float combinedHalfHeight = ( (objectHeight / 2) + (triangleHeight / 2) );
    
    // check collision
    if (distX < combinedHalfWidth) {
        if (distY < combinedHalfHeight) {
            return true;
        }
    }
    
    return false;

}

请注意,理想情况下,三角形边界框需要向左移动三角形宽度的一半。

我还想向您指出 java.awt.Rectangle,其中有一个可能有用的 intersects()

import java.awt.Rectangle;

float x;
float y;
float w;
float h;

float xPed;
float yPed;

float objectWidth;
float objectHeight;

float triangleWidth;
float triangleHeight;

float dia;
int speed = 2;

Rectangle vehicleBoundingBox;
Rectangle pedestrianBoundingBox;

void setup() {

    size(1200, 400);
    background(255);

    x = width / 60;
    y = height / 40;
    w = width / 80;

    xPed = width / 2;

    triangleWidth = height / 4;

    triangleHeight = 2.5 * w;

    yPed = height - 3 * w;

    dia = w / 2;
    h = w / 2;

    objectWidth = 4 * w;

    objectHeight = 10 * h;
    
    vehicleBoundingBox = new Rectangle((int)x, (int)y, (int)objectWidth, (int)objectHeight);
    pedestrianBoundingBox = new Rectangle((int)xPed, (int)yPed, (int)triangleWidth, (int)triangleHeight);
}

void  draw() {

    //reset background
    background(255);
    line(0, height/4, width, height/4);
    
    vehicle();
    pedestrian();

    // collision detect
    if (gameOver()) {

        textSize(100);
        fill(255, 0, 0);
        text("Game Over", width / 3, height / 2);

    }

}

void vehicle() {

    //moving vehicle
    x += speed;

    // reset vehicle
    noFill();

    if (x > width) {

        x = 0;

    } else if (x < 0) {
        x = width;
    }
    
    //head of vehicle
    fill(0, 194, 0, 50);
    rect(x, y, w, h);
    rect(x + 3 * w, y, w, h);
    rect(x, y + h, 4 * w, 4 *h);

    //eyes of vehicle
    fill(0);
    rect(x + w, 3 * y, w * 0.85, h);
    rect(x + 3 * w, 3 * y, w * 0.85, h);

    //body of vehicle
    fill(0, 240, 0, 80);
    rect(x + 1.5 * w, 6.3 * h, 1.5 * w, 3 *h );
    //left arm
    line(x + 1.5 *w, 6.3 * h, x + 0.5 * w, 7.3 * h);
    //right arm
    line(x + 3 * w, 6.3 * h, x + 4 * w, 7.3 * h);
    //left leg 
    line(x + 1.5 * w, 9.3 * h, x + w, 11.3 * h);
    //right leg
    line(x + 3 * w, 9.3 * h, x + 3.5 * w, 11.3 * h);
}

// draw pedestrian
void pedestrian() {

    fill(255, 140, 0, 70);

    //body of pedestrian
    triangle(xPed, yPed, xPed - triangleWidth / 2, yPed + 2.5 * w, xPed + triangleWidth / 2, yPed + 2.5 * w);

    fill(0);

    circle(xPed + triangleWidth / 4, yPed, dia);

    circle(xPed - triangleWidth / 4, yPed, dia);

    fill(255, 165, 0);

    ellipse(xPed, yPed + w, 1.5 * dia, 3 * dia);
}

// arrow key moving
void keyPressed() {
    if (!gameOver()) {

        if (key == CODED) {

            if (keyCode == UP) {
                yPed -= height / 4;

                if (yPed <= 0) {
                    yPed = height - 3 * w;
                }
            }

            if (keyCode == DOWN) {
                yPed += height / 4;

                if (yPed > height) {
                    yPed = height - 3 * w;
                }
            }

            if (keyCode==LEFT) {
                xPed -= height / 4;
                if (xPed < 0 + triangleWidth / 2) {
                    xPed = width / 2;
                }
            }

            if (keyCode==RIGHT) {
                xPed += height / 4;

                if (xPed > width - triangleWidth / 2) {
                    xPed = width / 2;
                }

            }

        }

    }

}

boolean gameOver(){
  // update bounding box positions
  vehicleBoundingBox.x = (int)x;
  vehicleBoundingBox.y = (int)y;
  
  pedestrianBoundingBox.x = (int)(xPed - triangleWidth / 2);
  pedestrianBoundingBox.y = (int)yPed;
  //optional: visualise boxes
  fill(255, 140, 0, 70);
  rect(pedestrianBoundingBox.x, pedestrianBoundingBox.y, pedestrianBoundingBox.width, pedestrianBoundingBox.height);
  rect(vehicleBoundingBox.x, vehicleBoundingBox.y, vehicleBoundingBox.width, vehicleBoundingBox.height);
  
  return vehicleBoundingBox.intersects(pedestrianBoundingBox);
}

//boolean gameOver() {
//    // optional visualise collision objects
//    rect(x, y, objectWidth, objectHeight);
//    rect(xPed, yPed, triangleWidth, triangleHeight);
//    // x axis
//    float distX = abs( (x + objectWidth / 2) - (xPed + triangleWidth / 2) );
//    // y axis
//    float distY = abs( (y + objectHeight / 2) - (yPed + triangleHeight / 2) );
//    // half combined x distance
//    float combinedHalfWidth = ( (objectWidth / 2) + (triangleWidth / 2) );
//    // half combined y distance
//    float combinedHalfHeight = ( (objectHeight / 2) + (triangleHeight / 2) );
    
//    // check collision
//    if (distX < combinedHalfWidth) {
//        if (distY < combinedHalfHeight) {
//            return true;
//        }
//    }
    
//    return false;

//}

void circle(float x, float y, float dia){
  ellipse(x, y, dia, dia);
}

切记,如果这是 assignment/homework,您可能无法使用 java.awt.Rectangle。说到这里,如果这是一项作业,您应该在问题中提及它。

更新

这是一个更新版本,可以更好地处理游戏结束状态。

float x;
float y;
float w;
float h;

float xPed;
float yPed;

float objectWidth;
float objectHeight;

float triangleWidth;
float triangleHeight;

float dia;
int speed = 2;
// defaults to false
boolean isGameOver;

void setup() {

  size(1200, 400);
  background(255);

  x = width / 60;
  y = height / 40;
  w = width / 80;

  xPed = width / 2;

  triangleWidth = height / 4;

  triangleHeight = 2.5 * w;

  yPed = height - 3 * w;

  dia = w / 2;
  h = w / 2;

  objectWidth = 4 * w;

  objectHeight = 10 * h;
}

void  draw() {
  //reset background
  background(255);
  line(0, height/4, width, height/4);

  
  if (isGameOver) {
    textSize(100);
    fill(255, 0, 0);
    text("Game Over", width / 3, height / 2);
  }else{
    // check colloisions only in game state and update game over state
    isGameOver = checkCollisions();
    vehicle();
    pedestrian();
  }
  
}

void vehicle() {

  //moving vehicle
  x += speed;

  // reset vehicle
  noFill();

  if (x > width) {

    x = 0;
  } else if (x < 0) {
    x = width;
  }

  //head of vehicle
  fill(0, 194, 0, 50);
  rect(x, y, w, h);
  rect(x + 3 * w, y, w, h);
  rect(x, y + h, 4 * w, 4 *h);

  //eyes of vehicle
  fill(0);
  rect(x + w, 3 * y, w * 0.85, h);
  rect(x + 3 * w, 3 * y, w * 0.85, h);

  //body of vehicle
  fill(0, 240, 0, 80);
  rect(x + 1.5 * w, 6.3 * h, 1.5 * w, 3 *h );
  //left arm
  line(x + 1.5 *w, 6.3 * h, x + 0.5 * w, 7.3 * h);
  //right arm
  line(x + 3 * w, 6.3 * h, x + 4 * w, 7.3 * h);
  //left leg 
  line(x + 1.5 * w, 9.3 * h, x + w, 11.3 * h);
  //right leg
  line(x + 3 * w, 9.3 * h, x + 3.5 * w, 11.3 * h);
}

// draw pedestrian
void pedestrian() {

  fill(255, 140, 0, 70);

  //body of pedestrian
  triangle(xPed, yPed, xPed - triangleWidth / 2, yPed + 2.5 * w, xPed + triangleWidth / 2, yPed + 2.5 * w);

  fill(0);

  circle(xPed + triangleWidth / 4, yPed, dia);

  circle(xPed - triangleWidth / 4, yPed, dia);

  fill(255, 165, 0);

  ellipse(xPed, yPed + w, 1.5 * dia, 3 * dia);

  // visualise bounding box
  //fill(255, 140, 0, 70);
  //rect(xPed - triangleWidth / 2, yPed, triangleWidth, triangleHeight);
}

// arrow key moving
void keyPressed() {
  if (isGameOver){
    // exit game over
    isGameOver = false;
    // lazy way to restart the game
    // normally you'd write & call a reset() function to reset player/vehicle positions, avodiing instant gameOver
    setup();
  } else {

    if (key == CODED) {

      if (keyCode == UP) {
        yPed -= height / 4;

        if (yPed <= 0) {
          yPed = height - 3 * w;
        }
      }

      if (keyCode == DOWN) {
        yPed += height / 4;

        if (yPed > height) {
          yPed = height - 3 * w;
        }
      }

      if (keyCode==LEFT) {
        xPed -= height / 4;
        if (xPed < 0 + triangleWidth / 2) {
          xPed = width / 2;
        }
      }

      if (keyCode==RIGHT) {
        xPed += height / 4;

        if (xPed > width - triangleWidth / 2) {
          xPed = width / 2;
        }
      }
    }
  }
}

boolean checkCollisions() {
  // optional visualise collision objects
  fill(255, 140, 0, 70);
  rect(x, y, objectWidth, objectHeight);
  rect(xPed - triangleWidth / 2, yPed, triangleWidth, triangleHeight);
  // x axis
  float distX = abs( (x + objectWidth / 2) - xPed );
  // y axis
  float distY = abs( (y + objectHeight / 2) - (yPed + triangleHeight / 2) );
  // half combined x distance
  float combinedHalfWidth = ( (objectWidth / 2) + (triangleWidth / 2) );
  // half combined y distance
  float combinedHalfHeight = ( (objectHeight / 2) + (triangleHeight / 2) );

  // check collision
  if (distX < combinedHalfWidth) {
    if (distY < combinedHalfHeight) {
      return true;
    }
  }

  return false;
}

主要变化是:

  • 重新引入了gameOver布尔值作为isGameOver,用于在两种状态之间切换
  • 已将 gameOver() 重命名为 checkCollisions() 以避免混淆。

在这种情况下,只有两个状态,布尔值就可以了。 在更改状态时重置游戏变量也很重要(例如重置 player/vehicle 位置等) 如果您的游戏可能需要更多状态,您可以使用整数和常量。 This answer 有一个演示代码片段。 如果需要多个状态,引入了OOP,也有演示代码。