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方向)而不是向右移动时,我的英雄需要更长时间才能停止。我不知道为什么。代码看起来与我完全对称。这是某种浮点伏都教吗?
答案 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:
之前将horizontalVel类型转换为int x += (int)horizontalVel;
出于某种原因,在类型转换之前,它甚至将任意小的负x值四舍五入为-1,同时将任意小的正x值舍入为0.就像我怀疑的那样,浮点伏都教......