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

[게임메이커 강좌-네트워크][GMS2] 멀티플레이어 게임 만들기-7-접속자 목록

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

 

 

GAME MAKER 강좌

 

KAYAN

 

 

 

 

 

 

◈ 접속자 목록

 

강좌가 거의 끝나갑니다.

이번에는 접속자를 표시해봅시다.

 

(▲ 접속 참여자)

 

먼저, 서버에서 우측 상단 화면에 클라이언트의 이름을 표시하도록 합니다.

 
obj_server_system 오브젝트 - Draw GUI 이벤트
 
 
var vw, vh;
vw = display_get_gui_width( );
vh = display_get_gui_height( );
 
draw_set_font( font0 );
draw_set_halign( fa_left );
draw_set_valign( fa_top );
 
var _x, _y, _list, i, _user_id, n, c, t;
_x = vw-180;
_y = 16;
 
var w, h;
w = 180; h = 24;
c = c_green; draw_set_alpha( 0.6 ); draw_rectangle_color( _x, _y, _x+w, _y+h, c, c, c, c, 0 ); draw_set_alpha( 1 );
c = c_black; draw_text_color( _x+8, _y+2, "접속자 ( "+string( ds_list_size( global.socketlist )+1 )+" )", c, c, c, c, 1 );
 
_y+ = h+2;
c = c_white; draw_set_alpha( 0.6 ); draw_rectangle_color( _x, _y, _x+w, _y+h, c, c, c, c, 0 ); draw_set_alpha( 1 );
c = c_blue; draw_text_color( _x+8, _y+2, "[서버]["+string( global.playername )+"]( 나 )", c, c, c, c, 1 );
 
_y+ = h+2;
if ds_map_exists( global.player_map, "player_order" ){
_list = ds_map_find_value( global.player_map, "player_order" );
 
for( i = 0; i<ds_list_size( _list ); i+ = 1; ){
 
_user_id = ds_list_find_value( _list, i );
 
//플레이어 닉네임
if ds_map_exists( global.player_map, "player_"+string( _user_id ) ){
t = ds_map_find_value( global.player_map, "player_"+string( _user_id ) );
 
c = c_white; draw_set_alpha( 0.6 ); draw_rectangle_color( _x, _y, _x+w, _y+h, c, c, c, c, 0 ); draw_set_alpha( 1 );
c = c_black; draw_text_color( _x+8, _y+2, t, c, c, c, c, 1 );
_y+ = h+2;
}
 
}
}
 

 

서버는 클라이언트가 저장된 데이터에 없기 때문에, 서버 유저 정보(global.playername)는 바로 표시합니다.

 

이제 서버에서 우측 상단 화면에 클라이언트의 이름을 표시하도록 합니다.

 
obj_client_system 오브젝트 - Draw GUI 이벤트
 
 
var vw, vh;
vw = display_get_gui_width( );
vh = display_get_gui_height( );
 
 
draw_set_font( font0 );
draw_set_halign( fa_left );
draw_set_valign( fa_top );
 
var _x, _y, _list, i, _user_id, n, c, t;
_x = vw-180;
_y = 16;
 
var w, h;
w = 180; h = 24;
 
user_count = 0;
if ds_map_exists( global.player_map, "player_order" ){
_list = ds_map_find_value( global.player_map, "player_order" );
user_count = ds_list_size( _list );
}
 
c = c_green; draw_set_alpha( 0.6 ); draw_rectangle_color( _x, _y, _x+w, _y+h, c, c, c, c, 0 ); draw_set_alpha( 1 );
c = c_black; draw_text_color( _x+8, _y+2, "접속자 ( "+string( user_count+1 )+" )", c, c, c, c, 1 );
 
_y+ = h+2;
 
 
if ds_map_exists( global.player_map, "player_order" ){
c = c_white; draw_set_alpha( 0.6 ); draw_rectangle_color( _x, _y, _x+w, _y+h, c, c, c, c, 0 ); draw_set_alpha( 1 );
c = c_black; draw_text_color( _x+8, _y+2, "[서버]["+string( global.server_name )+"]", c, c, c, c, 1 );
_y+ = h+2;


_list = ds_map_find_value( global.player_map, "player_order" );
 
for( i = 0; i<ds_list_size( _list ); i+ = 1; ){
 
_user_id = ds_list_find_value( _list, i );
 
//플레이어 닉네임
if ds_map_exists( global.player_map, "player_"+string( _user_id ) ){
t = ds_map_find_value( global.player_map, "player_"+string( _user_id ) );
c = c_white; draw_set_alpha( 0.6 ); draw_rectangle_color( _x, _y, _x+w, _y+h, c, c, c, c, 0 ); draw_set_alpha( 1 );
c = c_black; if _user_id == global.user_id{ t+ = "( 나 )"; c = c_blue; }
draw_text_color( _x+8, _y+2, t, c, c, c, c, 1 );
_y+ = h+2;
}
 
}
}
 

 

서버는 클라이언트가 저장된 데이터에 없기 때문에, 서버에 처음 접속해 받아온 서버 유저 정보(global.server_name)를 바로 표시합니다.

잘 표시되는 지 확인해봅시다.

 

 

다음은 화면에 플레이어 수를 왼쪽 아래, 체력을 오른쪽 아래에 표시해봅시다.

 

(▲ 이미지 폰트로 숫자를 표시)

 

먼저, 폰트로 사용할 이미지를 추가합니다.

 

이미지 숫자를 표시하기 위해 게임 시작시 폰트를 추가합니다.

 
obj_start_event 오브젝트 - Game Start 이벤트
 
 
var t = "0123456789%-.";//폰트 문자열
global.font_numb = font_add_sprite_ext( spr_font32_numb, t, 1, 2 );
 

 

이미지 폰트 추가시 이미지의 순서는 폰트 문자열과 동일 해야 합니다.

 

게임 실행 오브젝트(obj_game_stage)의 [Draw GUI 이벤트]에서 플레이어 수를 화면 왼쪽 아래에 표시합니다.

그리고 화면의 오른쪽 아래는 체력을 표시합니다.

 

 
obj_game_stage 오브젝트 - Draw GUI 이벤트
 
 
draw_set_font( global.font_numb );
draw_set_halign( fa_center );
draw_set_valign( fa_top );
var vw, vh;
vw = display_get_gui_width( );
vh = display_get_gui_height( );
 
 
//플레이어 수 표시
var t, c;
if instance_number( obj_player_parent )>0{
t = string( instance_number( obj_player_parent ) );
c = c_white; draw_text_color( 80, vh-48, t, c, c, c, c, 1 );
}
 
//체력 표시
t = ""; with( obj_player_parent ){ if select == 1{ t = string( HP ); }}
c = c_red; draw_text_color( vw-80, vh-48, t, c, c, c, c, 1 );
 

 

체력 표시는 게임 플레이하는 본인 것만 표시하면 됩니다.

 

 

 

 

 

 

 

 

 

300x250

댓글