1
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 方向)移动时比向右移动需要更长的时间才能停止。我不知道为什么。代码对我来说看起来完全对称。这是某种浮点巫术吗?

4

2 回答 2

4

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

最重要的是:不要在进程逻辑迭代中加载图像,因为它将每秒触发 30 次,而您的:

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

可能会导致一些性能问题(如果处理不好也会导致内存问题),更喜欢将其加载到构造函数中并在需要时重用它。此外,使用直接返回 BufferedImage 的 ImageIO.read("heroflipped.png") 。

另外,不要使用文字值(硬编码常量值)来比较控件,使用对应的常量;因为无法保证在新的 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

于 2013-08-26T20:27:12.907 回答
2

答案是在增加 x 之前将 Horizo​​ntalVel 类型转换为 int:

    x += (int)horizontalVel;

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

于 2013-08-26T20:12:12.823 回答