java游戏物理摩擦
我非常简单的问题是:我将如何实现摩擦?我尝试的东西似乎都没用
哦,还有speedX
=1
这是我的代码:
public void update() {
x += velocityX;
}
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_RIGHT)
vx = xSpeed;
if (key == KeyEvent.VK_LEFT)
vx = -xSpeed;
}
public void KeyReleased(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_RIGHT)
vx = 0;
if (key == KeyEvent.VK_LEFT)
vx = 0;
}
编辑:
现在,一旦球员停下来,他就会减速(这很好),但他不会完全停下来
if (key == KeyEvent.VK_RIGHT) {
vx = 0.20 * vx;
if (vx < 0.2)
vx = 0;
playerAction = "still";
}
# 1 楼答案
我是一名游戏人工智能工程师。这通常涉及游戏性和物理性。我最近不得不自己回答这个问题。这就是我找到这个的原因。这是我的解决方案。我的问题可能和你的有点不同,但我的挑战是无论我使用什么帧速率都要让它工作。以下是我的解决方案:
摩擦力总是介于0和1之间的浮点数,1表示无摩擦力,0表示基本上无限摩擦力。这样可以确保施加的摩擦力与每秒帧数成比例
# 2 楼答案
如果表面摩擦力公式中的)。所以我认为最好的方法是检测它是否在移动,然后应用常数
u
、m
和g
inFf=umg
是常数,那么a inF=ma
也将是常数。也因为a = deltaV/s
这意味着速度等于加速度乘以时间(as=deltaV
)。这意味着,对于每个时间间隔,如果Ff
相同,则deltaV
保持不变。速度的变化只有在不移动时才会停止(^{deltaV
(对于相反的方向),当v
达到零时不应用它# 3 楼答案
考虑到两个具有constant normal force的表面之间的摩擦力,摩擦力通常被假定为恒力,这会线性降低物体的速度。其他摩擦力,如空气阻力,通常也有线性和二次项。 如果你想在两个表面之间使用摩擦力,你可以这样做:
我还包括了足够加速度的质量。如果还有其他力作用在物体上,它会稍微复杂一些,因为如果物体停止移动,只有当剩余的力超过摩擦力时,它才会再次开始移动
顺便说一句,如果你想让它更精确,你可以在模拟中添加一个时间步长:
vX += accelerationX * timeStep;
和x += vX * timeStep;