본문 바로가기
GameMaker강좌[GMS2]/네트워크강좌

[게임메이커 강좌-네트워크][GMS2] 멀티 플레이어 게임 만들기-1-메인화면

by 타락카얀 2024. 12. 25.
728x90

 

 

GAME MAKER 강좌

 

KAYAN

 

 

 

 

 

 

 

◈ 멀티 플레이어 게임 만들기

 

네트워크 채팅 강좌를 보셨다면, 서버와 클라이언트가 어떤 식으로 통신하는지 어느정도 감이 잡혔을 겁니다.

이번 강좌에서는 간단하게 멀티 플레이어 게임을 만들어 봅시다.

(▲ 멀티 플레이어 게임)

 

네트워크 게임을 만들기 전에 오프라인 형태로 플레이어 이동이나 게임 구성을 먼저 만들어 보시는 것을 권장합니다.

 

먼저 메인 화면부터 구성합니다.

(▲ 메인 화면)

 

룸은 처음 메인화면, 서버 실행룸, 클라이언트 실행룸, 게임룸 4종류가 필요합니다.

(▲ 룸 종류)

 

강좌에서 메인화면의 크기는 800x600으로 설정하겠습니다.

메인화면 메뉴는 간단하게 이름 입력, 서버 만들기, 클라이언트 입장 3종류만 추가합니다.

 

(▲ 메인 화면 구성)

 

먼저, 오브젝트를 만들고, [Game Start 이벤트]를 추가한 다음, 필요한 변수를 추가해줍니다.

 

 
obj_start_event - Game Start 이벤트
 
 
global.select_server = 0; //서버:1 클라이언트:0
global.object_map_id = 0; //룸에서 식별할 오브젝트 ID
 
global.message_dialog = 0;
 
global.connect_IP = "127.0.0.1"; //클라이언트 접속 서버 기본 IP
 

 

 

먼저 이름 입력을 해봅시다.

일단, 글자를 표시할 한글 폰트를 추가합니다.

 

그리고 오브젝트를 만들고, 버튼 이미지를 지정합니다.

 

[Create 이벤트]에 이름을 미리 입력하도록 설정합니다.

 

 
obj_input_name 오브젝트 - Create 이벤트
 
 
randomize( );
global.playername = choose( "팀", "알렉스", "존", "스티븐", "찰리", "레온" )
+" "+choose( "팀", "알렉스", "존", "스티븐", "찰리", "레온" )
+string( irandom( 1000 ) );
 
 
global.message_dialog = 0;
message_str = -1;
 

 

이름은 메시지 팝업창으로 입력하기 때문에 필요한 변수를 추가합니다.

변수는 입력창을 1번만 띄우기 위함과, 입력창의 값을 받아오기 위한 변수 2가지 입니다.

 

[Draw 이벤트]에서 이름을 표시하도록 합니다.

 
obj_input_name 오브젝트 - Draw 이벤트
 
 
draw_set_font( font0 );
draw_set_halign( fa_center );
draw_set_valign( fa_middle );
 
draw_self( );
 
var c, t;
c = c_white; draw_rectangle_color( -1, y-48-16, room_width+1, y-48+16, c, c, c, c, 0 );
c = c_black; draw_text_color( x+( sprite_width*0.5 ), y-48, "플레이어 이름을 입력하세요", c, c, c, c, 1 );
 
c = c_black; draw_text_color( x+( sprite_width*0.5 ), y+( sprite_height*0.5 ), global.playername, c, c, c, c, 1 );
 

 

이제 버튼을 마우스 왼쪽 버튼을 눌렀다 떼었을 때, 팝업창을 띄우도록 합니다.

 
obj_input_name 오브젝트 - Mouse Left Realesed 이벤트
 
 
if ( global.message_dialog == 0 ){
message_str = get_string_async( "당신의 이름은 무엇인가요?", global.playername );
global.message_dialog = 1;
}
 

 

