Processing 重力模拟失控
我目前正在制作一个以非常基本的重力模拟为特征的处理草图(基于丹尼尔·希夫曼(Daniel Schiffman)在《学习处理》一书中给出的一个例子),但我的重力一直以一种奇怪的方式运行,我不知道该怎么办。下面是我能想到的最简单的例子:Processing 重力模拟失控,processing,Processing,我目前正在制作一个以非常基本的重力模拟为特征的处理草图(基于丹尼尔·希夫曼(Daniel Schiffman)在《学习处理》一书中给出的一个例子),但我的重力一直以一种奇怪的方式运行,我不知道该怎么办。下面是我能想到的最简单的例子: float x = 50; float y = 50; float speed = 2; float gravity = 0.1; void setup() { size(400, 400); } void draw() { background(25
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;
}
}
除了不同的启动速度和不同的窗口大小外,上述内容实际上与希夫曼书中的内容相同。在前两次弹跳中效果似乎不错,但在第三次弹跳中,球会卡在窗口底部
我甚至不知道从哪里开始调试它。有人能给你指点吗?如果
y
仍然大于height
,你的代码只会不断地翻转速度
,而不会给球弹起的机会。当球处于或超过边界时,您希望球远离边界。在(如果y>高度)块中将y设置为高度会有所帮助,但球永远不会“静止”(完成后坐在底线上)希夫曼的示例5.9有两个问题,您可能就是从这里开始的:
1) y可以变得大于(高度+速度),这使得它看起来像是在地上砰砰地一声或疯狂地反弹
--与建议一致
2) 更新y的算法按错误的顺序进行操作,因此球永远不会静止 正确的顺序是:
- 如果是“反弹”的时间
- 否定速度,包括阻尼(*0.95)
- 将y设置为“地面”的位置
- 否定速度,包括阻尼(*0.95)
- 增加速度的重力
- 将速度添加到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;
}
当它触底后,试着改变y,使其“在边界内”,当然,你是绝对正确的。我现在在拍我的额头。简单的
y=高度代码>在反弹后执行此操作。