Processing:如何实现物体在特定时间帧内显示与隐藏?
在Processing中实现物体定时显示/隐藏的效果
看起来你想让门在随机的时间间隔里交替出现和消失,但当前代码有点小问题——你的display()函数每次都会绘制门,导致门其实一直处于显示状态,达不到“消失”的效果。我来帮你调整一下代码,实现真正的定时显隐:
首先,我们明确核心逻辑:
- 让门在一段随机帧内隐藏,然后在另一段随机帧内显示,循环往复
- 用
doorCounter来倒计时当前状态(隐藏或显示)的剩余帧数
修改后的完整代码
int doorCounter; // 用布尔变量跟踪门的当前状态:true=显示,false=隐藏 boolean doorVisible; void setup() { size(512, 348); // 初始化:先让门隐藏一段时间 resetDoorTimer(false); } void draw() { // 绘制背景避免帧残留(你可以换成自己的场景元素) background(135, 206, 235); doorCounter--; // 倒计时结束时切换状态并重置计时器 if (doorCounter <= 0) { doorVisible = !doorVisible; resetDoorTimer(doorVisible); } // 根据状态决定是否绘制门 if (doorVisible) { drawDoor(); } } // 重置计时器:根据显隐状态设置不同的随机帧范围 void resetDoorTimer(boolean isVisible) { if (isVisible) { // 门显示的时长:60-120帧(约1-2秒,按60帧/秒计算) doorCounter = (int)random(60, 120); } else { // 门隐藏的时长:180-480帧(约3-8秒) doorCounter = (int)random(180, 480); } } // 单独抽出门的绘制逻辑,代码更清晰易维护 void drawDoor() { fill(255); rect(420, 190, 55, 100); // 门的轮廓 rect(435, 210, 25, 25, 7); // 门的窗户 ellipse(435, 255, 8, 8); // 门把手 }
关键改动说明
- 新增
doorVisible变量跟踪状态,逻辑更直观 - 把绘制门的代码抽成独立函数,后续修改门的样式更方便
- 用
resetDoorTimer()分别控制显示/隐藏的随机时长,你可以根据需求调整帧范围(1秒≈60帧) - 加入
background()避免前一帧画面残留,解决门“残影”问题
如果你偏好更简洁的写法,也可以不用布尔变量,直接通过计数器阶段判断:
int doorCounter; // 枚举状态区分隐藏/显示阶段 enum DoorState { HIDDEN, VISIBLE } DoorState currentState; void setup() { size(512, 348); currentState = DoorState.HIDDEN; doorCounter = (int)random(180, 480); } void draw() { background(135, 206, 235); doorCounter--; if (doorCounter <= 0) { // 切换状态并重置对应时长 currentState = (currentState == DoorState.HIDDEN) ? DoorState.VISIBLE : DoorState.HIDDEN; doorCounter = currentState == DoorState.VISIBLE ? (int)random(60,120) : (int)random(180,480); } // 显示状态下绘制门 if (currentState == DoorState.VISIBLE) { fill(255); rect(420, 190, 55, 100); rect(435, 210, 25, 25, 7); ellipse(435, 255, 8, 8); } }
两种写法都能实现你要的定时显隐效果,选哪种全看你觉得哪个更易读~
内容的提问来源于stack exchange,提问作者Utsav
相关产品推荐
相关产品推荐

