Processing中循环内用if语句异常:第二行圆圈不显示且程序卡顿
问题分析与修复方案
嘿,我看到你遇到的问题了——第二行圆圈不显示还卡顿,核心问题出在for循环里的逻辑错误导致无限循环,还有绘制多行圆圈的思路不对。咱们一步步来理清楚:
为什么会卡顿?
你在for循环里写了if(ScoreX + i * 80 > width)时重置i=0,这直接导致循环永远停不下来:每次i刚要增加到触发条件的值,就被拉回0,永远满足不了i < counter的退出条件,程序自然就卡死了。
为什么第二行不显示?
就算没卡死,原来的逻辑也只会重复画第二行的第一个圆圈,没法根据counter的数量依次在第二行累加绘制,完全没处理“counter超过第一行容量后,后续的圆圈放到第二行”的逻辑。
修复后的代码
我调整了逻辑,先计算每行能放多少个圆圈,然后根据counter的数值,把每个圆圈分配到对应的行和列:
float BallY = 50; // y value of the ball float BallX = 260; // x value of the ball float ScoreX = 52; float ScoreY = 40; int counter; // 新增:定义每行最多能放的圆圈数量 int circlesPerRow; void setup() { size(512, 348); //width and height of screen counter = 0; // 自动计算每行可容纳的圆圈数,适配不同屏幕宽度 circlesPerRow = 0; while(ScoreX + circlesPerRow * 80 <= width) { circlesPerRow++; } } void draw() { frameRate(60); // 600帧太高没必要,改成60既流畅又省性能 background(255); fill(0); // 绘制下落的小球 ellipse(BallX, BallY, 15, 15); BallY++; // 小球超出屏幕时重置位置并计数 if (BallY > height) { BallY = 0; counter++; } // 绘制分数圆圈:按行分配 for (int k = 0; k < counter; k++) { // 计算当前圆圈所在的行和列 int row = k / circlesPerRow; int col = k % circlesPerRow; // 计算坐标:行间距40,第一行40,第二行80以此类推 float circleX = ScoreX + col * 80; float circleY = ScoreY + row * 40; // 绘制圆圈 ellipse(circleX, circleY, 40, 40); } }
关键修改点
- 移除循环内重置i的逻辑:彻底解决无限循环问题,改用数学计算分配行和列,这是最核心的修复。
- 自动计算每行容量:新增
circlesPerRow变量,不用硬编码数值,能适配不同屏幕宽度。 - 优化帧率:从600降到60,避免不必要的性能浪费。
- 多行分配逻辑:用
k / circlesPerRow计算行号,k % circlesPerRow计算列号,counter每增加1,就会依次在当前行的下一列、下一行的第一列绘制圆圈,完全符合你的需求。
这样修改后,程序就不会卡顿,而且当第一行圆圈满了之后,会自动在第二行开始绘制,完美解决你的问题~
内容的提问来源于stack exchange,提问作者Utsav
相关产品推荐
相关产品推荐

