앞서 우리는 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스텝마다 적이 등장하는 것을 확인해보세요.