본문 바로가기
GameMaker강좌[GM8]/기타장르강좌

[게임메이커강좌-기타]운석 피하기게임 만들기

by 타락카얀 2013. 6. 15.
728x90

 

 

 

 

 

 

 

 

 

◈운석 피하기 게임만들기

 


이번 강좌에선 간단한 운석피하기 게임을 한번 만들어 봅시다.

 

 

(▲운석 피하기 게임)

 

 

(▲플레이어가 운석에 충돌하면 하이 스코어창을 띄움)


위의 화면처럼 플레이어가 운석을 피하면서 계속 유지하게 되면 점수를 얻고,
운석에 충돌하면 게임이 끝납니다. 이때 하이스코어 창을 띄워 자신의 점수를 기입하게 됩니다.
그리고 점수를 기입후 다시 게임을 재시작하게 하지요. 게임종료는 기본기능인 ESC키를 누릅니다.

네. 이것이 이 게임의 대략적인 구조 설명입니다.
이제 게임을 만들어 보도록 해요.

일단 간단하게 운석과 플레이어, 배경의 이미지들을 구성해봅시다.

 

 

(▲게임에 사용할 이미지들)

spr_stone : 운석 이미지 (32X32)
spr_player : 플레이어 이미지 (32X48)
spr_effect : 이펙트 이미지 (64X64)
background0 : 배경 (640X480)

스프라이트들은 중심점을 적당히 맞춰주고, 마스크 설정 역시 간단하게 합시다.
강좌에서 중심점은 모두 가운데로 맞춰주었습니다.
그리고 마스크 설정스프라이트 설정에서 Modify Mask버튼을 눌러 설정하시면 됩니다.

마스크 설정은 충돌 범위만큼 지정하시면 됩니다.

 

 

 

 

 


◈플레이어(obj_player)

 


먼저 플레이어설정입니다.
일단 오브젝트를 하나 만들고, 스프라이트를 지정합니다.

 

 

(▲플레이어 오브젝트)


그리고 Step이벤트를 추가하고, 이동에 대해 설정해봅시다.

 



     ★obj_player - Step이벤트

     spd=5;//이동 속도
     if keyboard_check(vk_left){x-=spd;}
     if keyboard_check(vk_right){x+=spd;}
     if keyboard_check(vk_up){y-=spd;}
     if keyboard_check(vk_down){y+=spd;}



물론 위에 것은 키 이벤트에서도 작성할 수 있습니다.
하지만 긴 이벤트도 아니고 짧은 이벤트라 같이 모아서 관리 하는 것이 좋겠지요.
앞으로 멋진 게임을 만드실려면 키이벤트 코드도 알고 계시는 것이 유용하게 사용하실 수 있을 겁니다.

다음은 이동을 룸 내에서만 이동하도록 제한해야겠지요.
Step이벤트에 이어서 작성합니다.

 



     ★obj_player - Step이벤트

     x=max(0,min(x,room_width));
     y=max(0,min(y,room_height));



이것은 오브젝트가 룸 밖으로 나가지 못하게 하는 것입니다.

플레이어의 설정이 끝났네요.
다음은 운석에 대해 설정해봅시다.


 




◈운석(obj_enemy, obj_stone)

 


네. 이번엔 운석입니다.
parent로 사용할 오브젝트를 먼저 만들고(obj_enemy), 운석용 오브젝트(obj_stone)를 따로 만듭니다.
그리고 스프라이트를 지정하고, 관리하기 편하도록 parent를 지정합니다.


     예) obj_enemy(parent오브젝트) - obj_stone(하위오브젝트)

 

 

(▲운석 오브젝트)


운석이 내려오다 화면을 벗어나면 더 이상 게임상에 있을 필요가 없지요.
Step이벤트 추가하고 파기 이벤트를 작성합시다.

 



     ★obj_stone - Step이벤트

     if y>room_height+64{instance_destroy();}



간단하게 운석이 완성되었네요. 와우~ 참 쉽죠!
하지만 그냥 운석이 내려오면 밋밋해보일 것 같군요.
좋아요. 이것이 내려오면서 회전하도록 만들어봅시다.

먼저 Create이벤트를 추가하고, 아래처럼 회전 값에 대한 변수를 넣어봅시다.

 



     ★obj_stone - Create이벤트

     rot_speed=choose(-5,5);



