有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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";
    }

共 (3) 个答案

  1. # 1 楼答案

    我是一名游戏人工智能工程师。这通常涉及游戏性和物理性。我最近不得不自己回答这个问题。这就是我找到这个的原因。这是我的解决方案。我的问题可能和你的有点不同,但我的挑战是无论我使用什么帧速率都要让它工作。以下是我的解决方案:

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

    摩擦力总是介于0和1之间的浮点数,1表示无摩擦力,0表示基本上无限摩擦力。这样可以确保施加的摩擦力与每秒帧数成比例

  2. # 2 楼答案

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

  3. # 3 楼答案

    考虑到两个具有constant normal force的表面之间的摩擦力,摩擦力通常被假定为恒力,这会线性降低物体的速度。其他摩擦力,如空气阻力,通常也有线性和二次项。 如果你想在两个表面之间使用摩擦力,你可以这样做:

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

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

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