인디 게임 강좌

전체보기

모바일 상단 메뉴

본문 페이지

[게임메이커] 처음 만나는 GMS2 // 10. 슈팅게임 제작 5

Zpink
조회: 5886
2018-05-14 21:21:26



앞서 과정을 통해 우리는 어느정도 게임을 구현해내었습니다. 그러나 아직 가장 중요한 것이 남았습니다. 우리는 어떻게 해야 게임에서 승리할 수 있을지 목표를 설정해볼 것입니다. 그리고 더욱 그럴싸한 게임을 만들기 위해서 타이틀 화면 및 메뉴를 넣어볼 것입니다.




타이틀 화면 제작


​ 



스프라이트 모음의 title 폴더에는 총 6가지의 스프라이트가 들어있습니다. 이 모든 스프라이트를 불러오도록 하겠습니다.




여기서 메뉴를 구성하는 3장의 스프라이트는 한 묶음으로 불러올 것입니다.




로고 - sprLogo

메뉴 버튼 - sprButton

로고꾸밈 - sprLogo2

게임 클리어 - sprClear



 타이틀 화면 전용 룸을 꾸미기 위해 새 룸을 생성합니다. 룸의 이름은 rmTitle으로 짓겠습니다. 몇번 게임을 테스트하시면서 눈치채셨겠지만 룸은 여러분들의 화면에 보이게 될 게임의 모습입니다. 이 룸은 용도에 따라서 여러개가 될 수도 있습니다. 여태까지 우리가 사용했던 기존의 룸이 게임의 실질적인 플레이장면을 묘사하기 위한 것이었다면 이번에 추가한 룸은 게임의 메뉴를 나타나기 위한 것입니다. 









본격적으로 타이틀 화면 관련 오브젝트를 만들기에 앞서, 앞서 우리가 objControl에 선언했던 전역변수인 global.hp와 global.kill을 지웁니다. GML을 설명할 때 언급하였지만 게임 진행에 영향을 주는 전역변수의 경우 게임의 초기에 선언하는 것이 오작동을 막는 길이기 때문입니다. 해당 변수들은 타이틀 화면 오브젝트를 만들때 다시 입력해줄 것입니다.






다음으로 새로운 오브젝트를 만듭니다. 이 오브젝트는 로고로 사용할 것입니다. 이름을 objLogo로 짓고, 스프라이트는 로고 스프라이트를 사용합니다.


이 로고 오브젝트 하나를 통해 로고 이미지와 메뉴를 모두 화면에 뿌릴 것입니다. 그러므로 rmTitle에는 잡다한 것을 넣지 말고 이것 딱 하나만 적절한 위치에 넣어주시면 됩니다.




로고 오브젝트의 Create 이벤트에 이와같은 코드를 삽입합니다.


global.hp = 100;

global.kill = 0;

global.clearpoint = 0;

for(var i=0;i<3;i++){

var btn = instance_create_layer(96,440 + 64 * i, "Instances",objButton);

btn.image_single = i;

}


​방금 objControl에서 지운 global.hp와 global.kill을 여기에 입력하였습니다. 그리고 새로운 전역변수인 global.clearpoint를 선언하였습니다. 이 변수는 클리어 점수로 사용할 것입니다. 이후 이지모드와 하드모드의 차이를 처치해야 할 몬스터의 수로 나눌 것이기 때문에 따로 선언하게 된 것입니다.

그리고 반복문을 이용하여 objButton 이라는 오브젝트를 생성하도록 하였는데, 이 오브젝트는 아직 만들지 않았지만 버튼의 기능을 할 오브젝트입니다. 이 오브젝트의 이미지 넘버를 i의 값으로 지정하므로, 반복문이 작동하는 동안 0,1,2의 이미지 넘버를 가진 버튼 오브젝트가 만들어질 것입니다.


버튼 오브젝트의 자세한 사항은 아래에 서술하도록 하겠습니다.





다음으로 새 이벤트를 생성합니다. Draw - Draw를 순서대로 클릭합니다. 



draw_self();

draw_sprite(sprLogo2,0,0,288);



0,288 위치에 로고를 꾸미는 두번째 스프라이트를 삽입할 것입니다. draw_self는 스스로를 드로우하는 기능인데, 드로우를 이용하게 되면 오브젝트에 지정된 스프라이트가 화면에 보이지 않기 때문입니다.







다음으로 앞서 코드로만 작성하였던 버튼 오브젝트를 생성할 것입니다. 오브젝트의 이름은 objButton으로 짓고, 스프라이트는 버튼 스프라이트로 지정합니다.


 버튼 스프라이트 3종류를 불러오시며 확인하셨겠지만, 버튼 스프라이트의 구성은 '이지모드' '하드모드' 그리고 '게임종료'입니다. 우리는 이에 맞는 기능들을 모두 구현해볼 것입니다.



