Processing 重力模拟失控

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

我目前正在制作一个以非常基本的重力模拟为特征的处理草图(基于丹尼尔·希夫曼(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;
  }
}
除了不同的启动速度和不同的窗口大小外,上述内容实际上与希夫曼书中的内容相同。在前两次弹跳中效果似乎不错,但在第三次弹跳中,球会卡在窗口底部


我甚至不知道从哪里开始调试它。有人能给你指点吗?

如果
y
仍然大于
height
,你的代码只会不断地翻转
速度
,而不会给球弹起的机会。当球处于或超过边界时,您希望球远离边界。

在(如果y>高度)块中将y设置为高度会有所帮助,但球永远不会“静止”(完成后坐在底线上)
希夫曼的示例5.9有两个问题,您可能就是从这里开始的:
1) y可以变得大于(高度+速度),这使得它看起来像是在地上砰砰地一声或疯狂地反弹
--与建议一致
2) 更新y的算法按错误的顺序进行操作,因此球永远不会静止 正确的顺序是:

  • 如果是“反弹”的时间
    • 否定速度,包括阻尼(*0.95)
    • 将y设置为“地面”的位置
  • 增加速度的重力
  • 将速度添加到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;
}

当它触底后,试着改变y,使其“在边界内”,当然,你是绝对正确的。我现在在拍我的额头。简单的
y=高度在反弹后执行此操作。