我正在使用Eclipse编写java版的pacman游戏,有时候移动pacman/ghosts会变得缓慢,但也有时候它可以正常运行。这种情况曾经发生在我正在运行程序时,所以不是在添加代码后出现的,并且似乎也不会在游戏中的任何特定事件之后发生。我找不到任何触发器或故障产生的方法。
资源管理器显示了相同的CPU使用率(仅约50%)/内存使用率。此外,FPS似乎始终保持在200左右,无论是在卡顿期间还是在工作良好的时期。
有谁知道这是什么原因?
是否有任何我遗漏的信息可能会有用?
编辑-我基于计时器进行移动,这样做有问题吗?我将在下面发布与移动相关的代码,这里有一个好的方式可以发布整个代码吗?
在主类中的公共void keyPressed方法中:
资源管理器显示了相同的CPU使用率(仅约50%)/内存使用率。此外,FPS似乎始终保持在200左右,无论是在卡顿期间还是在工作良好的时期。
有谁知道这是什么原因?
是否有任何我遗漏的信息可能会有用?
编辑-我基于计时器进行移动,这样做有问题吗?我将在下面发布与移动相关的代码,这里有一个好的方式可以发布整个代码吗?
Timer movement = new Timer(20, new ActionListener()//500 is time in milliseconds between
//calls to actionPerformed as far as I know.
{
public void actionPerformed(ActionEvent arg0)
{
if(movingUp == true)
{
moveUp();
}
else if(movingDown == true)
{
moveDown();
}
else if(movingRight == true)
{
moveRight();
}
else if(movingLeft == true)
{
moveLeft();
}
}
});
public void moveUp()
{
yPos -= 1;
this.rect.y -= 1;
}
public void setDirUp()
{
movingUp = true;
movingDown = false;
movingRight = false;
movingLeft = false;
}
在主类中的公共void keyPressed方法中:
if(keyCode == KeyEvent.VK_W)
{
if(pacMan.isUpHittingWall == false)
{
pacMan.setDirUp();
pacMan.isDownHittingWall = false;
pacMan.isRightHittingWall = false;
pacMan.isLeftHittingWall = false;
}
}
编辑2-感谢大家的帮助。我现在使用系统时间来移动,似乎已经解决了问题,因为一开始我只对吃豆人实施了这个方法,但是鬼还是很慢。现在出现了一个问题,向右和向下移动比向左或向上移动慢得多。我唯一看到的区别是向右和向下都是加,而向左和向上都是减。我该怎么办?
更新后的代码如下。
//updated movement code
public void moveUp(long timePassed)
{
yPos -= vy * timePassed;
this.rect.y -= vy * timePassed;
}
public void moveDown(long timePassed)
{
yPos += vy * timePassed;
this.rect.y += vy * timePassed;
}
public void moveRight(long timePassed)
{
xPos += vx * timePassed;
this.rect.x += vx * timePassed;
}
public void moveLeft(long timePassed)
{
xPos -= vx * timePassed;
this.rect.x -= vx * timePassed;
}
//I passed timePassed through a globalInputObject because my input is handled in public //void keyPressed(KeyEvent e) and I didnt know how else to get timePassed in to the //movement method
//Here is the code in gameLoop()
globalInputObject.isPacManMovingUp(timePassed);
globalInputObject.isPacManMovingDown(timePassed);
globalInputObject.isPacManMovingRight(timePassed);
globalInputObject.isPacManMovingLeft(timePassed);
//This is inside the GlobalInputObject
public void isPacManMovingUp(long timePassed)
{
if(pacMan.movingUp == true)
{
pacMan.moveUp(timePassed);
}
}
public void isPacManMovingDown(long timePassed)
{
if(pacMan.movingDown == true)
{
pacMan.moveDown(timePassed);
}
}
public void isPacManMovingRight(long timePassed)
{
if(pacMan.movingRight == true)
{
pacMan.moveRight(timePassed);
}
}
public void isPacManMovingLeft(long timePassed)
{
if(pacMan.movingLeft == true)
{
pacMan.moveLeft(timePassed);
}
}