choose는 지정한 값중 랜덤으로 하나를 선택할 수 있는 함수입니다.
이것은 회전을 시계방향으로 회전할지 반시계방향으로 회전할지를 임의로 지정하게 하는 값을
변수로 지정하는 것이에요.

다음은 Step이벤트에서 이미지를 회전시킵니다.

 



     ★obj_stone - Step이벤트

     image_angle+=rot_speed;



image_angle은 이미지를 회전시키는 내장 변수입니다.
이전에 지정한 변수값으로 이미지를 회전시키는 것이죠.

※참고로 이 image_angle마스크도 같이 회전되어 충돌 이벤트에 영향을 미칩니다.

다음은 플레이어 오브젝트에서 이 운석에 대한 충돌 이벤트를 작성해야합니다.


 

 

 

 


◈충돌 이벤트설정(obj_player)

 


플레이어 오브젝트로 이동해서, 운석의 parent에 대한 충돌이벤트(obj_enemy)를 추가합니다.

 



     ★obj_player - obj_enemy와의 충돌이벤트

     instance_destroy();



그냥 파기되는 것보다 이펙트를 발생하며 파기하는 것이 좋겠지요.
이펙트 오브젝트(obj_effect)를 하나 만들고 스프라이트를 지정합니다.

 

 

(▲이펙트 오브젝트)


Create이벤트를 추가하고, 필요한 변수들을 선언합니다.

 



     ★obj_effect - Create 이벤트

     alp=1;//투명도
     fade_spd=0.05;//페이드 아웃 변화치



Draw이벤트를 추가하고, 이미지를 표시합니다.

 



     ★obj_effect - Draw 이벤트

     draw_sprite_ext(sprite_index,0,x,y,1,1,0,c_white,alp);



다음은 Step이벤트를 추가하고, 투명도의 변화치를 이벤트로 작성합니다.

 



     ★obj_effect - Draw 이벤트

     if alp>0{alp-=fade_spd;}else{instance_destroy();}



이것은 투명도가 0이되면 파기하게 하는 것입니다.

다음은 이 이펙트를 플레이어가 파기될 때 발생하도록 설치해야겠지요.
플레이어 오브젝트로 이동해서 Destroy이벤트를 추가하고, 이벤트를 작성합니다.

 



     ★obj_player - Destroy 이벤트

     instance_create(x,y,obj_effect);



이렇게 하면 플레이어가 파기될 때 이펙트를 발생하게 됩니다.
이제 운석이 내려오도록 게임을 구성 해보도록 합시다.

 

 

 

 



◈게임 구성(obj_system)

 


일단 스테이지를 구성시킬 오브젝트(obj_sytem)를 하나 만듭니다.

 

 

(▲시스템 오브젝트)


Create이벤트를 추가하고, 점수같이 게임에 필요한 변수들을 선언합니다.

 



     ★obj_system - Create 이벤트

     global.plscore=0;//게임 점수



이제 운석을 게임상에 생성하도록 해야겠지요.
이것은 알람이벤트를 이용하여 이벤트를 작성해보록 해요.
먼저 Create이벤트에 사용할 알람 이벤트를 지정합니다.

 



     ★obj_system - Create 이벤트

     game_delay=20;//운석 생성 대기 시간
     alarm[0]=60*2;//운석 생성 알람 이벤트



다음은 운석 발생용 알람 이벤트(Alarm 0)를 추가하고, 운석을 생성합니다.

 



     ★obj_system - Alarm 0 이벤트

     if instance_exists(obj_player){//플레이어 오브젝트가 있을 때만 운석을 생성

        _x=irandom_range(0,room_width);
        _y=-64;
        it=instance_create(_x,_y,obj_stone);
        it.vspeed=5;//생성되면 아래(270방향)으로 내려옴

     }

     alarm[0]=game_delay;//알람 이벤트를 대기 시간후에 다시 실행되도록 함



이것은 룸에 플레이어가 있을 때만 운석을 생성하게 하는 것입니다.
그리고 생성되는 운석은 임의의 위치에 생성하게 되지요.

※참고로 irandom_range지정된 값 사이의 임의의 정수를 반환시킵니다.