그리고 [비동기 Dialog 이벤트]를 추가하고, 아래와 같이 팝업창의 값을 받아오도록 합니다.

 
obj_input_name 오브젝트 - Async Dialog 이벤트
 
 
var _id;
_id = ds_map_find_value( async_load, "id" );
if _id == message_str{
if ds_map_find_value( async_load, "status" ){ //메시지창의 [확인]을 누르면 true
if !( ds_map_find_value( async_load, "result" ) = "" ){
//----------------------------- 처리 내용 -----------------------------
 
global.playername = ds_map_find_value( async_load, "result" );
global.playername = string_copy( string_replace_all( global.playername, ", ", "" ), 1, 10 );
 
//----------------------------- 처리 내용 -----------------------------
}
}
global.message_dialog = 0;
}
 

 

여기까지 작동 되는지 테스트 해봅시다.

 

 

 

 

 

다음은 서버와 클라이언트를 만들 수 있는 이벤트를 만들어야겠죠.

 

대충 계획은 이렇습니다.

서버 버튼을 누르면, 서버 실행룸으로 이동 시키고, 서버를 활성화할 겁니다.

서버는 프로그램을 실행하는 장치가 되는 것이죠.

 

클라이언트 버튼은 접속할 서버 IP를 입력하고, 클라이언트 실행룸으로 이동하여 클라이언트에 관한 설정을 구성하도록 합니다.

서버에 정상적으로 연결이 되면, 서버에서 게임룸으로 이동하라는 메시지를 보냅니다.

그리고 클라이언트는 서버에서 보낸 내용을 토대로 게임룸으로 이동하는 것입니다.

 

먼저 오브젝트을 만들고, 서버로 이동할 버튼을 만듭니다.

마우스 왼쪽 버튼을 눌렀다 떼었을 때 서버 실행룸으로 이동합니다.

 
obj_menu_server 오브젝트 - Mouse Left Realesed 이벤트
 
 
room_goto( Room_waiting_server ); //서버 실행룸으로 이동
 

 

 

다음은 클라이언트 입니다.

이름 입력창처럼 서버 IP를 입력하도록 설계할 것입니다.

오브젝트를 만들고, [Create 이벤트]에 필요한 변수를 추가합니다.

 

 
obj_menu_client 오브젝트 - Create 이벤트
 
 
message_str = -1;
 

 

마우스 왼쪽 버튼을 눌렀다 떼었을 때 입력창을 활성화 합니다.

 
obj_menu_client 오브젝트 - Mouse Left Realesed 이벤트
 
if ( global.message_dialog == 0 ){
message_str = get_string_async( "접속할 서버 IP를 입력하세요.", global.connect_IP );
global.message_dialog = 1; }
 

 

그리고 [비동기 Dialog 이벤트]를 추가하고, 아래와 같이 팝업창의 값을 받아오도록 합니다.

 
obj_menu_client 오브젝트 - Async Dialog 이벤트
 
 
var _id;
_id = ds_map_find_value( async_load, "id" );
if _id == message_str{
if ds_map_find_value( async_load, "status" ){ //메시지창의 [확인]을 누르면 true
if !( ds_map_find_value( async_load, "result" ) == "" ){
//----------------------------- 처리 내용 -----------------------------
global.connect_IP = ds_map_find_value( async_load, "result" );
 
if !( string_count( ".", global.connect_IP ) == 3 ) || !( string_letters( global.connect_IP ) == "" )
 || ( string_length( string_digits( global.connect_IP ) ) > 4 ){
global.connect_IP = "127.0.0.1";
show_message_async( "올바른 IP 주소를 입력하세요." );
}
else{
room_goto( Room_waiting_client ); //클라이언트 실행룸으로 이동
}
//----------------------------- 처리 내용 -----------------------------
}
}
global.message_dialog = 0;
}
 

 

올바른 값을 받아오면, 클라이언트 실행룸으로 이동하도록 합니다.

버튼이 완성되었으면 메인화면 룸에 각각 배치합니다.

 

(▲ 메인 화면)

 

잘 작동하는지 테스트해봅시다.

 

 

 

 

 

 

 

 

 

 

 

300x250

댓글