Processing中移动天花板瞬现瞬消问题求助
问题根源
- 清屏导致瞬间消失:
draw()函数里每次都执行background(255)清空画布,灰色天花板只在10秒触发间隔的那一帧被临时绘制,下一次draw执行清屏后就不再渲染它,所以看起来瞬间消失。 - 状态未持久化:你没有把天花板的下降状态存在
Ceiling类中,只是在触发间隔时临时画一次,没有保存当前应该显示的位置/高度,后续帧无法持续渲染。 - 重复逻辑与状态混乱:
Ceiling类内部和主函数各有一套10秒间隔判断,会导致重复触发;同时类内和主函数各有一个amount变量,数据不统一,进一步加剧状态混乱。
修正方案
1. 重构Ceiling类,维护自身状态
把天花板的下降偏移量作为类的属性,每次触发间隔时更新属性,draw方法根据属性持续绘制:
class Ceiling { float width, height, currentTime, intervalo; float ceilingY; // 记录灰色天花板的当前y坐标,初始在y=50位置 Ceiling(float width, float height) { this.width = width; this.height = height; this.currentTime = 0; this.intervalo = 10000; this.ceilingY = 50; // 初始位置 } void draw() { // 绘制固定的黑色边框 fill(0); noStroke(); rect(0, 0, 25, height); rect(width - 25, 0, 25, height); rect(0, 0, width, 50); stroke(NORMAL); // 持续绘制灰色天花板,用当前y坐标 fill(125, 125, 125); noStroke(); rect(0, ceilingY, width, 10); // 这里高度设为10,可根据需求调整 } // 触发下降的方法,只更新状态 void moveDown() { ceilingY += 100; // 每次下降100像素 } }
2. 修正主函数逻辑
去掉重复的状态变量和时间判断,触发间隔时仅更新Ceiling的状态,让类自身完成渲染:
import processing.sound.*; SoundFile music; Canon c1; Ceiling t1; float currentTime = 0; float intervalo = 10000; void setup() { size(550, 900); // Processing要求size放在background之前 background(255); music = new SoundFile(this,"Musicadojogo.mp3"); music.play(); c1 = new Canon(); t1 = new Ceiling(550, 900); } void draw() { background(255); t1.draw(); c1.draw(); // 10秒间隔触发天花板下降 if (millis() - currentTime >= intervalo) { currentTime = millis(); t1.moveDown(); // 仅更新状态,不直接绘制 // c1.move_balls_down(100); // 如果需要同步移动泡泡,取消注释并传对应偏移量 } println(mouseX,mouseY); } void keyPressed() { c1.keyPressed(); }
关键改动说明
- 把灰色天花板的绘制逻辑移到
Ceiling的draw方法中,每次draw都会执行,清屏后会重新渲染,不会消失。 - 用
ceilingY属性保存天花板的当前位置,触发间隔时仅更新这个值,状态持久化。 - 移除重复的时间判断和
amount变量,统一状态管理。 - 调整
setup中size和background的顺序,符合Processing语法要求。
内容的提问来源于stack exchange,提问作者Pirata8700
相关产品推荐
相关产品推荐

