java - 为什么我的 java 制作的 pacMan 克隆有时会滞后?

标签 java eclipse lag

我正在使用 eclipse 在 java 中克隆 pacman,有时它看起来很慢,更具体地说,pacman/ghosts 的移动很慢,有时它很好。一旦它在我运行它时发生,所以它不是在我添加代码之后发生的,而且它似乎也不是在游戏中的任何特定事件之后发生的。我找不到任何触发器或故意产生滞后

资源管理器显示相同的 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);
        }
    }

最佳答案

每次计时器运行时,与其总是将吃 bean 人移动恒定距离(看起来是 1 个像素),不如:

  1. 将计时器设置为尽可能快地运行(例如每毫秒或更短时间运行一次)。 修改:如果您将其设置得太快,游戏最终可能会运行得更慢,您必须进行试验。
  2. 使用 system clock 计算每帧之间耗时并将吃 bean 人移动与其成正比的量。

执行上述操作意味着如果系统“滞后”,它只会每秒显示更少的帧数,而不是实际移动所有内容更慢。

关于java - 为什么我的 java 制作的 pacMan 克隆有时会滞后?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7602540/

相关文章:

java - 如何编辑现有的 eclipse 插件?

java - setImage经常不阻塞UI线程Android

python - Pygame OpenGL 3D 立方体滞后

python - Python中精确的信号延迟计算

java - 在未实现 Cloneable 接口(interface)的对象上调用 clone() 方法时不会抛出 CloneNotSupportedException

java - 如何用servlet + ajax制作动态内容

java - 使用 java 刷新 Excel 查询

c - 您如何设置 eclipse 以便它像对 Java 一样对 C 的错误进行解析和加下划线?

c++ - 配置 Eclipse CDT 以使用 g++

java - PriorityQueue 更改 poll() 上的元素位置