Add Event - Mouse - Left Pressed 이벤트를 추가합니다. 이 이벤트는 마우스 왼쪽 버튼으로 해당 오브젝트를 클릭할 경우 작동할 것입니다.



해당 이벤트에 코드를 삽입합니다.



switch(image_single){

case 0 :

global.hp = 200;

global.clearpoint = 10;

room = rmGame;

break;

case 1 :

global.hp = 50;

gobal.clearpoint = 100;

room = rmGame;

break;

case 2 :

game_end();

break;

​}





버튼을 클릭하였을 때 작동되는 기능은 이미지의 번호에 따라서 달라질 것입니다. 0번째는 이지모드입니다.  이지모드에서는 체력 200을 가지며, 10마리의 적을 죽이면 게임이 끝납니다. 1번째는 하드모드입니다. 체력을 50 소지하며, 100마리의 적을 죽여야 게임이 끝나는 아주 무시무시한 모드입니다. 2번째는 게임 종료입니다. 굳이 설명할 필요가 없겠지요.




로고 오브젝트를 rmTitle의 오른쪽 하단에 삽입하고, 게임을 실행하여 정상적으로 화면에 내용물들이 출력되는 확인해봅니다.



클리어 화면 제작





다음은 게임 클리어 오브젝트를 만들 것입니다. 이지모드이든 하드모드이든 게임을 클리하면 클리어 오브젝트가 생성되도록 할 것입니다. 오브젝트의 이름은 objClear로, 스프라이트는 sprClear로 지정합니다.





Create 이벤트를 추가합니다.



audio_stop_sound(sndBgm);

alarm[0]=180;




이 오브젝트가 생성되면 배경음이 중단되고, 알람0이 180 스텝후에 실행될 것입니다.



그리고 알람 0 이벤트를 추가합니다. 



알람 0의 코드창에는 game_restart(); 를 입력하였습니다. 만일 클리어 후 다음 룸으로 넘어간다던지, 기타 다른 무엇인가를 실행할 것이라면 이 곳에 넣어주면 됩니다.


요악하자면, 이 오브젝트가 나오는 순간 음악이 멈추고, 180스텝 후에 게임이 재시작 된다는 것입니다.



다음으로 objEnemy의 objBullet과의 충돌 이벤트를 수정할 것입니다.





objBullet과의 충돌 이벤트에 이런 코드를 추가합니다.


if (global.kill >=global.clearpoint){

with(objControl)

instance_destroy();

with(objEnemy){

var blood = instance_create_layer(x,y,"effect",objBlood);

blood.image_single = choose(0,1,2);

blood.alarm[0] = 120;

instance_destroy();

}

instance_create_layer(352,320,"Instances",objClear);

}




if (global.kill >=global.clearpoint){


global.clearpoint는 앞서 우리가 선언하였던 죽여야 할 적 수입니다.

적을 죽인 수인 global.kill의 수가 죽여야 할 수보다 많다면 아래의 코드가 실행되는 것입니다.



with(objControl)

instance_destroy();


우선 화면에 점수를 표시하는 objControl오브젝트를 제거합니다.



with(objEnemy){

var blood = instance_create_layer(x,y,"effect",objBlood);

blood.image_single = choose(0,1,2);

blood.alarm[0] = 120;

instance_destroy();

}


그리고 나머지 적 오브젝트들이 모두 혈흔 오브젝트를 남기고 제거되도록 설정하였습니다. 이 때 혈흔 오브젝트들은 0,1,2중 하나의 이미지 번호를 갖고 알람 0을 120 스텝후에 작동시킬 것입니다. 알람0에 들어간 내용은 아시다시피 인스턴스 제거이므로 이 혈흔은 120스텝후에 사라지겠지요.



instance_create_layer(352,320,"Instances",objClear);


그리고 마지막으로 게임 클리어 오브젝트를 생성하는 것으로 마무리합니다.








이제 잘 되는지 확인해보고 끝내도록 하겠습니다.


정말 간단한 수준의 게임을 만들어보았는데요, 이를 통해 게임메이커 스튜디오2의 기초적인 기능들을 모두 한번씩은 써보았을 것입니다. 이를 응용하면 다양한 게임을 만들어볼 수 있으리라 생각됩니다. 

여기까지 만들어진 소스입니다. 작동이 안되는 것이 있을 시에는 비교해보시면서 확인해보셔도 좋습니다.


https://drive.google.com/file/d/1ztxIvRsc5wfJt9NHZlrNs55eTdVcGowu/view?usp=sharing




Lv1 Zpink

모바일 게시판 하단버튼

댓글

새로고침
새로고침

모바일 게시판 하단버튼

지금 뜨는 인벤

더보기+

모바일 게시판 리스트

모바일 게시판 하단버튼

글쓰기

모바일 게시판 페이징