如何同时有效地编码客户端和服务器?


15

我正在使用客户端-服务器模型编写游戏代码。在单人游戏上玩时,游戏会启动本地服务器,并像远程服务器(多人游戏)一样与之交互。我这样做是为了避免编写单独的单人和多人代码。

我刚刚开始编码,遇到了一个主要问题。目前,我正在Eclipse中开发游戏,并将所有游戏类组织到软件包中。然后,在服务器代码中,我只使用客户端软件包中的所有类。

问题是,这些客户端类具有特定于呈现的变量,显然不会在服务器上执行。

是否应该创建客户端类的修改版本以在服务器中使用?或者我应该只使用布尔值修改客户端类,以指示其客户端/服务器是否在使用它。我还有其他选择吗?我只是想过也许将服务器类用作核心类,然后通过渲染内容对其进行扩展?


您有预处理器选项吗?像#ifdef CLIENT <某些代码> #endif。这是拥有共享类文件的简单方法,服务器和客户端之间可以共享类文件,也可以共享部分。虽然有点混乱。
William Mariager

我同意MindWorX。尽管条件编译在Java中很麻烦,但是应该考虑一些解决方案
sam hocevar 2011年

1
我认为,条件编译是一种粗略的说法,即“我没有在程序包中投入足够的设计时间,” =)“有些混乱”通常会转换为“这到底有什么用?” 六个月后,当您甚至重新阅读自己的代码时,除了废弃的原型之外,其他任何事情都会适得其反。
Patrick Hughes

Answers:


23

您应该更喜欢将渲染代码与游戏逻辑分开,因为它们是不同的关注点

如果将呈现代码与客户端/服务器代码分开,则将获得两个好处:

  • 创建专用服务器将更加容易,因为所有呈现的代码都将放在一个位置。
  • 您可以将update阶段与render阶段分开,并在不同的时间步上运行它们。
  • 通过使用const,减少错误,可以确保渲染代码不会改变游戏状态。

1
+1我完全同意这种观点。将数据建模与该模型的渲染视图分离,将使您可以整洁地做一些事情,例如显示不同信息的多个窗口,将渲染移植到其他平台,添加分析并调整游戏模拟,而无需触及90%的代码库。
Patrick Hughes

5

我认为您应该将客户端代码和服务器代码完全分开。除了接口公开的功能外,服务器代码和客户端代码不应相互了解。服务器不应该对渲染一无所知,只需注册客户端,跟踪位置,时间等即可。如果您的关注点完全分开,则可以轻松维护和进一步开发游戏。希望这个对你有帮助。


+1我倾向于同意这一点。如果服务器将要运行任何客户端,则应将其作为单独的进程来运行。
工程师

5

就像其他人所说的,关注点分离FTW,但是如果您的最终目标是拥有单独的客户端和服务器应用程序,则需要更进一步。您需要确定什么是客户端特定的,什么是服务器特定的以及共享的。对于共享的所有内容,请将其分成专用共享的代码类。然后,特定于客户机或服务器的类可以适当地子类化或引用共享类。将共享类移到一个单独的项目中,构建一个“共享库” JAR,并将该JAR包括在客户端和服务器项目中。

这有几个优点:使关注点分离清晰可见,可以将所有内容保留在单独的项目中;它可以确保您使用相同的共享代码(只要它们使用相同版本的共享JAR)来启动客户端和服务器;这样就不可能在没有意识到的情况下“意外地”修改共享代码。如果共享代码在其自己的项目中,则当您在该项目中编辑任何内容时,您将需要知道更改将如何影响客户端和服务器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.