Processing中如何用for循环替代条件判断实现球落地时逐次生成矩形?
解决小球落底逐次生成矩形的问题
我懂你想要的效果:小球每次掉出屏幕底部后,不是单纯重置位置,而是在屏幕左上角逐个生成相邻的矩形,而不是程序一启动就冒出一整排。你之前用嵌套for循环的问题在于,draw()函数每帧都会执行一次,那两个循环会一次性把所有矩形都画完,自然达不到逐次生成的效果。
咱们换个思路,用一个计数器来记录已经生成了多少个矩形,每次小球落地时只让计数器加1,然后根据计数器的数值来画对应数量的矩形就行。下面是完整的实现代码:
// 小球相关变量 float ballX = 260; float ballY = 50; float ballSpeed = 1; // 矩形相关变量 int rectSize = 20; int rectSpacing = 40; int rectCount = 0; // 记录已生成的矩形数量 void setup() { size(512, 348); } void draw() { background(255); // 绘制并更新小球位置 fill(0); ellipse(ballX, ballY, 15, 15); ballY += ballSpeed; // 判断小球是否触底 if (ballY > height) { ballY = 0; // 重置小球位置 rectCount++; // 每落地一次,矩形数量加1 } // 根据已生成的数量绘制矩形 fill(100); // 用灰色区分小球和矩形 for (int i = 0; i < rectCount; i++) { float rectX = i * rectSpacing; // 确保矩形不超出屏幕宽度 if (rectX + rectSize <= width) { rect(rectX, 20, rectSize, rectSize); } } }
代码解释:
- 新增了
rectCount计数器,初始为0,每次小球掉出屏幕底部时,这个计数器就加1 - 在
draw()里,我们用一个for循环,根据rectCount的值来画对应数量的矩形,每个矩形的X坐标是i * rectSpacing,这样它们会从左到右依次排列,间距40 - 加了一个判断
rectX + rectSize <= width,防止矩形超出屏幕右侧边界 - 给矩形用了灰色填充,方便和黑色小球区分开
这样运行起来,小球每落地一次,左上角就会多一个矩形,完全符合你想要的逐次生成的效果啦。
内容的提问来源于stack exchange,提问作者Utsav
相关产品推荐
相关产品推荐

