Processing中Draw()函数调用时屏幕无法更新问题求助
嘿,我来帮你搞定这个Processing的小问题!
核心问题分析
你遇到的屏幕不更新的问题,根源在于你把遍历整个数组的for循环直接放进了draw()函数里。要知道,draw()本身就是Processing的主循环(默认每秒跑60帧),你在一帧里就把数组所有元素都处理完了,最后屏幕上只会显示数组最后一个元素对应的图形,自然看不到“逐个更新”的效果。而用随机数时,每次draw()只生成一个随机值,每帧更新一次,所以看起来正常。
另外还有个小细节:Processing的background()颜色参数范围是0(纯黑)到255(纯白),你写的500、1700会被自动截断成255,其实都是白色背景,这点也得调整。
修改后的代码示例
先在全局定义一个索引变量,用来逐个访问数组元素:
int currentIndex = 0; // 全局索引,控制每次处理数组中的一个元素
然后重写draw()函数:
void draw() { // 用frameRate控制帧率,替代delay,更符合Processing的运行逻辑 frameRate(2); // 每秒2帧,和你原来的delay(500)效果一致 // 检查索引是否超出数组范围,超出可以选择重置或停止 if (currentIndex >= totalData.size()) { currentIndex = 0; // 重置索引,循环播放数据 // noLoop(); // 如果只想播放一次就停止,解开这个注释 } // 获取当前索引对应的数组元素 record2 = totalData.getJSONObject(currentIndex); distance2 = int(record2.getString("field1")); // float distance2 = random(15, 25); // 测试用随机数,保留方便调试 println("distance2 is " + distance2); // 先清空画布,避免之前的图形残留 background(50); // 改成0-255之间的数值,这里用深灰 if (distance2 <= 20) { println("triangle"); triangle(30, 75, 58, 20, 86, 75); println("distance2 at if " + distance2); } else { println("ellipse"); ellipse(56, 46, 55, 55); println("distance at else is " + distance2); } println("distance2 at end " + distance2); // 索引递增,准备下一帧处理下一个元素 currentIndex++; }
关键改动说明
- 移除
draw()内的for循环,改用全局索引逐个处理数组元素,保证每帧只更新一次图形; - 用
frameRate()替代delay(),避免阻塞程序运行,更符合Processing的事件循环机制; - 修正
background()的颜色值范围,确保显示正确的背景色; - 添加索引边界判断,避免数组越界,同时支持循环播放或单次播放。
这样修改后,程序就会按照数组的顺序,逐个显示每个元素对应的图形,屏幕也能正常更新啦!
内容的提问来源于stack exchange,提问作者Wilson Rey
相关产品推荐
相关产品推荐

