You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 12:54:02