我编写了一个相当简单的java应用程序,它允许您拖动鼠标,并根据您拖动鼠标的长度,它会朝那个方向射出一个球,并在球移动时从墙壁上弹起。
这是一个快速截图:
替代文本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添加了一个重力常数,这是我的检查Collision():
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 变为某个绝对值,我应该将其更改为零?