0

我非常简单的问题是:我将如何实施摩擦?我尝试的任何方法似乎都不起作用。

哦,还有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";
    }
4

5 回答 5

1

摩擦力是与速度相反的力。如果你正在处理力,重力或电场或火箭发动机或更神秘的东西,只需将总力加一,计算为速度乘以某个系数。您可以花哨并使其大小与速度的平方或立方成正比,以获得不同的效果。然后像往常一样计算速度和位置。

如果您不处理力和 F=ma,而是使用仅基于速度的更简单的物理类型(这在视频游戏中很常见),则需要逐渐降低该速度。对于每个时间步,计算 new_velocity = 0.99 * current_velocity。使用任何可以提供适当减速的系数。同样,您可以花哨并以某种方式将速度平方来改变物体减速的感觉。

于 2013-04-13T16:56:46.950 回答
1

考虑到具有恒定法向力的两个表面之间的摩擦力,通常假定摩擦力是恒定力,这会线性减慢物体的速度。其他摩擦力(如空气阻力)通常也具有线性和二次项。如果你想在两个表面之间使用摩擦,你可以这样做:

if (vx > 0) vx += -friction / mass;
if (vx < 0) vx +=  friction / mass;

我还包括了足以满足F = m * a加速度的质量。如果还有其他力作用在物体上,情况会稍微复杂一些,因为如果物体停止移动,只有在剩余的力超过摩擦力时,它才会再次开始移动。

顺便说一句,如果你想让它在数值上更正确,你可以在模拟中添加一个时间步长:vX += accelerationX * timeStep;x += vX * timeStep;.

于 2013-04-14T12:08:33.570 回答
1

我曾担任游戏 AI 工程师。这通常涉及制作游戏玩法和物理。我最近不得不自己回答这个问题。这就是我发现这个的原因。这是我的解决方案。我的问题可能与您的问题有些不同,但我的挑战是无论我使用什么帧速率都让它工作。这是我的解决方案:

speed -= (speed * (1 - friction)) / fps;

摩擦力始终是介于 0 和 1 之间的浮点数,1 表示无摩擦,0 表示基本上无限摩擦。这确保了与每秒帧数成正比的摩擦力。

于 2021-05-08T01:38:18.147 回答
0

如果u,mginFf=umg对于表面摩擦力的公式是恒定的,那么 a inF=ma也将是一个常数。也因为a = deltaV/s这意味着速度等于加速度乘以时间(as=deltaV)。这意味着对于每个时间间隔,deltaV如果相同,Ff则保持相同。速度变化只有在不移动时才会停止(v=0)。所以我认为最好的方法是检测它是否在移动并应用常数deltaV(对于相反的方向)并且在v达到零时不应用它。

于 2014-08-10T18:49:48.780 回答
-1

摩擦力是一种力量,可以减慢您拥有的任何正在移动的物体。所以你需要有一个类似后台线程的东西,它不断地查看所有对象的速度,并慢慢地将每个速度降低到零。

于 2013-04-13T16:46:10.757 回答