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