인디 게임 강좌

전체보기

모바일 상단 메뉴

본문 페이지

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

Zpink
조회: 6389
2018-05-14 21:02:37



앞서 우리는 WASD를 이용해 조종하며 마우스로 공격을 할 수 있는 플레이어를 만들었으며, 플레이어를 향해 몰려오는 적 또한 만들었습니다. 이로써 게임의 아주 기본적인 형태를 갖추게 되었지만 아직 가장 중요한 것이 빠져있습니다. 이제 우리가 얼마나 열심히 게임을 플레이했는지 수치로 보여줄 수 있는 요소가 필요합니다. 






새 오브젝트를 만들겠습니다. 이름은 objControl로 지었습니다. 이 오브젝트에는 별도의 스프라이트를 넣지 않겠습니다.






해당 오브젝트의 Create 이벤트에 다음과 같은 코드를 입력합니다.


depth = -10;

global.hp = 100;

global.kill = 0;



depth는 오브젝트의 깊이값인데, 해당 값을 조절하면 다른 오브젝트들과 이 오브젝트가 겹쳐졌을 때에 낮은 depth를 가진 오브젝트가 더욱 위로 올라와 표시됩니다. 이 오브젝트는 UI의 역할을 수행할 것이므로 다른 오브젝트들에게 가려져서는 안되므로 이렇게 depth를 조절하였습니다.


사실 이것을 만들 때 굳이 depth값을 조절하지 않고도 앞서 Effect 레이어를 따로 만들었던 것 처럼 별도의 레이어를 만드는 편이 편리할 것입니다. 특히나 UI라면 레이어를 나누는 편이 더욱 좋겠지요. 하지만 같은 레이어에서도 이렇게 depth에 따라 그 깊이가 달라지는것을 보여드리고자 여기서는 이렇게 만들어보았습니다. 레이어를 나누어 만들어보는 것은 직접 시도해보세요! 기억이 나지 않으신다면 이전에 올렸던 Part 2 의 내용을 잘 떠올려보세요. 


전역변수로 선언한 hp와 kill은 각각 플레이어의 체력, 플레이어가 죽인 적의 수를 의미합니다. 이 값들을 전역변수로 선언한 이유는 이 값을 조절할 오브젝트가 이 Control 오브젝트가 아니라 다른 오브젝트들이 될 것이기 때문입니다. 







다음으로 Add Event - > Draw -> Draw이벤트를 추가해줍니다.

게임메이커 스튜디오의 코드를 사용해보면서 자주 애용해였던 이벤트였지요. 이 이벤트에 코드를 입력하여 변수의 값을 화면에 표시할 것입니다. 






draw_rectangle_color(32,32,240,64,c_white,c_white,c_white,c_white,false);
draw_set_color(c_black);
draw_text(36,36, "HEALTH : " + string(global.hp));

draw_rectangle_color(32,64,240,96,c_white,c_white,c_white,c_white,false);
draw_set_color(c_black);
draw_text(36,68, "KILL : " + string(global.kill));
 


draw_rectangle_color(x1,y1,x2,y2,col1,col2,col3,col4,outline)은 지정된 위치에 색상이 들어간 사각형을 그려주는 함수입니다.





넣어야 할 x1,y1,x2,y2의 값은 이것을 참고하시면 됩니다. 


col1~4에는 색상의 값을 넣는데, 여기에는 4곳 다 흰색을 의미하는 상수 c_white를 입력할 것입니다. 

각각의 색상을 다르게 설정하면 그라데이션을 만들 수 있습니다. outline은 true,false를 넣을 수 있는데, 여기서는 false로 설정하였씁니다. true일 경우 속이 비고 테두리만 표시된 네모가 그려집니다.


이어진 draw_set_color(색상)은 해당 코드 아래에 그려질 도형이나 텍스트의 색상값을 지정해줍니다. 앞서 하얀색으로 사각형을 그렸으므로 그 위에 검은 글씨의 글자를 넣기 위해 이 값은 c_black으로 지정하였습니다.


그리고 draw_text를 이용해 변수값을 출력합니다. 앞서 draw_set_color의 영향으로 이 글자는 검은색이 될 것입니다.




이제 적을 공격하여 제거하면 kill 변수가 1 오르도록 만들어봅니다. objEnemy 오브젝트의 objBullet 이벤트를 클릭하여 코드 에디터를 열어봅니다.







global.kill+=1; 을 추가했습니다. 이제 적이 총알에 맞으면 kill 전역변수가 1 늘어납니다. 





다음으로 구현할 것은 플레이어가 적에게 맞았을 때 무적시간을 갖도록 하는 것입니다. 적이 플레이어에게 접근한 순간 지속적인 피해를 입히게 된다면 플레이어는 순식간에 사망하게 될 것입니다. 그러므로 탈출할 기회를 줄 수 있도록 짧은 기회를 주는 것이지요.


objPlayer의 Create 이벤트에 damage_delay=0; 이라는 코드를 입력하였습니다. 이 코드는 공격을 받았을 때 무적시간에 진입하였는지의 여부를 판단할 때 쓸 것입니다.




새 이벤트를 추가합니다. Add Event - Alarm - Alarm1을 순서대로 클릭합니다. 



