为了上学,我和我的 friend 正在用 Java 制作一个 2D 平台游戏。游戏本身运行良好,但我们在多人游戏部分遇到了一些问题。
我们的游戏有点简单,只有一个小家伙和一些敌人。
我从来没有用 java 编写 2 台 PC 之间的连接,所以我的“连接”代码基于 youtube 上一些关于聊天应用程序的教程。连接工作正常,但问题是程序只从套接字读取输入,但不再运行游戏。
我设法通过将它从 while(true)
循环中取出来解决了这个问题,但现在我遇到了另一个我现在无法解决的问题。
开始多人游戏时,您可以选择是要创建游戏(服务器)还是加入游戏(客户端)。
当您创建游戏时,它会在开始前等待连接(客户端)连接。但是现在当整个游戏应该开始时它“卡住了”。实际上并没有真正卡住。假设您是服务器,您的 friend 作为客户端连接到您的服务器。他加入了您的游戏,两台计算机上的游戏都开始了,但您留在菜单中。只有当您的 friend (客户端)按下按钮时,您屏幕(服务器)上的游戏才会移动(每次您的 friend 按下按钮时,游戏都会移动一点),如果您按下按钮,您 friend 的游戏就会移动。如果服务器和客户端都将手指放在一个按钮上(向左、向右、跳跃、开火...),则游戏运行良好,但当然这并不好。
我认为问题出在这行代码中:
if(ServerState.server == true){
try {
Server.clientMessage = (String) Server.serverInput.readObject();
System.out.println(Server.clientMessage);
}
catch (ClassNotFoundException e) {
System.out.println("Data type not found");
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
if(ClientState.client == true){
try {
Client.serverMessage = (String) Client.clientInput.readObject();
System.out.println(Client.serverMessage);
}
catch(ClassNotFoundException e){
System.out.println("Data type not found");
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
serverInput
和 clientInput
都是 ObjectInputStreams
。
变量 serverState.server
和 ClientState.client
只是 booleans
来判断你是服务器还是客户端。
此代码在“在线级别”的代码中实现。
如果我只是评论这段代码,游戏会运行,但“connectedPlayer”不会移动(服务器/客户端不会从客户端/服务器获取任何信息)
我的问题是:这行代码是否:
Server.clientMessage = (String) Server.serverInput.readObject();
等待输入,当他得到输入时程序可以继续?如果没有输入,整个程序就停止了? 如果我的解释足够清楚,有什么解决这个问题的想法。
提前致谢!
PS:抱歉我的英语不好:s
最佳答案
readObject
阻塞直到输入可用,然后在输入到达时返回输入。您将需要创建一个新线程来读取输入并将输入提供给游戏的其他部分。
要将信息传递给游戏,您可能需要在 Server
和 Client
类中创建不同的方法来处理不同的消息。您可以使用 switch
或 if else if
根据对象中的字段或对象类型(使用 instanceof
).
关于java - 多人 Java 2D 平台游戏 : ObjectInputStream. readObject() 停止程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27669126/