为什么我的英雄的速度和加速度在两个x方向都不相同

时间:2013-08-26 19:45:16

标签: java

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方向)而不是向右移动时,我的英雄需要更长时间才能停止。我不知道为什么。代码看起来与我完全对称。这是某种浮点伏都教吗?

2 个答案:

答案 0 :(得分:4)

既然你已经解决了这个问题,我对你的代码有一些看法:

最重要的是: 不要在proccess逻辑迭代中加载图像,因为它将每秒触发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();
}

并且,既然你正在创造一个游戏,尝试使用向量(数学的,而不是列表)来表达方向和速度作为参考文章(这是葡萄牙文,你可能会找到你的语言{{3 }})

答案 1 :(得分:2)

答案是在递增x:

之前将horizo​​ntalVel类型转换为int
    x += (int)horizontalVel;

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