Java 为什么不是';我的英雄';s速度和加速度在两个x方向上相同

Java 为什么不是';我的英雄';s速度和加速度在两个x方向上相同,java,Java,总而言之,我正在运行一个游戏循环,在每次坐标更新之前计算速度和加速度。我的英雄向左(负x方向)移动时需要比向右移动更长的时间才能停下来。我不知道为什么。代码在我看来完全对称。这是浮点伏都教吗?答案是在递增x之前将水平级别键入int: double horizontalVel=0; double horizontalAcc=0; double friction = 0.96; public void move(){ x += horizontalVel; horizontalVe

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

答案是在递增x之前将水平级别键入int:

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负值舍入到-1,而将任意小的x正值舍入到0。正如我所怀疑的,浮点伏都教…

答案是在递增x之前将水平级别键入int:

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负值舍入到-1,而将任意小的x正值舍入到0。正如我所怀疑的,浮点伏都教…

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

最重要的是: 不要在PROCESS logics迭代时加载图像,因为它将每秒触发30次,而您的:

    x += (int)horizontalVel;
可能会导致一些性能问题(如果处理得不好也会导致内存问题),您更愿意将其加载到构造函数中,并在需要时重用它。另外,使用ImageIO.read(“herofipped.png”),它确实直接返回BuffereImage

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

因此:

应该是:

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

而且,由于您正在创建一个游戏,请尝试使用矢量(数学矢量,而不是列表)来表示方向和速度作为参考。这篇文章(是葡萄牙语的,您可以在您的语言中找到一些内容)

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

最重要的是: 不要在PROCESS logics迭代时加载图像,因为它将每秒触发30次,而您的:

    x += (int)horizontalVel;
可能会导致一些性能问题(如果处理得不好也会导致内存问题),您更愿意将其加载到构造函数中,并在需要时重用它。另外,使用ImageIO.read(“herofipped.png”),它确实直接返回BuffereImage

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

因此:

应该是:

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

而且,由于您正在创建一个游戏,请尝试使用矢量(数学矢量,而不是列表)来表示方向和速度作为参考。这篇文章(是葡萄牙语的,您可以在您的语言中找到一些内容)

您应该让您的代码打印出加速度和速度的连续值。这可能会给你一些线索…moveLeft和moveRight方法中发生了什么?代码的重要部分缺失了:它与释放前按住键的时间有关吗?看起来你是在增加加速度而不是设置它,这意味着如果你按住键一段时间,速度将需要很长时间才能达到零(因为你没有上限速度或加速度).Jsdodgers:为什么从左到右会有所不同?你应该让你的代码打印出加速度和速度的连续值。这可能会给你一些线索…moveLeft和moveRight方法中发生了什么?代码的重要部分缺失了:它与释放前按住键的时间有关吗?看起来你是在增加加速度,而不是设置它,这意味着如果你按住键一段时间,速度将需要很长时间才能达到零(因为你没有上限速度或加速度)。Jsdodgers:为什么从左到右会有所不同?