프로그래밍 강의/게임메이커 스튜디오

GMS, 네트워킹 완전정복 -3-

wnsrn3436 2013. 8. 14. 14:56

 

이번 포스트가 네트워킹 완전정복의 마지막 강좌입니다.

원래 마지막 강좌는 플레이어 오브젝트들의 좌표공유로 끝내려고 했지만,

현재 겜스에서 네트워킹 비동기이벤트에서 메시지를 보내면 패킷이 꼬여버리는 버그가 있어서 비슷한 강좌로 대체합니다.

 

이번 강좌에서 배우는 내용은 메시지를 보낸 플레이어가 누구인지를 식별하는 것입니다.

저번 강좌에서는 어떤 플레이어가 메시지를 보냈는지를 알 수가 없었습니다.

그 방법을 이번 강좌에서 배워보고자 합니다.

 

 

접속 부분입니다.

서버일 때 플레이어의 리스트를 관리하기 위해 map 구조체를 선언하고, chat 구조체는 서버의 로그를 관리하기 위해 만들었습니다.

 

클라이언트일 때에는 접속이 완료되면 자신의 닉네임을 서버에게 전달합니다.

이 닉네임을 서버에서 관리하게 되고, chat 로그에 클라이언트가 입/퇴장 시 작성되게 할 것입니다.

 

 

클라이언트들의 닉네임을 받기 위해 네트워킹 비동기 이벤트를 만듭니다.

이번 강좌에서는 서버는 메시지를 보내지 않기 때문에 서버만 네트워킹 이벤트를 사용할 것입니다.

 

 

해당 메시지가 어떤 플레이어로부터 온 것인지 식별하는 것은 비교적 간단합니다.

저번 강좌에서 network_type_connect, network_type_disconnect 의 ds_map_find_value(async_load, "socket") 는 클라이언트의 고유 소켓 id 라고 말씀드렸었습니다.

 

이런 소켓 id를 메시지를 받을 때에도 얻을 수가 있습니다.

network_type_data 에서는 ds_map_find_value(async_load, "id") 가 클라이언트의 고유 소켓 id를 의미하기 때문이죠.

결국, 같은 클라이언트가 보낸 메시지 type 이라면 둘의 고유 소켓 id는 같습니다.

 

위의 코드에서 접속과 퇴장 시에는 ds_map_find_value(async_load, "socket") 로 처리를 하고,

닉네임을 보낸 메시지가 왔을 때에는 ds_map_find_value(async_load, "id") 로 처리하는 것을 보실 수가 있을 것입니다.

 

 

위 코드의 내용은 이렇게 로그에 저장하는 것입니다.

플레이어의 닉네임을 일단 ds_map 에 저장한 뒤, 어떤 행동을 그 플레이어가 했을 때에(현재 강좌에서는 입/퇴장) 로그에 기록합니다.

 

네트워킹 강좌를 이것으로 마무리하겠습니다.

강좌가 자세한 내용은 설명하지 않고 빨리빨리 넘어간 감이 있지만, 이 강좌는 게임메이커 중수를 대상으로 합니다.

어느 정도 코드에 대한 이해는 있으실 거라 믿습니다.

 

Networking Example 3.gmz

 

http://cafe.naver.com/playgm

Comments