gpt4 book ai didi

language-agnostic - 如何将重力应用于我的弹跳球应用程序?

转载 作者:行者123 更新时间:2023-12-04 01:27:26 24 4
gpt4 key购买 nike

我编写了一个相当简单的 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 变成某个绝对值,我应该将其更改为零吗?

最佳答案

您需要做的是不断地从您的 yVector 中减去一个小常数(代表您的 9.8 m/s 的值)。当球下降时(yVector 已经是负值),这会使它走得更快。当它上升(yVector 为正)时,它会减慢速度。

这不会考虑摩擦,所以事情应该永远反弹。

编辑1:
考虑到摩擦,每当它反转(并且您反转符号)时,请稍微降低绝对数字。就像它在 yVector=-500 处命中一样,当您反转符号时,将其设为 +480 而不是 +500。您可能应该对 xVector 做同样的事情来阻止它左右弹跳。

编辑2:
此外,如果您希望它对“空气摩擦”使用react,请在每次调整时减少两个向量。

编辑3:
关于永远在底部滚动的东西——取决于你的数字有多高,它可能是两件事之一。要么你的数字很大,似乎需要很长时间才能完成,要么你在四舍五入,你的向量总是 5 或什么。 (5 的 90% 是 4.5,所以它可以四舍五入为 5)。

我会打印出调试语句并查看矢量编号是什么样的。如果它们转到 5 附近的某个位置并停留在那里,那么您可以使用将分数截断为 4 而不是四舍五入为 5 的函数。如果它继续下降并最终停止,那么您可能必须提高摩擦系数.

如果你找不到一个简单的“舍入”函数,你可以使用 (0.9 * Vector) - 1,从你现有的方程中减去 1 应该做同样的事情。

关于language-agnostic - 如何将重力应用于我的弹跳球应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/342189/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com