Processing太空游戏开发:击中月球后获胜文本无法常驻屏幕求助
问题解决方案:Processing太空游戏获胜文本闪现问题
问题原因
Processing的draw()函数每秒执行约60次,每次执行第一行都会调用background(0)清空整个画布。你当前的代码仅在子弹与月球距离<30的那一帧会调用displayText()渲染文本,一旦xMoon被移动到-width位置后,子弹和月球的距离就会远大于30,后续帧不会再调用displayText(),所以文本只会闪现一瞬间。
修复方案
1. 新增全局获胜状态变量
在全局变量定义区域新增一个状态标记,记录玩家是否已经获胜:
boolean isWin = false; // 新增全局变量,默认未获胜
2. 修改draw()函数逻辑
优先判断获胜状态,只要获胜就持续渲染文本,跳过游戏运行逻辑:
void draw(){ background(0); // 获胜状态下直接显示文本,不执行后续游戏逻辑 if (isWin) { displayText(); return; } // 原有游戏逻辑全部放在这行之后 circle(xBullet,yBullet,10); //gun if(keyPressed && key == ' '){ gunShoots=true; } if (gunShoots == true){ xBullet = xBullet + 5; //gunshoots } if (xBullet > width){ gunShoots = false; } if (gunShoots == false){ xBullet = xPlayer +25; //gun resets yBullet = yPlayer +30; } if((key =='a') || (key=='d') || (keyPressed == false) || (key == ' ')){ //spaceship stays drawPlayer(xPlayer,yPlayer); } else if((key == 'w')||(key == 's')){ //spaceship tilted drawPlayertilted(xPlayer, yPlayer); } if(dist(xBullet, yBullet, xMoon, yMoon) > 30){ drawMoon = true; } if (drawMoon == true){ drawMoon(xMoon,yMoon); xMoon = xMoon - 1; } // 击中判定逻辑修改 if(dist(xBullet, yBullet, xMoon, yMoon) < 30){ drawMoon = false; xMoon = -width; isWin = true; // 触发获胜状态 } }
修改后只要触发一次击中,isWin就会永久保持为true,每帧都会渲染获胜文本,不会再出现闪现问题。
代码优化建议
- 修复初始变量问题:当前
setup()中没有初始化xPlayer和yPlayer,飞船初始默认在左上角,建议添加初始位置设置,比如xPlayer = width/2; yPlayer = height/2; - 增加飞船边界检测:添加判断逻辑限制
xPlayer、yPlayer的取值范围,避免飞船飞出屏幕外 - 常量拆分:把月球半径、子弹半径、击中判定阈值等固定数值定义为
final常量,后续修改参数时不需要多处查找替换 - 增加重新开始逻辑:可以在获胜状态下检测键盘输入,比如按R键重置所有游戏变量、
isWin设为false,支持多轮游玩 - 子弹逻辑优化:当前仅支持单颗子弹发射,如果需要支持多子弹可以用
ArrayList存储所有子弹的坐标,遍历更新每颗子弹的位置和击中判定
内容的提问来源于stack exchange,提问作者Thanh Phuong Pham
相关产品推荐
相关产品推荐

