长方体障碍物从上下两端向中间生长,在中间形成一条弯曲的通路,鼠标控制小球穿过通路,如果碰到障碍物游戏失败
时间: 2023-12-03 13:05:25 浏览: 62
好的,那么我们需要对原有代码进行大幅修改。你可以先尝试着自己修改一下,如果有问题再来问我。以下是我修改后的代码:
```
ArrayList<Obstacle> obstacles = new ArrayList<Obstacle>();
float obstacle_speed = 3;
float obstacle_gap = 100;
float obstacle_min_height = 50;
float obstacle_max_height = 300;
float obstacle_min_width = 20;
float obstacle_max_width = 30;
float curve_height = 150; // 弯曲通道的高度
float curve_width = 300; // 弯曲通道的宽度
float curve_center = 250; // 弯曲通道的中心点
float ball_radius = 10; // 球的半径
float ball_y; // 球的纵坐标
float ball_speed = 5; // 球的移动速度
float ball_acceleration = 0.5; // 球的加速度
class Obstacle {
float x, y, width, height, speed;
Obstacle(float x_, float y_, float w_, float h_, float s_) {
x = x_;
y = y_;
width = w_;
height = h_;
speed = s_;
}
void update() {
x -= speed;
}
void draw() {
rect(x, y, width, height);
}
}
void setup() {
size(1000, 500);
colorMode(HSB);
rectMode(CORNER);
noStroke();
generateObstacle();
ball_y = height / 2; // 初始化球的位置为屏幕中央
}
void draw() {
background(#635C81);
// 绘制弯曲通道
fill(#FFFFFF);
rect(curve_center - curve_width / 2, 0, curve_width, curve_height);
rect(curve_center - curve_width / 2, height - curve_height, curve_width, curve_height);
// 更新和绘制障碍物
for (Obstacle o : obstacles) {
o.update();
o.draw();
}
// 删除超出屏幕的障碍物
if (obstacles.size() > 0 && obstacles.get(0).x + obstacles.get(0).width < 0) {
obstacles.remove(0);
}
// 生成新的障碍物
if (obstacles.size() == 0 || obstacles.get(obstacles.size()-1).x + obstacles.get(obstacles.size()-1).width < width - obstacle_gap) {
generateObstacle();
}
// 更新球的位置
ball_speed += ball_acceleration;
ball_y += ball_speed;
// 绘制球
fill(#FF0000);
ellipse(curve_center, ball_y, ball_radius*2, ball_radius*2);
// 判断球是否碰到障碍物
for (Obstacle o : obstacles) {
if (ball_y - ball_radius < o.y + o.height && ball_y + ball_radius > o.y) {
if (ball_speed > 0 && ball_y - ball_radius < o.y) {
ball_speed = 0;
ball_acceleration = 0;
gameOver();
} else if (ball_speed < 0 && ball_y + ball_radius > o.y + o.height) {
ball_speed = 0;
ball_acceleration = 0;
gameOver();
}
}
}
}
void generateObstacle() {
float obstacle_height = random(obstacle_min_height, obstacle_max_height);
float obstacle_width = random(obstacle_min_width, obstacle_max_width);
float gap = random(50, 150); // 障碍物上下之间的间隔
float obstacle_y1 = random(0, curve_height - obstacle_height - gap); // 上方障碍物的纵坐标
float obstacle_y2 = obstacle_y1 + obstacle_height + gap; // 下方障碍物的纵坐标
float obstacle_x = width;
obstacles.add(new Obstacle(obstacle_x, obstacle_y1, obstacle_width, obstacle_height, obstacle_speed));
obstacles.add(new Obstacle(obstacle_x, obstacle_y2 + curve_height, obstacle_width, height - obstacle_y2 - curve_height, obstacle_speed));
}
void gameOver() {
textSize(60);
fill(#FFFFFF);
textAlign(CENTER, CENTER);
text("Game Over", width/2, height/2);
noLoop(); // 停止游戏循环
}
void mousePressed() {
ball_speed = -10; // 鼠标点击后球向上运动
ball_acceleration = 0.5; // 重置球的加速度
}
```
这份代码添加了一些新的变量,如弯曲通道的高度和宽度、球的半径和速度等。在 setup 函数中初始化了球的初始位置为屏幕中央。在 draw 函数中绘制了弯曲通道,并根据鼠标点击事件更新球的位置,同时判断球是否碰到了障碍物,如果碰到了就游戏结束。在 generateObstacle 函数中生成了上下两个障碍物,并保证它们之间有足够的间隔。在 gameOver 函数中绘制了游戏结束的提示,同时停止游戏循环。
阅读全文