私はEclipseを使用してJavaでパックマンのクローンを作成していますが、パックマン/ゴーストの動きが遅く、場合によってはうまくいくことがあります。実行中に発生したため、コードを追加した後ではなく、ゲーム内の特定のイベントの後ではないようです。トリガーが見つからないか、意図的にラグを生成できません
リソースマネージャーは、同じ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;
}
public void keyPressedのメインクラスで:
if(keyCode == KeyEvent.VK_W)
{
if(pacMan.isUpHittingWall == false)
{
pacMan.setDirUp();
pacMan.isDownHittingWall = false;
pacMan.isRightHittingWall = false;
pacMan.isLeftHittingWall = false;
}
}
編集2-助けてくれてありがとう。現在、システムタイムを使用したムーブメントがありますが、最初はpacmanにのみ実装し、ゴーストはまだ遅いため、問題は修正されたようです。今、右と下への移動が左または上への移動よりもはるかに遅いという問題があります。私が見る唯一の違いは、右と下の両方が加算であり、左と上が減算であるということです。これについて私は何ができますか?
更新されたコードは以下のとおりです。
//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);
}
}