2011-10-27 2 views
5

나는 gamekit 피어 투 피어 연결을 사용하는 bomberman 응용 프로그램을 코딩했습니다. 문제는 잠시 후 게임이 더 이상 동기화되지 않는다는 것입니다.게임 키트 피어 투 피어

GKTanks의 샘플 코드를보고 해당 모델을 사용했습니다. 동료 간에는 클라이언트/서버 관계가 없으므로 게임에서 사용하지 않았습니다. 두 피어는 수신 된 데이터를 기반으로 업데이트하는 gamestate를 유지합니다.

나는 각 프레임에서 게임을 실행하는 데 사용되는 NSTimer를 가지고 있습니다. NSTimers는 동기화되어 있지 않기 때문에 gamestates가 서로 다른 경우가 있습니다. 예 : 플레이어가 거의 동시에 전원을 켜면 둘 다 데이터를 보내는 데 시간이 걸리기 때문에 전원이 켜집니다.

나는 앱을 만드는 데 어떤 아이디어라도 주시면 감사하겠습니다. 나는 클라이언트 - 서버를 사용하기 위해 코드를 재 작성하려고 생각하고 있지만, 좋은 생각인지 확실하지 않다 ... 아직

고마워!

편집 : 임의의 플레이어가 호스트로 선정되도록 코드를 변경했습니다. 플레이어가 폭탄을 배치 할 때마다 서버에 배치 할 위치를 묻습니다. 서버는 플레이어 위치 (서버에 표시됨)를 반환 한 다음 플레이어에게 폭탄을 배치 할 위치를 알려줍니다.

전원 공급 장치의 경우 서버는 플레이어가 전원 공급을 받았는지 확인하고 그가 수행 한 경우 전원에게 알려주는 패킷을 보냅니다.

또 다른 문제가 발생했습니다. 기기 간 대기 시간이 깁니다 (블루투스 연결을 사용하고 있습니다). 클라이언트가 버튼을 두드린 후 폭탄을 놓는 데 약 0.2 초가 걸립니다.

모든 데이터가 안정적으로 전송됩니다. 이 일을 제대로하고 있습니까?

두 선수가 파워 업에 돌진 :

답변

4

음 preferbly 당신은 것입니다 귀하의 경우, 그래서 유일한 호스트가 게임 상태를 조작 할 수있는 호스트 - 클라이언트 관계를 원한다. 호스트가 먼저 선택합니다.
등록되고 호스트에 전원이 공급됩니다.
플레이어 # 2도 전원 켜기를 선택하고 호스트에 작업을 보냅니다.
호스트는 플레이어 2에게 이미 전원이 꺼진 것을 알립니다.

귀하의 상황에 맞는 것은 패킷 손실을 방지하기위한 것입니다.
호스트 - 클라이언트 관계가 발생할 수없는 유일한 문제는 호스트가 항상 스마트 폰의 장치간에 대기 시간이 증가 할 때 커지는 이점이 항상 있다는 것입니다.

bomberman과 같은 게임에서는 수행 한 동작 대신 무언가가 변경 될 때마다 전체 gamestate를 보내는 것이 그럴듯합니다. 두 장치가 동기화되어 있는지 확인하는 것입니다.

요약하면 두 사용자 모두 gamestate가 있지만 호스트 만이 두 가지를 조작 할 수 있습니다.

0

당신이해야 할 일 : 장치의

  • 하나의 호스트이고, 다른 하나는 클라이언트
  • 호스트 프로세스의 모든 게임 상태이며, 결정을 내리고, 다음은 클라이언트에 전체 gamestate를 전송
  • 클라이언트가 gamestate를 가져오고 방금 그걸 기반으로 모든 것을 그립니다 - 폭탄을 터뜨렸거나 폭탄을 터뜨린 사람 등)
  • 클라이언트가 호스트에 입력을 보냅니다 (왼쪽, 오른쪽, 일시 중지 등)

그게 전부입니다. 두 시스템 모두에서 의사 결정을 시도하면 시스템을 동기화 상태로 유지하는 데 큰 어려움이 따릅니다.