Alarm1 이벤트에는 이와 같은 값을 입력합니다. image_alpha = 1; 을 입력하였는데 image_alpha는 이미지의 투명도를 나타내는 변수로, 0~1까지의 범위로 조절이 가능합니다. 그리고 damage_delay = 0;을 입력하였습니다. 이 알람은 무적시간을 해제하는데 사용할 것입니다. 무적시간을 적용하는 코드는 적에게 닿았을 때 작동하도록 적과의 충돌 이벤트에 입력할 것입니다.




Add Event - Collision - objEnemy를 순서대로 클릭하여 적 오브젝트와의 충돌 이벤트를 추가합니다.




 

if (damage_delay==0){

damage_delay = 1;

global.hp -= 10;

image_alpha =0.5;

alarm[1]= 60;

}

if(global.hp<=0){

show_message("Game Over");

game_restart();

}



앞서 조건문은 damage_delay가 0일 경우에만 작동합니다. damage_delay가 0인 경우, damage_delay를 1로 바꿔줍니다. 그리고 hp전역변수를 10 감소시킨 후, 알파값을 0.5로 조절합니다. 그리고 alarm[1]을 60스텝 후에 작동시킵니다.


딜레이가 0일 때에만 저 코드가 실행되고, 코드는 실행되자마자 딜레이를 1로 만들고 체력을 10 깎은 뒤 알람을 60스텝 후에 작동하도록 작성하였습니다. 앞서 알람 1 이벤트에 딜레이를 0으로 되돌리고 알파값을 1로 되돌리는 코드를 입력하였지요. 즉 알람이 작동되어 딜레이가 0이 되기전까지는 더 이상 공격을 받지 않게 됩니다.


아래에 적은 global.hp가 0이하가 될 때의 조건문 안에는 Game Over 라는 메시지창을 띄우고 게임을 재시작하도록 만들었습니다. 일단 게임오버 화면의 기능을 수행하긴 하겠지만 굉장히 단순하므로, 그럴싸한 게임오버 화면을 만들어 이동시키는 것도 좋은 방법입니다.



이제 objControl 오브젝트를 룸에 딱 1개만 삽입합니다.




​그리고 직접 실행해보도록 합니다. 정상적으로 만들었다면 체력과 킬 수를 이런 식으로 표현하게 됩니다.



​적에게 직접 맞아보며 피해를 입었을 시 무적시간이 적용되는지 확인해보시고, 게임오버가 출력되는지도 확인해보세요.





다음으로 적이 지속적으로 등장하여 플레이어를 괴롭히도록 만들어볼 것입니다. 현재까지 만들어낸 방법으로는 적은 고작 룸에 직접 집어넣은 수 정도만 존재하게 되므로 적을 모두 죽일 경우 아무것도 없는 허허벌판만을 보시게 될 것입니다. 그러므로 적을 가장자리에서 소환하도록 만들겠습니다.





우선 objControl 오브젝트의 속성창을 열고, Create 이벤트의 아래에


alarm[0] = 120;


을 추가합니다. 역시 알람을 이용해 일정 시간 이후에 이벤트가 작동할 수 있도록 만들 것입니다. 앞서 우리는 알람을 정해진 만큼의 딜레이를 적용하는데에만 사용하였습니다. 하지만 알람은 스스로를 계속 실행시켜 반복적인 이벤트를 만들어낼 때에도 사용할 수 있습니다. 




​objControl에 Add Event - Alarm - Alarm0을 순서대로 클릭하여 새 알람 이벤트를 추가합니다.



 

​알람0의 코드 에디터에 다음과 같이 입력합니다


 

instance_create_layer(random(room_width),choose(0,room_height),"Instances",objEnemy);

instance_create_layer(choose(0,room_width),random(room_height),"Instances",objEnemy);

alarm[0]=120;



instance_create_layer를 이용해 Instances 레이어에 새 오브젝트를 생성합니다.

첫째 줄의 인스턴스 생성 함수는 x값에 random(room_width)가 적혀있습니다. 이 값은 0부터 룸의 수평크기값 사이가 될 것입니다. 그리고 y값에는 choose(0,room_height) 가 적혀있는데, choose(n1,n2...,n16)는 괄호 안에 적혀진 값중 하나를 불러오는 역할을 합니다. 즉 y값은 0 혹은 룸의 수직 크기 값중 하나가 됩니다. 그러므로 이 코드는 objEnemy를 위쪽 가장자리, 혹은 아랫쪽 가장자리의 임의의 위치에서 생성해줍니다.


아래의 코드도 마찬가지 원리인데, 이 경우는 왼쪽 가장자리, 오른쪽 가장자리의 임의의 위치에 적을 생성하게 됩니다.


마지막으로 해당 알람을 120 스텝후에 실행시킵니다. 알람 내에서 같은 알람을 또 실행하는 것으로 이 알람이 반복되어 실행되도록 만든 것입니다.





해당 기능을 추가한 게임을 실행시켜봅니다. 가장자리에서 120스텝마다 적이 등장하는 것을 확인해보세요.

Lv1 Zpink

모바일 게시판 하단버튼

댓글

새로고침
새로고침

모바일 게시판 하단버튼

지금 뜨는 인벤

더보기+

모바일 게시판 리스트

모바일 게시판 하단버튼

글쓰기

모바일 게시판 페이징