Java打砖块游戏开发问题:如何实现砖块碰撞后消失?
解决打砖块游戏中砖块碰撞后不消失的问题
嘿,我明白你现在遇到的问题了——小球碰到砖块能反弹,但砖块就是不消失对吧?核心问题在于你当前的draw_Brick()函数每次运行时都会重新绘制所有砖块,没有记录哪些砖块已经被小球撞掉了。你尝试修改g和h的方法没用,是因为每次循环里你又把它们重新赋值为85和25了,相当于白改。
既然你还没用到类,我们可以用一个二维boolean数组来记录每个砖块的“存活状态”——true表示砖块还在,false表示已经被撞掉。下面是具体的修改步骤和完整代码:
步骤1:添加全局状态数组
首先在全局变量区添加一个二维boolean数组,用来记录3x3网格里每个砖块是否存活:
int movementX, movementY; int x, y; int w, z; // 新增:记录砖块存活状态的二维数组 boolean[][] bricksAlive;
步骤2:初始化砖块状态
在setup()函数里初始化这个数组,把所有砖块都设为“存活”(true):
void setup() { size(600, 600); background(0); x = 200; y = 300; movementX = -3; movementY = 6; w = 280; z = 400; // 初始化3行3列的砖块状态,全部设为true(存活) bricksAlive = new boolean[3][3]; for(int n=0; n<3; n++){ for(int m=0; m<3; m++){ bricksAlive[n][m] = true; } } }
步骤3:修改draw_Brick()函数
修改这个函数,只绘制“存活”的砖块,并且在小球碰撞到存活的砖块时,标记该砖块为“死亡”(false):
void draw_Brick() { for (int n = 0; n < 3; n = n + 1) { for (int m = 0; m < 3; m = m + 1) { // 只有砖块存活时才处理绘制和碰撞 if(bricksAlive[n][m]){ int b=m*250; int v=n*70; int g=85; int h=25; fill(255, 0, 0); rect(b, v, g, h); // 碰撞检测:只有存活的砖块才触发反弹和消失 if (y<v+25 && y>v && x<b+85 && x>b) { movementY = -movementY; // 标记该砖块为死亡,下次就不会再绘制了 bricksAlive[n][m] = false; } } } } }
完整修改后的代码
int movementX, movementY; int x, y; int w, z; boolean[][] bricksAlive; void setup() { size(600, 600); background(0); x = 200; y = 300; movementX = -3; movementY = 6; w = 280; z = 400; bricksAlive = new boolean[3][3]; for(int n=0; n<3; n++){ for(int m=0; m<3; m++){ bricksAlive[n][m] = true; } } } void draw() { Clear(); movement(); pounding(); dessiner(); draw_Brick(); } void Clear() { background(0); } void dessiner() { smooth(); fill(255); rect(w, z, 85, 25); fill(255, 0, 0); ellipse(x, y, 20, 20); fill(255); text("movementX: "+movementX, 480, 570); text("movementY: "+movementY, 480, 583); } void movement() { x = x + movementX; y = y + movementY; w = (mouseX); } void draw_Brick() { for (int n = 0; n < 3; n = n + 1) { for (int m = 0; m < 3; m = m + 1) { if(bricksAlive[n][m]){ int b=m*250; int v=n*70; int g=85; int h=25; fill(255, 0, 0); rect(b, v, g, h); if (y<v+25 && y>v && x<b+85 && x>b) { movementY = -movementY; bricksAlive[n][m] = false; } } } } } void pounding() { // 若位置过右且水平移动量为正 if (x > width-10 && movementX > 0) { movementX = -movementX; // 反转数值 } // 若位置过低且垂直移动量为正 if (y > width-10 && movementY > 0) { movementY = -movementY; // 转为负值 } // 若位置过高且垂直移动量为负 if (y < 10 && movementY < 0) { movementY = abs(movementY); // 转为正值 } // 与挡板碰撞 if (y<z+25 && y>z && x<w+85 && x>w) { movementY = -movementY; // 反转数值 } if (x < 10 && movementX < 0) { movementX = -movementX; } }
额外小优化
我还帮你修正了pounding()函数里的两个小bug:
- 原来的
if (y < 10 && movementY < 10)条件不对,应该是movementY < 0(只有当小球向上飞的时候才反弹) - 同理
if (x < 10 && movementX < 10)改成movementX < 0,避免不必要的反弹触发
这样修改后,小球碰到砖块不仅会反弹,对应的砖块也会消失,不会再被绘制出来啦!
内容的提问来源于stack exchange,提问作者batchoki
相关产品推荐
相关产品推荐

