본문 바로가기
GameMaker강좌[GM8]/전략게임강좌

[게임메이커강좌-디펜스]간단한 디펜스게임 만들기-3-스테이지 클리어

by 타락카얀 2013. 12. 2.
728x90

 

 

GAME MAKER 강좌

 

 

KAYAN

 

 

이번에는 스테이지를 구성해보도록 합시다.

 

 

(▲ 게임 화면)

 

 

 

 

 

 

 

◈스테이지 클리어 처리(obj_system, obj_clear_stage)

 
 
스테이지를 구성하기 전에 스테이지를 클리어 했는지 실패했는지
확인해야합니다.
이것은 간단하게 global 변수로 체크하는 방법으로 합시다.
예를 들어 모든 적을 생성하면 변수를 1로 만들고, 적이 모두 없어질 때까지
HP가 0이거나, HP가 0보다 크고 적이 모두 파괴되면, 클리어 했는지 체크하는 겁니다.
그리고 몇 초후에 클리어 했는지, 아니면 실패했는지 문구를 띄우지요.
클리어 조건도 생각할 필요가 있겠지요.
클리어 조건은 게임의 HPglobal.hp가 0보다 크고 모든 적이 없을 때 클리어시키고,
실패 조건은 게임의 HP가 0일때, 게임 오버로 처리하는 것입니다.

먼저 클리어 처리 변수를 선언하도록 해요.
시스템 오브젝트인 obj_system 오브젝트의 Create 이벤트에 선언하도록 하겠습니다.

 



     ★ obj_system - Create 이벤트

     global.clear_check=0;//클리어 체크 변수



이 변수는 스테이지 마다 초기화 해야하기 때문에, 모든 룸에 배치할 수 있는
오브젝트에서 선언하는 것이 좋습니다.

다음은 스테이지를 체크할지를 설정하는 것입니다.
실패조건은 global.hp가 0일때, 클리어 조건은 모든 적이 생성된 후
모든 적이 파괴되거나 룸 상에 완전히 없어진 후에 체크하는 것입니다.
그래서 global.hp가 0보다 크면 클리어 하는 것이지요.

일단 클리어와 실패 문구 이미지를 스프라이트 이미지(spr_win, spr_lose)로 준비하도록 합니다.

 

 

(▲ 승리, 패배 이미지)

 

강좌에서는 클리어했을 때는 승리, 실패했을 때는 패배로 이미지를 준비했습니다.
다음은 승리, 패배 문구를 띄워줄 오브젝트를 만듭니다.

 

 

(▲ 클리어 문구를 띄워줄 오브젝트들)


Sprite 에 준비한 클리어 문구들을 지정합니다.
이 오브젝트는 룸의 다른 오브젝트들 보다 화면 앞에 보여야 되니, depth값을 다른 오브젝트들 보다 낮게

설정하도록 해요. 강좌에서는 간단하게 -1000값을 설정하도록 하겠습니다.

 

이제 이 오브젝트를 클리어 조건에 해당하면 생성해야겠지요.
먼저 적을 모두 생성했는지 확인해야 합니다. 이전 강좌에서는 적을 생성할 때 타임라인을 사용했지요.
타임라인(timeline0)에서 마지막 적 생성 이벤트에 클리어 변수를 1로 설정하는 것을 추가 합니다.

 

 



     ★ 타임라인(마지막 적 생성때의 이벤트) - timeline0

     it=instance_create(-80,-80,obj_en1);
     with(it){path_start(path0,1,0,1);}

     //---------------▼변수 설정 추가

     global.clear_check=1;



다시 시스템 오브젝트(obj_system)로 이동해서 End_Step 이벤트를 추가합니다.
그리고 이 클리어 문구를 띄워줄 조건이벤트를 작성하도록 합니다.
적을 모두 생성했을 때 이벤트 먼저 작성하도록 합시다.

 



     ★ obj_system - End_Step 이벤트

     //모든 적이 생성되었을 때
     if global.hp>0{//HP가 0보다 큰가?
     if global.clear_check=1{//모든 적이 생성되었었나?

     if instance_number(obj_enemy)=0{//적이 모두 파괴되어 룸에 없는가?
     instance_create(320,240,obj_win);//클리어 문구 생성(승리)
     global.clear_check=-1;//변수를 닫음
     }

     }
     }



이것은 HP가 0보다 크고, 모든 적을 생성 후에 이벤트가 발생하는 것입니다.
적이 모두 파괴되어 없어지면, 문구를 띄우는 것이지요.
문구는 화면의 중앙에 띄우도록 해요.

뷰를 사용하면 뷰의 크기가 게임의 화면 크기로 설정되고, 뷰를 사용하지 않으면 룸의 크기가 게임 화면의 크기로

설정됩니다. 강좌의 게임 화면은 640X480이기 때문에 (320, 240)좌표에 생성되도록 했습니다.


그리고 이벤트가 재실행되지 않도록 클리어 체크변수를 다른 값으로 설정해요.
강좌에선 -1값을 지정하여 재실행되지 않게 했습니다.


또 다른 조건인 HP가 0일때도 실패 문구를 띄워주어야겠지요.

 



     ★ obj_system - End_Step 이벤트

     if global.hp>0{
     if global.clear_check=1{

     if instance_number(obj_enemy)=0{
     instance_create(320,240,obj_win);
     global.clear_check=-1;
     }

     }
     }

     //---------------▼ 이벤트 추가

     else{//HP가 0보다 크지 않은가?

     if !(global.clear_check=-1){//재실행 방지
     instance_create(320,240,obj_lose);//클리어 문구 생성(패배)
     global.clear_check=-1;
     }

     }



