我编写了一个相当简单的 Java 应用程序,它允许您拖动鼠标,并根据您所做的鼠标拖动长度,它会朝那个方向射一个球,并在它移动时从墙壁上反弹。
这是一个快速的屏幕截图:
alt text http://img222.imageshack.us/img222/3179/ballbouncemf9.png
屏幕上的每个圆圈都是一个 Ball 对象。球的运动被分解为一个 x 和 y 向量;
public class Ball {
public int xPos;
public int yPos;
public int xVector;
public int yVector;
public Ball(int xPos, int yPos, int xVector, int yVector) {
this.xPos = xPos;
this.yPos = yPos;
this.xVector = xVector;
this.yVector = yVector;
}
public void step()
{
posX += xVector;
posY += yVector;
checkCollisions();
}
public void checkCollisions()
{
// Check if we have collided with a wall
// If we have, take the negative of the appropriate vector
// Depending on which wall you hit
}
public void draw()
{
// draw our circle at it's position
}
}
这很好用。所有的球都从一堵墙反弹到另一堵墙。
但是,我已经决定我希望能够包括重力的影响。我知道物体以 9.8m/s 的速度向地球加速,但我不直接知道这应该如何转化为代码。我意识到 yVector 会受到影响,但我对此的实验并没有达到我想要的效果。
理想情况下,我希望能够为这个程序添加一些重力效果,并让球在落到“地面”之前反弹几次。
我怎样才能创建这种弹跳有弹性的重力效果?我必须如何在每一步操纵球的速度矢量?当它撞到“地面”时必须做什么,以便我可以让它再次弹起,但比上次短一些?
任何帮助都可以为我指明正确的方向。
谢谢大家的评论!它已经很好用了!
在我的 step() 中,我向我的 yVector 添加了一个重力常数,就像人们建议的那样,这是我的 checkCollision():
public void checkCollision()
{
if (posX - radius < 0) // Left Wall?
{
posX = radius; // Place ball against edge
xVector = -(xVector * friction);
}
else if (posX + radius > rightBound) // Right Wall?
{
posX = rightBound - radius; // Place ball against edge
xVector = -(xVector * friction);
}
// Same for posY and yVector here.
}
但是,球将继续在地板上滑动/滚动。我认为这是因为我只是在每次反弹时仅取其向量的百分比(90%),而且它永远不会真正为零。我是否应该添加一个检查,如果 xVector 变为某个绝对值,我应该将其更改为零?