我正在尝试制作游戏,几乎完成了代码。但是我不能使矩形随机从屏幕上掉下来。
我正在编写一款应该躲避其他汽车的汽车游戏。但是没有用。有人可以帮我吗?
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;
}
答案 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的一个很好的起点-希望您在跟随他的示例之后会更加自信地编写自己的代码:)