이렇게 Else를 사용하면 HP가 0보다 크지 않을때의 이벤트를 작성할 수 있습니다.

클리어 문구를 띄우는 것까지 해보았습니다.
제대로 되는지 테스트 해봅시다.

이제 승리 했을때는 다음 스테이지로, 실패했을때는 게임오버, 그리고 모든 스테이지를 클리어했을때는
엔딩 룸으로 이동하는 것을 만들어보도록 해요.

일단 해당하는 룸들을 구성하도록 합니다. 스테이지 룸도 추가 구성하고요.

 

 

 

(▲ 룸의 순서)


룸의 순서는 대략 이렇게 구성하시면 됩니다.
스테이지 뒤에는 엔딩 룸(rm_end)을, 맨 끝에는 게임 오버 룸(rm_gameover)을 순서대로 배치하는 것입니다.
그러면 스테이지 클리어시 room_goto_next()를 사용하여 다음 스테이지 룸으로 이동하게 하고, 모든 스테이지를

거쳐가다보면 엔딩 룸(rm_end)에 다다를 것입니다.
패배하면 room_goto(게임 오버 룸)을 사용하여 마지막 룸인 게임 오버 룸(rm_gameover)으로 바로 이동시키게

하는 것이지요.
그러면 별다른 복잡한 설정없이 간단하게 처리할 수 있지요.

 

 

(▲ 엔딩 룸)

 

 

(▲ 게임 오버 룸)


룸을 만들고, 룸 내용에 맞게 꾸미도록 해요.

 

[스테이지 구성 팁]

더보기

스테이지는 이전 강좌에서 타임라인을 사용하여 시스템 오브젝트(obj_system) Alarm 0 이벤트에서
실행되게 했지요.
하지만 타임라인은 오브젝트 1개에 1개만 실행된다는 점을 생각해야 합니다.

스테이지를 구성하는 가장 간단한 방법으로는 타임라인별로 시스템 오브젝트(obj_system)를 만들어
스테이지 룸에 배치하는 것입니다.
또 다른 방법으로는 시스템 오브젝트를 Parent 로 활용하는 방법이 있지요.
즉, 현재의 시스템 오브젝트(obj_system)에서 타임라인을 실행하는 Alarm 0 이벤트를 삭제하고,
스테이지용 오브젝트를 따로 만들어 Alarm 0 이벤트만 추가해 스테이지별로 타임라인을 실행
시키는 것입니다. 그리고 Parent 에 시스템 오브젝트(obj_system)를 지정만 하면 됩니다.

     예) obj_system (parent오브젝트) - obj_stage1, obj_stage2 ...(하위 오브젝트)

게임스테이지 룸에는 스테이지용 오브젝트(obj_stage1, obj_stage2 ...)만 배치하면 되는 것입니다.
그러면 하위 오브젝트들은 알람 이벤트를 제외한 Parent 오브젝트의 이벤트들을 상속받아 실행시킬 수 있고,
하위 오브젝트들의 알람 이벤트는 별도로 실행되는 것이지요.

     이벤트 예)

 



     ★ obj_system(룸에 배치 안함, Parent 오브젝트) - Create 이벤트

     alarm[0]=60*10;


 

 



     ★ obj_stage1(룸에 배치, 스테이지용 하위오브젝트) - Alarm 0 이벤트

     timeline_index=timeline0;
     timeline_running=1;

     ★ obj_stage2(룸에 배치, 스테이지용 하위오브젝트) - Alarm 0 이벤트

     timeline_index=timeline1;
     timeline_running=1;


 



이제 이 룸으로 이동하는 것은 클리어 문구 오브젝트들에서 설정하면 됩니다.
먼저 승리 했을때 약간의 딜레이가 지난 이후, 다음 룸으로 이동하는 이벤트를 작성하도록 해요.
딜레이는 알람 이벤트를 사용합니다. 강좌에서는 Alarm 0을 사용하겠습니다.

승리 문구 오브젝트(obj_win)으로 이동해서 Create 이벤트를 추가하고, 사용할 알람을 설정하도록 합니다.

 



     ★ obj_win - Create 이벤트

     alarm[0]=180;



Alarm 0 이벤트를 추가하고, 다음 룸으로 이동시키도록 해요.

 



     ★ obj_win - Alarm 0 이벤트

     room_goto_next();



이렇게 하면 승리 문구를 약 3초간 띄우고 다음 룸(스테이지)으로 이동할 것입니다.

패배했을 때는 게임 오버룸으로 이동시켜야 겠지요.
마찬가지로 패배 문구 오브젝트(obj_lose)로 이동해서 Create 이벤트에 사용할 알람을 설정하도록 합니다.

 



     ★ obj_lose - Create 이벤트

     alarm[0]=180;



Alarm 0 이벤트를 추가하고, 다음 룸으로 이동시키도록 해요.

 



     ★ obj_win - Alarm 0 이벤트

     room_goto(rm_gameover);



이렇게 하면 패배 문구를 몇 초간 띄우고, 게임 오버 룸으로 이동할 것입니다.

와우!
클리어 처리 이벤트 설정이 끝났네요.
제대로 되는지 테스트 해보도록 해요.

 

 

(▲ 테스트 화면)

 

 

 



 


---------- 예 제 ----------

 

 

defence-1-2-스테이지예제.gmk
다운로드

 

defence-1-2-스테이지예제.exe
다운로드

 

 

 

 


300x250

댓글