为什么我的英雄在两个 x 方向上的速度和加速度不一样


double horizontalVel=0;
double horizontalAcc=0;
double friction = 0.96;
public void move(){
    x += horizontalVel;
    horizontalVel *= friction;
    horizontalVel += horizontalAcc;
}
public void controlPress(int key){
    if(key==39){
        moveRight();
    }
    if(key==37){
        moveLeft();
    }
}
public void controlRelease(int key){
    if((key==39) || (key==37)){
        stop();
    }
}
public void stop(){
    horizontalAcc=0;
}

public void moveRight(){
    horizontalAcc +=0.2;
    heroImg = new ImageIcon("hero.png").getImage();     
}
public void moveLeft(){
    horizontalAcc -= 0.2;
    heroImg = new ImageIcon("heroflipped.png").getImage();      
}

总而言之,我正在运行一个游戏循环,其中在每次坐标更新之前计算速度和加速度。我的英雄在向左移动(负 x 方向(时比向右移动时需要更长的时间才能停止。我不知道为什么。代码对我来说看起来完全对称。这是某种浮点巫毒教吗?

由于您已经解决了这个问题,因此我确实对您的代码有一些观察:

重要:不要在过程逻辑迭代时加载图像,因为它每秒会触发 30 次,而你的:

heroImg = new ImageIcon("heroflipped.png").getImage();      

可能会导致几个性能问题(如果处理不当,内存也会导致(,更喜欢在构造函数中加载它并在需要时重用它。另外,使用 ImageIO.read("heroflipped.png"(,它直接返回 BufferedImage。

此外,不要使用文本值(硬编码常量值(来比较控件,请使用相应的常量;因为不能保证在新的 Java 版本中这些值可能会更改,并且控件识别可能无法按预期工作。

所以:

public void controlPress(int key){
    if(key==39)
        moveRight();
    if(key==37){
        moveLeft();
}

应该是:

public void controlPress(int key){
    if(key == KeyEvent.VK_RIGHT)
        moveRight();
    if(key == KeyEvent.VK_LEFT){
        moveLeft();
}

而且,由于您正在创建游戏,请尝试使用向量(数学向量,而不是列表(来表达方向和速度作为参考,有这篇文章(这是葡萄牙语的,您可能会在您的语言中找到一些东西 http://www.pontov.com.br/site/index.php/arquitetura/54-matematica-e-fisica/132-o-uso-de-vetores-nos-jogos

答案是在递增 x 之前将 horizonVel 类型转换为 int:

    x += (int)horizontalVel;

出于某种原因,在类型转换之前,它甚至将任意小的负 x 值舍入到 -1,同时将任意小的正 x 值舍入为 0。就像我怀疑的那样,浮点巫毒教...

最新更新