Programming/GMS

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

wnsrn3436 2013.08.12 11:00

 

기존의 게임메이커와는 달리, 게임메이커 스튜디오(GameMaker: Studio)는 네트워킹 함수를 기본적으로 제공합니다.

하지만 도움말이 영어고, 함수가 너무 복잡한 감이 있어서 그런지 초보자에게는 그렇게까지 와 닿지는 않을 수가 있습니다.

그래서 이 강좌를 통해서 네트워킹 함수를 완벽히 정복하는 시간을 가져보고자 합니다.

 

 

네트워킹에서 가장 기본적인 부분은 접속과 접속해제입니다.

접속과 접속해제를 위해 서버는 플레이어들을 수용할 서버를 만들어야 하고, 클라이언트는 서버에 접속해야 합니다.

 

 

서버와 클라이언트를 만드는 방법은 다양합니다.

소스 파일을 따로 서버와 클라이언트로 나누던가 서버만들기 접속하기 버튼을 만들 수도 있지요.

 

그러나, 이 강좌에서는 한 오브젝트에서 서버와 클라이언트를 둘 다 처리할 것입니다.

그래서 if show_question 조건으로 서버 역할을 할 것인지 물어보는 코드를 작성하였습니다.

 

 

위 코드는 서버일 때에는 12345 포트에 256명을 수용하는 공간을 제작합니다.

network_create_server 함수는 실패하면 0 미만의 수를 반환합니다.

 

또한, 어떤 플레이어들이 들어왔는지 적기 위해 player_list 변수에 ds_map 구조체를 생성하였습니다.

이 변수는 서버에 접속하는 플레이어들을 기록할 것입니다.

 

 

클라이언트일 때에는 소켓을 만들고, 그 소켓으로 서버에 접속해야 합니다.

network_create_socket 함수와 network_connect 함수는 실패하면 0 미만의 수를 반환합니다.

위 코드에서는 성공한다면 exit 명령어로 뒤에 있는 코드(실패)에 다다르지 않게 작성하였습니다.

 

network_connect(socket, "127.0.0.1", 12345) 에서 12345 는 포트 번호인데, "127.0.0.1" 은 무엇일까요?

당신이 네트워킹 게임을 만들고 있다고 가정해봅시다.

그런데 당신이 현재 제작 중인 네트워킹 게임을 무작정 다른 사람과 테스트 할 수는 없을 것입니다.

나 자신과 먼저 실험을 해봐야 하는데, 이때 내 컴퓨터에 접속하는 IP가 바로 127.0.0.1 입니다.

 

어쨌든 이렇게 서버 생성과 참가 부분을 만들어 보았습니다.

이제 서버에서 참가하는 플레이어를 받아들이는 코드를 작성해봅시다.

 

 

플레이어를 수용하기 위해 네트워킹 비동기 이벤트를 만듭니다.

이 이벤트는 플레이어의 접속과 퇴장, 패킷의 주고받음을 담당합니다.

 

 

비동기 이벤트가 발생한다면 ds_map_find_value(async_load, "type") 에 그 종류가 저장됩니다.

저장되는 타입의 종류는 플레이어의 참가와 퇴장, 패킷 받기 등이 있습니다.

 

위에서는 network_type_connect 와 network_type_disconnect 로 플레이어가 접속했는지 퇴장했는지를 검사합니다.

ds_map_find_value(async_load, "socket") 라는건 network_type_connect 와 network_type_disconnect 에서만 얻을 수 있는 접속하거나 퇴장한 플레이어의 소켓 id 입니다.

접속한 플레이어 각자의 id가 다르기 때문에 이것으로 서버에서 플레이어들은 구분되지요.

 

이렇게 작성했으면 플레이어의 수용 부분을 끝낸 것입니다.

이제 클라이언트에서 서버와의 연결이 끊어졌는지를 검사해봅시다.

 

 

서버와의 접속이 끊어졌는지 확인하기 위해서는 버퍼가 필요합니다.

아까 Create 이벤트에서 버퍼 생성 코드를 추가합니다.

그리고 서버와의 접속을 주기적으로 검사해야 하므로, alarm[0] = 10 코드도 추가하였습니다.

 

 

알람 이벤트를 추가하고 코드를 작성해 봅시다.

 

 

서버의 생존 여부를 알기 위해서는 서버에게 패킷을 보내야 합니다.

저렇게 의미 없는 패킷을 버퍼에 저장하고 보낸 뒤에 "<=0" 즉 실패 처리가 되면 서버와의 연결이 끊긴 것입니다.

 

network_send_packet 함수는 패킷을 보낸 바이트 혹은 0 미만의 수를 반환합니다.

0 미만의 수를 반환하는 경우는 패킷 전송을 실패했을 때이고, 0을 반환하는 경우는 패킷에 아무런 데이터를 담지 않고 보냈을 때입니다.

 

이번 강좌에서 서버와 클라이언트의 연결 부분을 다뤄보았습니다.

보기보단 쉽지요? 첨부 파일에는 디버깅을 위한 드로우 이벤트도 추가하였습니다.

 

Networking Example 1.gmz

 

http://cafe.naver.com/playgm

Tag
1 Comments
  • ProfileImage ㅇㅇ 2018.01.13 10:26 신고 강좌에 한 마디 더 붙이자면 게임메이커에서 서버를 켜지 않고 커넥션을 시도하면 클라이언트는 계속 접속을 시도하는데 OS가 자동으로 네트워크 접속이 불가함을 인식하고 이를 중단하기 까지 1분 이상이 걸립니다. 그러므로 클라이언트의 소켓 생성 코드 아래에 socket = network_set_config(network_config_connect_timeout, 1000); 를 써주면 1000ms(1초) 동안 접속을 시도한 후 1초 안에 접속에 실패하면 다음으로 넘어갑니다. 값은 1000~4000(1초~4초)정도가 적당합니다. 저는 1000 추천.