이제 점수 설정을 해볼까요. 마찬가지로 알람이벤트를 이용해봅시다.
Create이벤트에 사용할 알람 이벤트를 지정합니다.

 



     ★obj_system - Create 이벤트

     alarm[1]=10;//점수 카운터로 사용할 알람 이벤트



그리고 알람 이벤트(Alarm 1)를 추가하고, 점수 카운터에 대한 설정을 합니다.

 



     ★obj_system - Alarm 1 이벤트

     if instance_exists(obj_player){
        if global.plscore mod 50 = 0 {if game_delay>1{game_delay-=1;}}

        //운석 생성 대기시간을 단축시킴.

        global.plscore+=1;//점수를 추가함
     }

     alarm[1]=5;//알람 이벤트를 다시 실행하도록 함



이것은 운석 생성 이벤트와 마찬가지로 플레이어가 있을 때만 이벤트를 발생시킵니다.
그리고 어느 정도씩 점수를 추가하게 되며, 점수가 일정 수치(강좌에선 50점)가 되면,
운석 생성 대기시간을 점점 단축시키게 됩니다. 한마디로 게임의 난이도를 점점 올리게 되는 것이죠.

다음은 화면에 점수를 표시하도록 합시다.
먼저 문자를 표시하기 위해 폰트 하나를 추가합니다.

 

 

(▲점수를 표시할 폰트)


음. 한 50정도의 크기로 만들어볼까요.
그리고 Draw이벤트를 추가하고, 이벤트를 작성합니다.

 



     ★obj_system - Draw 이벤트

     draw_set_halign(fa_center);//폰트 가로로 정렬
     draw_set_valign(fa_middle);//폰트 세로로 정렬
     draw_set_font(font50);//폰트 설정
     draw_text_color(320,240,global.plscore,c_white,c_white,c_white,c_white,0.8);



이것은 화면 가운데에 흰색 글자로 점수를 표시하게 됩니다.

draw_set_halign글자를 가로로 정렬하게 하는 함수입니다.
여기 사용할 수 있는 인자는 fa_left, fa_center, fa_right입니다.


draw_set_valign글자를 세로로 정렬하게 하는 함수입니다.
여기 사용할 수 있는 인자는 fa_top, fa_middle, fa_bottom입니다.

 

 

이제 기본적인 게임 시스템은 끝났습니다.
다음은 하이스코어 창을 표시하는 것에 대해 설정해봅시다.

 





◈하이스코어 표시(obj_restart)

 


먼저 하이스코어 창을 표시할 오브젝트(obj_restart)를 만듭니다.

 

 

(▲하이스코어용 오브젝트)


이 오브젝트는 하이스코어를 표시하고 게임을 재시작하게 합니다.
알람 이벤트를 이용하여, 약간의 지연시간후 하이스코어를 표시하도록 합시다.


먼저 Create이벤트를 추가하고, 사용할 알람을 지정합니다.

 



     ★obj_restart - Create 이벤트

     alarm[0]=60;



다음은 알람이벤트를 추가하고, 하이스코어 표시에 대한 이벤트를 작성합니다.

 



     ★obj_restart - Alarm 0 이벤트

     highscore_show(global.plscore);//하이 스코어
     room_restart();//현재 게임 재시작(룸 재시작)



이제 이 오브젝트를 플레이어의 Destroy이벤트에 설치만 하면 됩니다. 아자!

플레이어 오브젝트로 이동해서 Destroy이벤트에 이 오브젝트를 생성하도록 합니다.

 



     ★obj_player - Destroy 이벤트

     instance_create(x,y,obj_restart);



이렇게 하면 플레이어가 운석에 맞아 파기 되면, 약간의 지연시간 후에 하이스코어 창을 띄우고,
게임을 재시작하게 됩니다.

 

 

 

 

 

 

◈ 룸에 배치

 

 

이제 룸을 생성하고, 배경과 오브젝트들을 배치하고 테스트 해봅시다.

 

 

(▲룸에 배치)


오브젝트는 게임 시스템 오브젝트(obj_system)플레이어 오브젝트(obj_player)를 배치하시면 됩니다.
그리고 룸 스피드60정도가 적당합니다.

 

 

(▲테스트)


드디어 완성되었군요.
원하는 대로 잘 작동이 되는지 확인해 봅시다.

 

 


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

 

피하기게임X1.gmk
다운로드

 

피하기게임X1.exe
다운로드

 

 

 

 

300x250

댓글