Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过网络制作游戏。paintcomponent()/repaint()循环是否可以在客户端上使用?_Java_Game Loop - Fatal编程技术网

Java 通过网络制作游戏。paintcomponent()/repaint()循环是否可以在客户端上使用?

Java 通过网络制作游戏。paintcomponent()/repaint()循环是否可以在客户端上使用?,java,game-loop,Java,Game Loop,因此,我正在制作一个连接到服务器的游戏,其中所有x,y等的计算都将使用经过的时间来完成。在显示图形的客户端上,我当前正在使用paintcomponent()和repaint()绘制图形。使用这种方法可以吗?因为在不同的计算机上,角色移动的速度将根据计算机运行paintcomponent()的速度而有所不同。假设我在运行游戏时获得了200 fps。。这是否意味着paintcomponent每秒被调用200次?对于性能较慢的计算机,如果速度为60fps,paintcomponent方法会每秒调用ie

因此,我正在制作一个连接到服务器的游戏,其中所有x,y等的计算都将使用经过的时间来完成。在显示图形的客户端上,我当前正在使用paintcomponent()和repaint()绘制图形。使用这种方法可以吗?因为在不同的计算机上,角色移动的速度将根据计算机运行paintcomponent()的速度而有所不同。假设我在运行游戏时获得了200 fps。。这是否意味着paintcomponent每秒被调用200次?对于性能较慢的计算机,如果速度为60fps,paintcomponent方法会每秒调用ie 60次吗?
(我正在使用getframerate方法查找帧速率)

目标:我的目标是让游戏在所有机器上运行都一样,而不是根据计算机的速度而变化

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.clearRect(0, 0, WIDTH, HEIGHT);
        if (gameState == 0) { // main menu
            menuScreen.draw(g); // draw main menu screen
        } else if (gameState == 1) { // instructions
            instrScreen.draw(g);
        } else if (gameState == 2) { // options
            optionsScreen.draw(g); // draw options screen
        } else if (gameState == 3) { // game
            man.draw(g); // test
            if (upKey) {
                man.changeDirection("UP");
                man.move();
                //outputToServer("W");
            }
            if (downKey) {
                man.changeDirection("DOWN");
                man.move();
                //outputToServer("S");
            }
            if (leftKey) {
                man.changeDirection("LEFT");
                man.move();
                //outputToServer("A");
            }
            if (rightKey) {
                man.changeDirection("RIGHT");
                man.move();
                //outputToServer("D");
            }
        }

        g.setColor(Color.BLACK);
        g.drawString(getFrameRate(), 10, 15);
        repaint();
    }

    private String getFrameRate() {
        long currentTime = System.currentTimeMillis();
        deltaTime += currentTime - lastTimeCheck;
        lastTimeCheck = currentTime;
        frameCount++;
        if (deltaTime >= 1000) {
            frameRate = frameCount + "fps";
            frameCount = 0;
            deltaTime = 0;
        }
        return frameRate;
    }

限制因素不是网络吗?您可以随时对更新进行时间同步,以便服务器发送带有某种时间代码的更新,客户端将围绕更新进行更新??我不知道这个系统实际上是如何工作的,只是大声地思考;)@MagProgrammer我计划通过使用速度和经过的时间来计算每个实体的新位置。我还将以一种定时的方式来回发送信息,比如每秒X次。因此,通过这样做,我是否能够让游戏在所有机器上运行相同?我怀疑你是否能让它完全相同,因为网络延迟可能会降低即使是最强大的机器的性能,但会为客户端提供尽可能多的信息以做出某些决策(如你所说的对象向量)应该给它一个机会:如果您正在使用运行时间进行移动和其他一切,那么调用
paintComponent
方法的次数应该无关紧要(除非您有一些不使用运行时间的逻辑)。我不知道你的
move
方法在这里做什么,但只要这仍然取决于所用的时间,你就可以了。但是我不会使用paint调用paint,也不会在paint方法中使用用户I/O逻辑。paint方法应该只绘制最新的状态,而不改变任何状态本身。@我应该将IO逻辑放在哪里?限制因素不是网络吗?您可以随时对更新进行时间同步,以便服务器发送带有某种时间代码的更新,客户端将围绕更新进行更新??我不知道这个系统实际上是如何工作的,只是大声地思考;)@MagProgrammer我计划通过使用速度和经过的时间来计算每个实体的新位置。我还将以一种定时的方式来回发送信息,比如每秒X次。因此,通过这样做,我是否能够让游戏在所有机器上运行相同?我怀疑你是否能让它完全相同,因为网络延迟可能会降低即使是最强大的机器的性能,但会为客户端提供尽可能多的信息以做出某些决策(如你所说的对象向量)应该给它一个机会:如果您正在使用运行时间进行移动和其他一切,那么调用
paintComponent
方法的次数应该无关紧要(除非您有一些不使用运行时间的逻辑)。我不知道你的
move
方法在这里做什么,但只要这仍然取决于所用的时间,你就可以了。但是我不会使用paint调用paint,也不会在paint方法中使用用户I/O逻辑。绘制方法可能只绘制最新状态,而不更改任何状态本身。@我应该将IO逻辑放在哪里?