Programming/GMS

GMS, 네트워킹 데모의 좌표 공유 방법을 알아보자

wnsrn3436 2014.01.16 12:13

 

네트워킹 완전정복 3개의 강좌를 했었지만, 그럼에도 많은 분들이 '좌표 공유 방법을 모르겠어요!' 혹은 '총알은 어떻게 발사하나요?' 라고 질문들을 하셔서,

게임메이커: 스튜디오(GameMaker: Studio)에서 기본적으로 지원하는 데모 파일을 가지고 설명을 해볼까 합니다.

 

제가 이 데모 파일에서 설명할 것은 좌표 공유에 관한 이야기입니다.

서버와 클라이언트의 개체에 대한 처리 방법은 '실체, 허상, 부분 동기화' 등 여러 가지가 있는데, 그중에서 겜스 네트워킹 예제는 '허상'이라는 방법을 사용합니다.

허상이란, 서버는 모든 개체의 실체를 가지고 있고, 클라이언트는 개체에 대한 허상만 가지고 있는 처리 방법입니다.

 

허상의 전제는 다음과 같습니다.

1. 서버는 자신과 모든 클라이언트의 oPlayer 라는 오브젝트를 가진다.

2. 클라이언트는 자신의 oPlayer 라는 오브젝트만을 가진다.

 

 

먼저, 서버는 클라이언트가 접속할 때 ds_map에 클라이언트의 소켓 번호와 클라이언트의 oPlayer 인스턴스 id를 대응시킵니다.

이러한 ds_map 대응을 통해, 해당 클라의 소켓 번호를 가지고 있으면, 해당 클라의 인스턴스 id를 얻을 수 있죠.

 

 

네트워킹 게임을 진행하면서, 클라이언트는 서버에게 자신의 키보드 입력을 보내게 됩니다.

예제에서 SendKey라는 스크립트를 통해 간편하게 키 입력을 보내는 것을 보실 수가 있을 것입니다.

 

 

서버는 클라로부터 키보드 입력에 관한 메시지가 도착하면, 해당 클라의 인스턴스 id를 얻은 다음, 인스턴스에 키 입력을 저장합니다.

(이제, 서버에서 oPlayer라는 놈은 키 입력에 따라서 이동하게 됩니다.)

 

 

이제 서버는 oServer 오브젝트의 스텝 이벤트에서, 모든 oPlayer의 좌표를 버퍼에 저장한 다음, 모든 클라이언트에게 쏴줍니다.

이 과정에서, 버퍼의 맨 앞은 해당 클라이언트 인스턴스의 x, y좌표를 보냅니다. (54~55 라인)

 

 

클라는 버퍼 맨 앞으로 온 자신의 인스턴스의 x, y 좌표를 갱신하고, 타 플레이어의 좌표와 정보들을 ds_list에 저장합니다.

 

 

그리고 드로우 이벤트에서 아까 ds_list에 저장한 '허상'들을 드로우 합니다.

마치 타 클라이언트의 인스턴스가 살아있는 것처럼 속이는 것이죠.

 

Networked Platformer.gmz

 

http://cafe.naver.com/playgm

Tag
0 Comments