(GridWorld,如在Collegeboard的AP考试案例研究中)
所以,我在我的空闲时间里已经在这个游戏上工作了几年,现在它很顺利。我有一个很棒的“棒子”角色,它在网格中运行并拾取物品并对抗怪物和东西。现在,我想我已经准备好把它提升到一个新的水平(无论如何,我有一个选择,因为我需要为我的网络课程做一个项目,哈哈......),我有点难过如何进步。
我过去使用ServerSocket创建了一些程序,我在其中运行一个服务器,并且有几个客户端可以连接到它并接收消息,但它们都是简单的文本程序,不能交换多个字符串。套接字是我考虑使用的,但我不确定如何设置...
现在,当GridWorld运行时,它会自动弹出看起来像JFrame的内容,其中包含网格及其中的所有actor。在包含所有代码的主源文件中,呃,“引擎”,如果你愿意的话,基本上有2个巨大的方法:step(),它控制每个单位时间发生的事情,以及keyPressed(),控制用户按下键时发生的事情。现在,我认为step()肯定需要在服务器端,而keyPressed()应该在客户端,以及窗口(当然 - 否则用户将如何看到他们'重新玩?)我们的想法是让主游戏控制所有NPC的动作和游戏计算只能在服务器上运行一次,并且让多个客户能够连接到它并且每个都有自己的角色游戏(基本上就像一个mmorpg)。
但是,我怎么会把它分开呢? (或者,如果这是正确的方法?)我甚至不确定如何在服务器和客户端之间来回传递数据 - 对于我提到的简单文本程序,我总是使用PrintWriter和BufferedReader。我发现PrintWriter确实有一个接受任何Object的print()方法,但是BufferedReader将如何接收它?它没有任何读取Object的方法。
所以基本上,我想知道服务器应该做什么的具体细节,客户端应该做什么,我应该使用哪些库,以及放置某些功能的位置。
答案 0 :(得分:1)
根据您目前的设计,您可能希望使用RMI之类的东西来进行客户端和服务器之间的通信。这将使您能够专注于如何在客户端和服务器之间调用方法,而无需过多担心管理网络通信。
RMI可能不是您想要长期使用的,但它可能是让您的客户端正常运行的下一步。
至于流 - PrintWriter.print(Object)只写出字符串表示 - 即。它调用对象的toString() - 因此无法将其转换回对象。
为此,您需要ObjectOutputStream和Java seralization。但是RMI会为你做这件事,而不需要太深入了解细节。
答案 1 :(得分:0)
好吧,我已经决定使用套接字并使用ObjectOutputStreams和东西自己完成序列化。我已经找到了放置所有内容的地方,它基本上工作得很好,尽管我仍然有游戏本身不可避免的故障,我需要敲定。谢谢,蒂姆:)