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