2014-12-27 4 views
2

학교에서 제 친구와 저는 자바로 2D 플랫폼 게임을 만들고 있습니다. 게임 자체는 잘 작동하지만 멀티 플레이어 부분에 약간의 문제가 있습니다.멀티 플레이어 Java 2D 플랫폼 게임 : ObjectInputStream.readObject()가 프로그램을 중지합니까?

우리 게임은 단순한 것, 작은 녀석과 일부 적입니다.

채팅 앱에 관한 YouTube의 튜토리얼에 기반하여 "연결"코드를 기반으로 한 2 대의 PC 간의 연결을 프로그래밍 한적이 없습니다. 연결은 잘 작동하지만 문제는 프로그램이 소켓에서 입력을 읽지 만 더 이상 게임을 실행하지 않는다는 것입니다.

나는 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 : 내 나쁜 영어 죄송합니다 : 입력을 사용할 수있을 때까지이 도착했을 때의

+0

학교에서 나는 대학이 의미하는 바를 모르겠다. 하지만 어떤 종류의 게임이 학생에게 너무 어렵다고 생각하지는 않습니다. 게임이 작동한다는 증거가 있습니다. 그 부분에서 경험이 0이므로 멀티 플레이어 부분에 문제가 있습니다. – Allinone51

+0

이 직렬화 유형 대신 ** KryoNet **을 사용해보십시오. http://stackoverflow.com/a/24452428/2413303 – EpicPandaForce

+0

그래, 고마워, 내가 그걸 봐야 겠어 – Allinone51

답변

1

readObject 블록, 다음 입력을 반환합니다. 입력을 읽고 게임의 다른 부분에 입력을 제공하는 새 스레드를 만들어야합니다.

게임에 정보를 전달하려면 ServerClient 클래스에 다른 메서드를 만들어 다른 메시지를 처리해야 할 수 있습니다. switch 또는 if else if을 사용하여 개체의 필드 또는 개체 유형 (instanceof 사용)에 따라 사용할 방법을 결정할 수 있습니다.

+0

Runnable을 구현하고 스레드를 시작하면 프로그램이 이제 run() 메서드에서 스트림을 읽습니다. 모든 것이 잘 작동합니다! 고마워요! – Allinone51

+0

@ Allinone51 답이 맞다면, 그것을 받아들이십시오 (체크 표시를 클릭하여) 솔루션이 작동한다는 것을 모든 사람에게 보여 주며 우리에게 작은 평판을줍니다. 당신은 의무가 없습니다. – FlyingPiMonster