我目前正在制作一个处理草图,其中包含一个非常基本的重力模拟(基于Daniel Schiffman的书“学习处理”中给出的一个例子),但我的引力仍然以奇怪的方式表现,我不知道是什么要做的。这是我能提出的最简单的例子:
float x = 50;
float y = 50;
float speed = 2;
float gravity = 0.1;
void setup() {
size(400, 400);
}
void draw() {
background(255);
fill(175);
stroke(0);
ellipseMode(CENTER);
ellipse(x, y, 10, 10);
y = y + speed;
speed = speed + gravity;
//Dampening bounce effect when the ball hits bottom
if (y > height) {
speed = speed * -0.95;
}
}
除了不同的起始速度和不同的窗口大小之外,上述几乎与Schiffman的书中的相同。它似乎在前两次反弹时工作正常,但在第三次反弹时,球会粘在窗户的底部。
我不知道在哪里开始尝试调试它。任何人都可以提供任何指示吗?
答案 0 :(得分:2)
如果y
仍然大于height
,那么您的代码只会一遍又一遍地翻转speed
,而不会让球有机会反弹。你希望球在边界处或越过边界时远离边界。
答案 1 :(得分:1)
在(如果y>高度)块中将y设置为高度有帮助,但球永远不会“休息”(完成后坐在底线上)。
Shiffman的例子5.9有两个问题,这是你可能开始的地方:
1)y可以变得大于(高度+速度),这使得它似乎在地面上砰的一声或猛烈地反弹
- 修改建议
2)更新y的算法以错误的顺序执行,因此球永远不会停下来
正确的顺序是:
这样,当它是时候反弹(y是>高度),速度是正向(向下)时:
速度设定为负(减少次数)
y设置为高度
速度因重力因子而设定为负值
通过加上(仍然是负的)速度使得y变得不那么正
在我的例子中,我不希望对象消失,因此我使用名为'limit'的变量作为对象中心的最低(最正y)位置。
float x = 50;
float y = 50;
float speed = 2;
float gravity = 0.1;
void setup() {
size(400, 400);
y = height - 20;
}
void draw() {
background(255);
fill(175);
stroke(0);
ellipseMode(CENTER);
ellipse(x, y, 10, 10);
float limit = height - (speed + 5);
//Dampening bounce effect when the ball hits bottom
if (y > limit) {
speed = speed * -0.95;
y = limit;
}
speed = speed + gravity;
y = y + speed;
}