使矩形随机从屏幕上掉下来?

时间:2019-12-10 12:25:49

标签: java processing

我正在尝试制作游戏,几乎完成了代码。但是我不能使矩形随机从屏幕上掉下来。

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

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;
}

2 个答案:

答案 0 :(得分:3)

使用random生成随机的x坐标:

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

一旦汽车到达窗户底部,就重置护理的位置和速度:

void drawPlay() {

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

    // [...]

答案 1 :(得分:3)

目前,您的代码在游戏的每个“回合”中只有一个矩形从顶部落下。我不确定您是否想让多个区块掉落;我认为这将是一个很好的下一步。

现在,这是一个简单的技巧,它将使块每次都按照您的要求从随机位置掉落。

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

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();
  }

基本上,我们在这里正在检查先前的红色方块/汽车是否已从草图底部掉落。如果有的话,即红色方块的y坐标大于整个草图的高度,我们再次调用init()。这将重置所有内容,包括使随机化为真。随机化为真后,您之前添加的代码将为该块选择一个随机的起点,并且将再次掉落。

我希望您已经理解了我解释的所有内容-尽管我的代码可以解决您的问题,但最好的学习方法是尝试自己解决问题。签出Dan Shiffman's videos on YouTube。这些是开始处理Processing的一个很好的起点-希望您在跟随他的示例之后会更加自信地编写自己的代码:)