Processing 3.3.7中draw()循环停止问题技术求助
嘿,我找到你代码里的问题根源啦!
问题核心:死循环阻塞Processing渲染流程
你的程序在速度为0时停止运行,本质是**moveX()和moveY()里的for循环变成了无限死循环**,直接卡住了Processing的draw()循环,导致n变量再也不会递增。
咱们来看具体代码:
比如moveX()里的循环逻辑:
for(float i = 0; i <= abs(this.xSpeed); i += abs(this.xSpeed) / 10) { this.bounceX(); this.xPosition += this.xSpeed / 10; }
当xSpeed等于0时,abs(this.xSpeed)就是0。这时候循环的初始条件i <= 0满足(i初始是0),但每次循环的增量是0/10=0——i永远保持0,循环永远不会退出!
draw()函数一旦卡在这个死循环里,就没法继续执行后续的代码,Processing的渲染循环也就停摆了,看起来就像程序“停止运行”一样。同样的逻辑也会出现在ySpeed被加速度降到0的时候。
两种可行的解决方案
方案1:添加速度非零判断,避免进入无效循环
修改moveX()和moveY(),只有当速度绝对值大于0时才执行细分移动的循环:
修改后的moveX():
private void moveX() { if (abs(this.xSpeed) > 0) { float stepIncrement = abs(this.xSpeed) / 10; for(float i = 0; i <= abs(this.xSpeed); i += stepIncrement) { this.bounceX(); this.xPosition += this.xSpeed / 10; } } }
修改后的moveY():
private void moveY() { if (abs(this.ySpeed) > 0) { float stepIncrement = abs(this.ySpeed) / 10; for(float i = 0; i <= abs(this.ySpeed); i += stepIncrement) { this.bounceY(); this.yPosition += this.ySpeed / 10; } } this.ySpeed += this.yAcceleration; }
方案2:固定循环步数,简化逻辑更可靠
你原来的循环是想把一次移动拆成10个小步处理碰撞,不如直接固定循环10次,不管速度是否为0——当速度为0时,每一步的位移也是0,不会有问题,还能避免死循环:
优化后的moveX():
private void moveX() { final int STEPS = 10; float xStep = this.xSpeed / STEPS; for(int i = 0; i < STEPS; i++) { this.bounceX(); this.xPosition += xStep; } }
优化后的moveY():
private void moveY() { final int STEPS = 10; float yStep = this.ySpeed / STEPS; for(int i = 0; i < STEPS; i++) { this.bounceY(); this.yPosition += yStep; } this.ySpeed += this.yAcceleration; }
额外小提示
第二种方案不仅解决了死循环问题,代码逻辑也更清晰,后续维护起来更方便。你可以根据自己的习惯选择其中一种,两种都能让程序在速度为0时正常运行。
内容的提问来源于stack exchange,提问作者Fabio Luis
相关产品推荐
相关产品推荐

