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

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++;
}

关键改动说明

  1. 移除draw()内的for循环,改用全局索引逐个处理数组元素,保证每帧只更新一次图形;
  2. 用frameRate()替代delay(),避免阻塞程序运行,更符合Processing的事件循环机制;
  3. 修正background()的颜色值范围,确保显示正确的背景色;
  4. 添加索引边界判断,避免数组越界,同时支持循环播放或单次播放。

这样修改后,程序就会按照数组的顺序,逐个显示每个元素对应的图形,屏幕也能正常更新啦!

内容的提问来源于stack exchange,提问作者Wilson Rey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:37:53