1

我目前正在制作一个处理草图,其中包含一个非常基本的重力模拟(基于 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 书中的内容相同。前两次反弹似乎工作正常,但在第三次反弹时,球会卡在窗口底部。

我什至不知道从哪里开始尝试调试它。任何人都可以提供任何指示吗?

4

2 回答 2

2

如果y仍然大于height,则您的代码只会不断地反复翻转,speed而不会给球反弹的机会。您希望球在边界处或越过边界时远离边界。

于 2013-07-01T16:07:43.943 回答
1

在(如果 y > height)块中将 y 设置为 height 会有所帮助,但球永远不会“静止”(完成后坐在底线上)。
Shiffman 的示例 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;
}
于 2013-12-22T20:30:22.430 回答