我非常简单的问题是:我将如何实施摩擦?我尝试的任何东西似乎都没有用。
哦,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";
}
答案 0 :(得分:1)
摩擦是与速度相反的力。如果你正在处理力量,重力或电场或火箭发动机或更神秘的东西,只需加上一个总力,一个计算为速度乘以某个系数。对于不同的效果,您可以获得幻想并使其幅度与平方或立方的速度成比例。然后像往常一样计算速度和位置。
如果你没有处理力和F = ma,而是使用仅基于速度的简单物理,这在视频游戏中很常见,你需要逐渐降低速度。对于每个时间步,计算new_velocity = 0.99 * current_velocity。使用任何系数给出适当的减速量。再一次,你可以得到幻想,并以某种方式参与速度平方来改变物体减速的感觉。
答案 1 :(得分:1)
考虑到具有constant normal force的两个表面之间的摩擦力,通常假设摩擦是恒定的力,这会使物体的速度线性减慢。其他摩擦力如空气阻力通常也具有线性和二次项。 如果你想在两个表面之间使用摩擦,你可以这样做:
if (vx > 0) vx += -friction / mass;
if (vx < 0) vx += friction / mass;
我还将质量加到F = m * a
来加速。如果还有其他力作用在物体上,那将会有点复杂,因为如果物体停止移动,它只会在剩余力超过摩擦力时再次开始移动。
顺便说一下,如果您想让数字更正确,可以在模拟中添加时间步长:vX += accelerationX * timeStep;
和x += vX * timeStep;
。
答案 2 :(得分:1)
我曾担任游戏 AI 工程师。这通常涉及制作游戏玩法和物理。我最近不得不自己回答这个问题。这就是我发现这个的原因。这是我的解决方案。我的问题可能与您的略有不同,但我面临的挑战是无论我使用什么帧率都让它工作。这是我的解决方案:
speed -= (speed * (1 - friction)) / fps;
摩擦力总是介于 0 和 1 之间的浮点数,1 表示没有摩擦力,而 0 基本上是无限摩擦力。这可确保与每秒帧数成比例地施加适量的摩擦。
答案 3 :(得分:0)
如果表面摩擦力的公式为u
,m
和g
Ff=umg
,那么F=ma
中的a = deltaV/s
也是一个常数。同样因为as=deltaV
意味着速度等于加速时间(deltaV
)。这意味着,如果Ff
相同,则v=0
对于每个时间间隔保持不变。速度变化仅在不移动时停止(deltaV
)。所以我认为最好的方法是检测它是否正在移动并应用常量v
(针对相反的方向),并在{{1}}达到零时不应用它。
答案 4 :(得分:-1)
摩擦是一种减慢你移动的物体的力量。所以你需要有一个像后台线程一样的东西,它不断地查看你所有物体的速度,然后慢慢地将每个速度减少到零。