Processing 3(Java)中数组元素未正常使用问题排查
问题分析与解决方案
嘿,我仔细瞅了你的代码,发现你说的“最后一个矩形在(0,0)”其实是个小误会——真正没被正确赋值的是第一个数组元素(rx[0], ry[0]),你大概率是把它当成了最后一个索引19的矩形。核心问题出在循环的执行顺序和条件上:
具体问题
- 循环顺序搞反了:你现在是先执行
i++再给数组赋值,初始i=0时,第一次进入if(i<19)后直接把i变成1,所以第一个被赋值的是rx[1]和ry[1],而rx[0]和ry[0]始终保持int数组的默认值0,导致第一个矩形显示在(0,0)。 - 循环条件不匹配需求:你需要生成20个矩形,但
i<19的条件只能让循环执行19次(从i=0到i=18),虽然最后会给rx[19]赋值,但总共只生成了19个有效坐标,加上未初始化的rx[0]才凑够20个,第一个完全是无效的默认值。
修复方案
调整循环逻辑,先赋值再递增i,同时把循环条件改成i<20,确保20个数组元素(索引0到19)都能被正确赋值。另外,你可以用一个循环代替重复写20次rect(),让代码清爽很多。
修改后的完整代码
int gx = 400; int gy = 400; int gDir; int gCheckX; int gCheckY; int[] rx = new int[20]; int[] ry = new int[20]; int i = 0; void setup() { size(700, 700); } void draw() { fill(0); rect(0, 0, width, height); fill(#696969); if(i < 20) { // 先处理方向与碰撞检测 gDir = int(random(1, 5)); if(gDir == 1) { gCheckX = 25; gCheckY = -25; } if(gDir == 2) { gCheckX = 25; gCheckY = 75; } if(gDir == 3) { gCheckX = -25; gCheckY = 25; } if(gDir == 4) { gCheckX = 75; gCheckY = 25; } while(get(gCheckX, gCheckY) == color(105, 105, 105)) { gDir = int(random(1, 5)); if(gDir == 1) { gCheckX = 25; gCheckY = -25; } if(gDir == 2) { gCheckX = 25; gCheckY = 75; } if(gDir == 3) { gCheckX = -25; gCheckY = 25; } if(gDir == 4) { gCheckX = 75; gCheckY = 25; } } // 更新当前坐标 if(gDir == 1) {gy -= 50;} if(gDir == 2) {gy += 50;} if(gDir == 3) {gx -= 50;} if(gDir == 4) {gx += 50;} // 先给当前索引赋值 rx[i] = gx; ry[i] = gy; println(rx[i] + " " + ry[i]); // 最后递增索引 i++; } else { // 用循环简化绘制,不用写20次rect for(int j = 0; j < 20; j++){ rect(rx[j], ry[j], 50, 50); } // 绘制完成后停止循环,避免重复渲染 noLoop(); } }
额外小优化
- 加入
noLoop()可以在绘制完地牢后停止draw()循环,不用每帧都重复画一遍,节省资源。 - 后续可以把方向判断的逻辑封装成一个函数,减少代码重复,让结构更清晰。
内容的提问来源于stack exchange,提问作者Char Gamer
相关产品推荐
相关产品推荐

