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。就像我怀疑的那样,浮点巫毒教...