多人Java 2D平台游戏:ObjectInputStream.readObject()停止程序?

时间:2014-12-27 16:21:26

标签: java multiplayer objectinputstream

对于学校,我的朋友和我正在用java制作2D平台游戏。游戏本身运行正常但我们在多人游戏部分遇到了一些麻烦。

我们的游戏很简单,只是一个小家伙和一些敌人。

我从来没有编写过两台PC之间的连接,所以我在youtube上的一些关于聊天应用程序的教程中建立了我的“连接”代码。连接工作正常,但问题是程序只读取套接字的输入,但不再运行游戏。

我设法解决了这个问题,只是将其从while(true)循环中解决了,但现在我还有另一个我现在无法解决的问题。

开始多人游戏时,您可以选择是要创建游戏(服务器)还是想要加入游戏(客户端)。

创建游戏时,它会在开始之前等待连接(客户端)连接。但是现在当整场比赛开始时它会“卡住”。实际上并没有真正陷入困境。假设您是服务器,并且您的朋友作为客户端在您的服务器上连接。他加入你的游戏并在两台计算机上开始游戏,但你留在菜单中。只有当你的朋友(客户)点击一个按钮时,屏幕上的游戏(服务器)才会移动(每当你的朋友点击一个按钮时游戏就会移动一点),如果你点击一个按钮,你的朋友游戏就会移动。如果服务器和客户端都将手指放在按钮上(左,右,跳,开......),游戏就能完美运行,但当然这并不好。

我认为问题出在这行代码中:

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();
        }
    }

serverInputclientInput都是ObjectInputStreams

变量serverState.serverClientState.client仅为booleans,以确定您是服务器还是客户端。

此代码在“在线级别”的代码中实现。

如果我只是评论此代码游戏有效,但“connectedPlayer”不会移动(服务器/客户端不会从客户端/服务器获取任何信息)

我的问题是:这行代码:

Server.clientMessage = (String) Server.serverInput.readObject();

等待输入,当他得到该程序可以继续?如果没有输入,整个程序会停止? 如果我的解释足够清楚,任何解决这个问题的想法。

提前谢谢!

PS:抱歉我的英语不好:s

1 个答案:

答案 0 :(得分:1)

readObject阻塞直到输入可用,然后在输入到达时返回输入。您需要创建一个新线程来读取输入并将输入提供给游戏的其他部分。

要将信息传递给游戏,您可能希望在ServerClient类中创建不同的方法来处理不同的消息。您可以使用switchif else if根据对象中的字段或对象类型(使用instanceof)来决定使用哪种方法。