让我的矩形随机从我的屏幕上掉下来?

Make my rectangle randomly fall down from my screen?

我正在尝试制作游戏,并且快完成代码了。但我不能让我的矩形随机从屏幕上掉下来。

我正在编写一个应该躲避其他汽车的汽车游戏。但是没有用。有人可以帮我吗?

int carx = 200;
int cary = 0;
float speedx = 0;
float speedy = 0;
float accy = 0.1;

color rod = color(255, 0, 0);
color vit = color(255);

final int START_STATE = 1;
final int PLAY_STATE = 2;
final int GAMEOVER_STATE = 3;
final int RESTART = 4;

int state = START_STATE;

void setup() {
  size(400, 700);
}

void draw() {
  switch (state) {
    case START_STATE:
      drawStart();
      break;
    case PLAY_STATE:
      drawPlay();
      break;
    case GAMEOVER_STATE:
      drawGameOver();
    case RESTART:
      drawrestart();
  }
}

void init() {
  carx = 200;
  cary = 0;
  speedx = 0;
  speedy = 0;
  accy = 0.1;
}

void drawStart() {
  background(0);
  textAlign(CENTER, CENTER);
  textSize(16);
  text("Click the mouse button to start the game", width / 2, height / 2);
  if (mousePressed) {
    state = PLAY_STATE;
  }
}

void drawGameOver() {
  textAlign(CENTER, CENTER);
  textSize(20);
  text("you have crashed your car", width / 2, height / 2);
  if (mousePressed) {
    state = PLAY_STATE;
    init();
  }
}

void drawrestart() {
  textAlign(CENTER, CENTER);
  textSize(15);
  text("press mouse to restart", 200, 400);
  if (keyPressed) {
    state = RESTART;
  }
}

void drawPlay() {
  background(0);

  if (get(carx, cary) == vit) {
    speedy = -1 * speedy;
  }
  fill(rod);

  rect(carx, cary, 50, 30);

  if (get(mouseX, 600) == color(255, 0, 0)) {
    state = GAMEOVER_STATE;
  }
  fill(#FFFFFF);
  rect(mouseX, 600, 30, 50);

  carx += speedx;
  cary += speedy;
  speedy += accy;
}

使用random生成随机x坐标:

carx = (int)random(0, width-50);

重新设置位置和速度,一旦小车到达底部window:

void drawPlay() {

    if (cary > height) {
        carx = (int)random(0, width-50);
        cary = 0;
        speedy = 0;
    }

    // [...]

你目前的代码只有一个矩形从游戏的每个 'round' 顶部掉落。我不确定你是否想让多个方块掉落;我认为这将是一个很好的下一步。

目前,这是一个简单的技巧,它会导致方块每次都从随机位置掉落,就像您所要求的那样。

在代码的开头,在函数之外,放置:

boolean randomise;

然后,在 void init() 中你应该添加:

randomise = true;

最后,将此部分添加到 drawPlay() 中,就在函数的开头:

if (randomise){
  carx = int(random(width-50));
  randomise = false;
}

请注意,只有在您再次将布尔值 'randomise' 设置为 true 时,才会生成新的随机 x 坐标。因此,如果您生成一个新的迭代,其中不止一个块落在 drawPlay() 函数中,您应该牢记这一点并相应地调整代码。

-------- [编辑] ------

嗨,很高兴这对您有所帮助。

实际上我注意到了另一个小问题,我会帮助您解决。

目前,您正在mouseX 上查看是否发生了碰撞。这(大多数情况下)有效,但如果玩家白色汽车的右侧驶过红色下落方块的左侧边缘,则游戏继续进行,就好像什么都没发生一样。应该发生的是游戏结束,因为检测到碰撞。您想知道这两个形状是否有任何部分重叠。

为此,您应该像这样更改代码。在 drawPlay() 中,替换:

if (get(mouseX, 600) == color(255, 0, 0)) {
    state = GAMEOVER_STATE;
  }

与:

  if (get(mouseX, 600) == color(255, 0, 0) || get(mouseX + 30, 600) == color(255, 0, 0)) {
    state = GAMEOVER_STATE;
  }

这是一个 OR 语句 - 检查玩家汽车的任何一侧是否发生碰撞。这样,每次撞到对方,游戏就结束了。

现在回答您的问题:如何添加多辆汽车?

您可以通过多种方式解决此问题,但我将向您展示最直接的方式。

在 drawPlay() 中,您想添加这个小 if 语句:

  if (cary > height){
    init();
  }

基本上我们在这里做的是检查之前的红色 block/car 是否已经从草图底部脱落。如果有,即如果红色块的 y 坐标大于整个草图的高度,我们再次调用 init()。这将重置所有内容,包括使 randomise 为真。一旦 randomise 为真,您之前添加的代码将 select 块的随机起点,并且它会再次掉落。

我希望您已经理解我所解释的一切 - 虽然我的代码可以解决您的问题,但最好的学习方法是尝试自己解决问题。查看 Dan Shiffman's videos on YouTube。这些是掌握 Processing 的一个很好的起点 - 希望您在遵循他的示例后会更有信心编写自己的代码:)