GAME MAKER 강좌
KAYAN
◈RTS 게임을 만들기 이전에
RTS게임은 만들기가 복잡하고, 이것저것 이벤트 설정해야하는 것이 많아 제작하기가 까다로운 측에 속하며,
최적화를 위해 오브젝트나 이벤트 관리가 매우 중요합니다.
(▲강좌에서 제작할 RTS 게임)
이번 강좌에서는 유닛 선택까지 해볼 것 입니다. 한번 따라서 해보아요.^^
◈유닛 준비(obj_pl_unit1,obj_en_unit1)
(▲강좌에서 사용할 플레이어1 유닛)
스프라이트를 만들었다면 중심점과 마스크(Modify Mask)를 적당하게 설정합니다.
(▲강좌에서 사용할 적1 유닛)
강좌에선 2가지 이미지를 준비했습니다.
그리고 유닛의 parent를 이용할 오브젝트를 플레이어(obj_player)와 적(obj_enemy) 2가지 오브젝트를 만들고,
실제로 배치 시킬 유닛 오브젝트(obj_pl_unit1,obj_en_unit1)를 각각 만듭니다.
예)
obj_player(플레이어 parent) - obj_pl_unit1(하위 오브젝트, 실제 배치)
obj_enemy(적 parent) - obj_en_unit1(하위 오브젝트, 실제 배치)
(▲실제 배치되는 플레이어와 적 유닛 오브젝트)
그리고 플레이어 오브젝트(obj_pl_unit1)와 적 오브젝트(obj_en_unit1)의 준비된 스프라이트를 각각 지정합니다.
◈플레이어 유닛(obj_pl_unit1)
★ obj_pl_unit1 - Create 이벤트 flag=0;//0=플레이어 1=적 select=0;//선택 체크 hp=10;//체력 hp_max=hp;//최대 체력 |
그리고 Draw 이벤트를 추가하고 이미지를 표시하도록 합니다.
★ obj_pl_unit1 - Draw 이벤트 draw_sprite_ext(sprite_index,0,x,y,1,1,direction,c_white,1); |
이것은 오브젝트에 설정된 스프라이트 이미지를 표시하는 것으로 방향에 따라 이미지가 회전하게 됩니다.
※참고
draw_sprite_ext(sprite,subimg,x,y,xscale,yscale,angle,color,alpha)
만약 스프라이트가 애니메이션이라면 subimg에 -1을 넣으시면 됩니다.
◈유닛 선택(obj_ctrl_sys)
(▲시스템 오브젝트)
일단 이 오브젝트는 온갖 정보를 화면에 표시할 것이기 때문에 depth를 다른 오브젝트들 보다 낮게 설정하도록 합니다.
여기에선 -10000정도로 설정하겠습니다.
Create 이벤트를 추가하고 필요한 변수를 선언합니다.
★ obj_ctrl_sys - Create 이벤트 mp_x=0;//마우스 드래그시 기준점 x좌표 mp_y=0;//마우스 드래그시 기준점 y좌표 pressed=0;//마우스 버튼 체크 |
다음은 마우스를 드래그하여 유닛을 선택하는 이벤트를 작성해봅시다.
End Step 이벤트를 추가하고 드래그 이벤트를 작성합니다.
★ obj_ctrl_sys - End Step 이벤트 var mx,my; mx=mouse_x; my=mouse_y;//마우스 좌표 mbc_L=mouse_check_button(mb_left);//마우스 왼쪽 버튼을 누르고 있을때 mbp_L=mouse_check_button_pressed(mb_left);//마우스 왼쪽 버튼을 눌렀을 때만 mbc_R=mouse_check_button(mb_right);//마우스 오른족 버튼을 누르고 있을때 //선택 if mbp_L=1{ with(obj_player){select=0;} aa=collision_point(mx,my,obj_player,1,1); if !(instance_exists(aa)){mp_x=mx;mp_y=my;pressed=1;}//기준점을 설정하고 마우스 눌렀다는 것을 체크 else{with(aa){select=1;}}//현 마우스 좌표에 플레이어가 있는 경우 선택함 } |
이것은 마우스 왼쪽 버튼을 눌렀을 때 드래그 기준점을 정하는 것입니다.
처음에는 모든 플레이어 유닛의 select 변수를 초기화 시키고, 마우스 좌표에 플레이어 유닛이 없다면,
드래그 기준점 좌표를 설정하고, 드래그 선택했는지 변수를 설정하게 됩니다.
만약 마우스 좌표에 플레이어 유닛이 하나 있을 경우(else) 그 유닛은 일단 선택하도록 합니다.
즉 유닛을 한개씩 선택할 경우에 사용하는 이벤트라 할 수 있습니다.
※참고
var는 스크립트, 또는 해당 이벤트에서만 변수를 사용할 때 사용합니다.
사용법은 var 뒤에 해당 이벤트에서 사용할 변수명을 적고, 그 뒤에 변수를 선언하면 됩니다.
예)
var aa,bb;
aa=0;
bb=1;
다음은 드래그 이후의 설정을 해봅시다.
여기에서 유닛을 드래그해 선택할 수 있는 것입니다.
End Step 이벤트에 아래와 같이 작성합니다.
★ obj_ctrl_sys - End Step 이벤트 //마우스 드래그 var _x1,_y1,_x2,_y2; if pressed=1 && mbc_L=0{ _x1=mp_x;_y1=mp_y; _x2=mx;_y2=my; if mp_x>mx{_x1=mx;_x2=mp_x;} if mp_y>my{_y1=my;_y2=mp_y;} var _sel,_max; _sel=0;_max=12;//최대 선택은 12로 제한 with(obj_player){if _sel<_max{if x>_x1 && y>_y1 && x<_x2 && y<_y2{ select=1; _sel+=1;}}}//기준점과 현재 좌표를 기준으로 사각형 범위 안에 들면 유닛을 선택함. pressed=0;}//마우스 체크한 것을 다시 리셋 |
이것은 아래의 그림과 같이 마우스 드래그 이후, 마우스 왼쪽 버튼을 눌렀을 때 설정한 기준점과 현재 좌표를
이용한 사각형 범위 안에 유닛을 선택하게 하는 것입니다.
(▲ 마우스 드래그)
또한 유닛 선택 최대 인원을 12로 제한하여 선택합니다.
많이 선택하고 싶다면 12보다 높은 값을 넣으면 되겠죠. 헤헤~
※참고
with는 지정한 오브젝트에서 이벤트를 발생시키고자 할때 사용합니다.
이벤트 처리는 반복문(repeat, for문등)과 비슷하며, with(오브젝트) 괄호 안에 있는 오브젝트 또는 인스턴스를
생성된 id순서대로 이벤트를 처리하게 됩니다.
사용 예)
with(obj_player){instance_destroy();}//모든 obj_player를 파기시킴.
다음은 아래와 같은 빨간 드래그 표시를 화면에 만들어 봅시다.
(▲ 마우스 드래그)
Draw 이벤트를 추가하고, 아래와 같이 드래그 표시 이벤트를 작성합니다.
★ obj_ctrl_sys - Draw 이벤트 var mx,my; mx=mouse_x; my=mouse_y; if pressed=1{ draw_set_alpha(0.8); c=c_red;draw_rectangle_color(mx,my,mp_x,mp_y,c,c,c,c,1);//사각형을 그림 draw_set_alpha(1); } |
이것은 draw_rectangle_color를 사용하여 End Step 이벤트에서 설정한 기준점과 현재 마우스 좌표를
기준으로 사각형을 그리는 것입니다. 간단하죠. 굳~!
룸을 하나 만들고, 플레이어 유닛(obj_pl_unit1)과 시스템 오브젝트(obj_ctrl_sys)를 배치하고
잘되는지 테스트 해봅시다.
어라... 선택을 했지만 선택되었는지 모르겠다구요? ㅠㅠ
네. 아직 그에 대한 이벤트를 작성하지 않았지요.
그 설정을 위해 다음으로 넘어갑시다. ^^
◈유닛 선택 표시(obj_draw_floor)
유닛을 표시하기 위해 사용할 오브젝트(obj_draw_floor)를 하나 생성합니다.
(▲ 화면에서 다른 오브젝트들 보다 맨 아래에 위치함)
이 오브젝트는 다른 오브젝트들 보다 맨 아래에 위치해야 하기 때문에 depth를 다른 오브젝트들
보다 높게 설정합니다. 여기에서는 적당히 10000값을 넣도록 하겠습니다.
그리고 Draw 이벤트를 추가하고, 유닛이 선택되었는지 표시에 대한 이벤트를 작성해요.
강좌에선 원형태의 표시를 해보겠습니다.
★ obj_draw_floor - Draw 이벤트 with(obj_player){ if select=1{ r=sprite_width*0.7;//선택 원표시의 반지름 크기는 스프라이트 넓이의 0.7배로 설정함 draw_set_alpha(0.5); c=c_green;draw_circle_color(x,y,r,c,c,0);//녹색원형 c=c_yellow;draw_circle_color(x,y,r,c,c,1);//노란색 외곽선 draw_set_alpha(1); } } |
이것은 선택되었을 시, 스프라이트 넓이의 0.7배 반지름 크기 녹색 원형태로 표시되게 합니다.
일정한 크기라면 적당한 크기를 입력하면 되겠죠.
그리고 시스템 오브젝트(obj_ctrl_sys)로 이동해서 이 오브젝트를 생성하게 합니다.
시스템 오브젝트(obj_ctrl_sys)의 Create이벤트에 아래와 같이 추가합니다.
★ obj_ctrl_sys - Create 이벤트 instance_create(0,0,obj_draw_floor); |
이제 플레이어의 체력도 선택시 표시되게 해볼까요.
플레이어 유닛 오브젝트(obj_pl_unit1)로 이동해서 Draw이벤트에 아래와 같이 추가합니다.
★ obj_pl_unit1 - Draw 이벤트 if select=1{ _max=20; _p=(_max*hp)/hp_max;//체력을 픽셀크기로 환산 _x=x-(_max/2); _y=y-16; c=c_red;draw_rectangle_color(_x,_y,_x+_max,_y+3,c,c,c,c,0);//빨간 배경. 체력이 없는 경우 c=c_green;draw_rectangle_color(_x,_y,_x+_p,_y+3,c,c,c,c,0);//녹색 체력 c=c_black;draw_rectangle_color(_x,_y,_x+_max,_y+3,c,c,c,c,1);//검은색 외곽선 } |
이것은 선택시에 유닛의 체력을 표시하는 것입니다.
여기까지 잘되는지 테스트해봅시다.
◈뷰 이동(obj_mouse_pointer)
뷰를 이동 시킬 오브젝트(obj_mouse_pointer)를 하나 만듭니다.
(▲ 뷰를 이동시킬 오브젝트)
그리고 16X16정도의 크기의 스프라이트를 지정하고, 보이지 않게 Visible을 체크해제합니다.
Step 이벤트를 추가한 다음 아래와 같이 이벤트를 작성합니다.
★ obj_mouse_pointer - Step 이벤트 x=mouse_x; y=mouse_y; |
이것은 오브젝트의 좌표를 마우스 위치로 설정하여 마우스 포인터를 따라 다니게 하는 것입니다.
다음은 시스템 오브젝트(obj_ctrl_sys)로 이동해서 이 오브젝트를 생성하도록 합니다.
시스템 오브젝트(obj_ctrl_sys)의 Create 이벤트에 아래와 같이 추가 작성합니다.
★ obj_ctrl_sys - Create 이벤트 instance_create(0,0,obj_mouse_pointer); |
이제 룸의 뷰 설정으로 이동합니다.
(▲ 룸의 뷰 설정)
사용할 뷰를 선택하고, Enable the use of Views와 Visible when room starts를 체크합니다.
View in room과 Port on screen의 크기를 실제 게임화면의 크기로 설정하면 됩니다.
Object following에 이전에 만든 뷰 이동 오브젝트(obj_mouse_pointer)를 지정합니다.
이렇게 하면 이 오브젝트가 화면 가장자리에 위치하면 이동하게 됩니다.
이 이동 속도를 조절할 수 있는데, 그 값은 아래에 있는 Hsp와 Vsp값을 지정하면 됩니다.
적당하게 5정도로 설정하겠습니다.
와우! 이제 테스트 할 시간!
테스트 하기 전에 룸에 오브젝트들을 배치하고, 배경도 넣고, 설정이 제대로 되었는지 확인하도록 해요.
(▲ 룸에 배치)
강좌에서 룸의 크기는 2000X1500크기로 설정했습니다.
※참고
오브젝트를 너무 많이 배치하면 오브젝트 이벤트 연산 처리 때문에 게임이 느려질 수 있습니다.
그렇기 때문에 적당히 배치하도록 해요.^^
(▲ 테스트 화면)
강좌대로 잘 되는지 테스트 해봅시다.
중간, 중간 테스트 할 기회가 있었기 때문에 쉽게 따라 하셨을 것이라 생각해요.
다음 강좌에선 플레이어 유닛을 이동시키는 것에 대해 알아보도록 합시다.
- 다음 편에서 계속 -
---------- 예 제 ----------
'GameMaker강좌[GM8] > 전략게임강좌' 카테고리의 다른 글
[게임메이커강좌-전략]RTS 게임 만들기 - 4 적 유닛 (17) | 2013.07.02 |
---|---|
[게임메이커강좌-전략]RTS 게임 만들기 - 3 유닛 공격 (25) | 2013.07.01 |
[게임메이커강좌-전략]RTS 게임 만들기 - 2 유닛 이동 (14) | 2013.06.30 |
[게임메이커강좌-디펜스]간단한 디펜스게임 만들기-2 (15) | 2013.04.30 |
[게임메이커강좌-디펜스]간단한 디펜스게임 만들기-1 (31) | 2013.04.30 |
댓글