GAME MAKER 강좌
KAYAN
◈ 네트워크 연결 지연에 따른 설정(Ping)
서버가 종료되거나, 클라이언트의 네트워크가 갑자기 예기치 않게 끊기거나, 오류가 발생해 통신이
안 되는 경우, 또는 네트워크 회선이 좋지 않은 경우 등과 같이 정상적인 종료가 아닌 특수한 상황일 때는
[네트워크 비동기 이벤트]가 발동이 되지 않습니다.
이와 같은 경우 이벤트를 별도로 설정해주어야 합니다.
서버와 클라이언트 간의 네트워크 연결 지연(Ping)에 따른 설정을 구성해봅시다.
먼저 클라이언트에서는 [Alarm 0 이벤트]에서 처리하도록 합시다.
★ obj_client_system 오브젝트 - Create 이벤트 ★ alarm[0] = 1; //ping 체크 ping = 0; |
클라이언트 [Alarm 0 이벤트]에서 알람 1단위마다 서버의 100 번 수신 이벤트로 메시지를 보냅니다.
이것은 단순히 메시지가 전달되었는지만을 체크하는 것 뿐이에요.
★ obj_client_system 오브젝트 - Alarm 0 이벤트 ★ //현재 클라이언트 서버연결 체크 alarm[0] = 1; var _send; buffer_seek( global.net_buffer, buffer_seek_start, 0 ); buffer_write( global.net_buffer , buffer_u16, 100 ); //서버에 보낼 패킷 번호 _send = network_send_packet( global.client_socket, global.net_buffer, buffer_tell( global.net_buffer ) ); if !( _send< = 0 ){ ping = 0; }//패킷 보내기 성공했으면 ping을 0으로 처리 |
패킷을 성공적으로 보내면 ping을 0으로 처리합니다.
하지만, 지연시간이 지정시간을 초과하면 클라이언트는 채팅을 나간 것으로 처리합니다.
★ obj_client_system 오브젝트 - Alarm 0 이벤트 ★ //현재 클라이언트 서버연결 체크 alarm[0] = 1; var _send; buffer_seek( global.net_buffer, buffer_seek_start, 0 ); buffer_write( global.net_buffer , buffer_u16, 100 ); //서버에 보낼 패킷 번호 _send = network_send_packet( global.client_socket, global.net_buffer, buffer_tell( global.net_buffer ) ); if !( _send< = 0 ){ ping = 0; }//패킷 보내기 성공했으면 ping을 0으로 처리 //---------- ▼ 타임 아웃 if ping>1000{ network_destroy( global.client_socket ); instance_destroy( ); show_message( "서버에 연결이 되지 않습니다." ) room_goto( Room_open ); } ping+ = 1; //---------- ▲ 타임 아웃 |
이번에는 서버에서의 처리입니다.
서버에서는 게임 유저 오브젝트(obj_game_user)로 접속한 클라이언트의 Ping을 체크합니다.
게임 유저 오브젝트(obj_game_user)의 [Create 이벤트]에 Ping을 체크할 수 있는 변수를 추가합니다.
★ obj_game_user - Create 이벤트 ★ ping = 0; alarm[0] = 1; |
[Alarm 0 이벤트]를 추가하고 ping 값을 처리합니다.
★ obj_game_user - Alarm 0 이벤트 ★ ping+ = 1; alarm[0] = 1; |
이제 서버의 [네트워크 비동기 이벤트]에서 클라이언트가 수신 이벤트를 트리거하면 해당 Ping 값을 초기화 합니다.
★ obj_server_system 오브젝트 - Async - Networking 이벤트 ★ case 100://클라이언트 PING 체크 with( obj_game_user ){ if ( user_id == sock ){ ping = 0; }} break; |
그리고 [End Step 이벤트]에서 클라이언트 Ping 이 초과되었는지 체크합니다.
지연시간이 지정시간을 초과하면 클라이언트는 채팅을 나간 것으로 처리합니다.
★ obj_server_system 오브젝트 - End Step 이벤트 ★ var n, i, sock; n = ds_list_size( global.socketlist ); if n>0{ with( obj_game_user ){ if ( ping>1000 ) && !( user_id< = 0 ){ //타임 아웃 체크. user_id = 0은 서버 유저. // == == == == == == == == == var sock, pos, t, i; sock = user_id; pos = ds_list_find_index( global.socketlist, sock ); ds_list_delete( global.socketlist, pos ); //클라이언트 소켓 목록 삭제 if ds_map_exists( global.player_map, "player_"+string( sock ) ){ ds_map_delete( global.player_map, "player_"+string( sock ) ); } //클라이언트들에게 보낼 접속자 정보 var _map = json_encode( global.player_map ); buffer_seek( global.net_buffer, buffer_seek_start, 0 ); buffer_write( global.net_buffer , buffer_u16, 1 ); //패킷 이벤트 번호 buffer_write( global.net_buffer , buffer_string, global.playername ); //서버 관리자 닉네임 buffer_write( global.net_buffer , buffer_string, _map ); //클라이언트 정보 for ( i = 0; i<ds_list_size( global.socketlist ); i+ = 1; ){ network_send_packet( ds_list_find_value( global.socketlist, i ), global.net_buffer, buffer_tell( global.net_buffer ) ); } // == == == == == == == == == instance_destroy( ); break; } } } |
지연 시간이 초과된 클라이언트는 삭제하고, 정보를 갱신하도록 다른 클라이언트에게 새 데이터를 보냅니다.
강좌는 여기까지입니다!
지금까지 잘 작동하는지 확인해봅시다.
강좌에서는 서버와 클라이언트가 동기화를 위해 어떻게 값을 주고 받는지를 중점을 두었습니다만, 여러분들은 좀 더 멋진 게임을 제작하실 수 있을 겁니다.
잠깐! 중요한 부분이 아직 남았습니다.
게임메이커는 윈도우 창모드일 떄, 드래그하면 게임이 멈추게 됩니다.
(▲ 게임이 멈춤)
네트워크 게임은 게임이 멈추게되면 정상적으로 패킷을 주고 받을 수 가 없어 문제가 발생할 수 있어요.
이렇게 되면 게임이 멈춘 클라이언트는 Ping값이 초과되어 게임에서 강제로 나가게 됩니다.
서버도 예외는 아니죠.
서버가 멈추게되면 다른 클라이언트는 자동으로 게임이 종료가 됩니다.
아래의 익스텐션을 추가 적용시키면 드래그하더라도 게임이 멈추는 것을 방지할 수 있습니다.
----------- 패키지파일 -----------
(▲ 게임은 계속 작동함)
적용방법은 간단합니다.
상단 메뉴의 Tools ▶ Import Local Package 를 눌러 첨부 패키지를 추가합니다.
추가하면 익스텐션들과 오브젝트 1개가 추가되는데, 이 오브젝트(obj_frame_freeze_fix)를 게임 시작 룸에 배치하면 됩니다.
그리고 이 익스텐션은 윈도우 내부에 윈도우 보더를 별도로 생성해 사용하기 때문에 게임 옵션의 윈도우 보더는 비활성화해야 합니다.
윈도우 보더 비활성화는 [Game Option]▶[Windows]▶[Graphics]에서 Borderless Window 항목을 체크하면 됩니다.
'GameMaker강좌[GMS2] > 네트워크강좌' 카테고리의 다른 글
[게임메이커 강좌-네트워크][GMS2] 멀티플레이어 게임 만들기-7-접속자 목록 (0) | 2024.12.25 |
---|---|
[게임메이커 강좌-네트워크][GMS2] 멀티플레이어 게임 만들기-6-플레이어의 공격 업데이트 (0) | 2024.12.25 |
[게임메이커 강좌-네트워크][GMS2] 멀티플레이어 게임 만들기-5-서버와의 동기화 (0) | 2024.12.25 |
[게임메이커 강좌-네트워크][GMS2] 멀티플레이어 게임 만들기-4-클라이언트 (0) | 2024.12.25 |
[게임메이커 강좌-네트워크][GMS2] 멀티플레이어 게임 만들기-3-서버 게임 구성 (0) | 2024.12.25 |
댓글