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

[게임메이커강좌-기타]짝맞추기 게임 만들기

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

 

 

 

 

 

 

◈짝맞추기 게임

 


이번 강좌에선 간단한 짝맞추기 게임을 한번 만들어 봅시다.

 

 

(▲강좌에서 만들 짝맞추기 게임)


여러장의 카드를 필드에 깔고, 2개의 카드를 선택하여 카드가 같으면 없어지고,
모두 맞추게 되면 클리어하는 게임입니다.
이것이 이번에 만들 게임입니다.
뭐 간단하다면 간단할 수 있고, 어렵게 생각하면 어려울 수도 있는 유형의 게임이죠.
일단 한번 따라서 만들어 보아요.

 

 

 

 

 


◈ 카드의 이미지 구성

 


일단 카드에 필요한 이미지를 구성합니다.
강좌에선 간단하게 4장만 사용하도록 하겠습니다.

 

 

(▲강좌에서 사용할 이미지)


뒷면 1장, 앞면으로 사용할 카드는 4장으로 구성됩니다.
물론 더 많이 사용하시려면 많이 구성하시면 됩니다.

먼저 뒷면으로 사용할 스프라이트를 하나 추가하고(spr_card_close), 이미지를 구성합니다.

 

 

(▲뒷면 이미지 1장)


앞면으로 사용할 스프라이트를 하나 추가하고(spr_card), 서브 이미지에 여러장의 이미지를 추가합니다.

강좌에서는 4장을 추가하도록 하지요.

 

 

(▲앞면 이미지 2장이상, 강좌에선 4장을 사)


이미지를 추가했으니, 오브젝트에서 카드를 설정해봅시다.

 

 

 

 



◈카드 설정(obj_card)

 


카드로 사용할 오브젝트를 하나 만들고(obj_card), 스프라이트에 이전에 준비한 카드 스프라이트(spr_card)를 지정합니다.

 

 

(▲카드 오브젝트)


Create 이벤트를 추가하고, 필요한 변수들을 선언하도록 해요.

 



     ★ obj_card - Create 이벤트

     ind=0;//카드 이미지 번호
     select=0;//선택되었는지 체크하는 변수, 0은 카드 뒷면 표시, 1은 카드 앞면 표시



ind는 카드의 이미지 번호를 사용합니다.
그리고 선택되었는지, 선택되었는지를 체크를 select 변수로 하도록 하지요.

이제 카드를 표시해야겠지요.
Draw이벤트를 추가하고, 이미지 표시에 대한 이벤트를 작성합니다.

 



     ★ obj_card - Draw 이벤트

     //카드 비선택. 카드 뒷면 표시
     if select=0{
     draw_sprite_ext(spr_card_close,0,x,y,1,1,0,c_white,1);
     }
     //카드 선택. 카드 앞면 표시
     else{
     draw_sprite_ext(sprite_index,ind,x,y,1,1,0,c_white,1);//ind변수 값에 따라 이미지가 바뀜
     }



선택이 안되었을 때는 카드 뒷면을 표시하고, 선택이 되었을 때는 카드 앞면을 표시하게 됩니다.

참고: sprite_index는 게임메이커의 내장변수로써 오브젝트에서 지정한 스프라이트의 값과 같습니다.

이제 게임을 구성해보도록 합시다.

 




◈게임 구성(obj_system)

 


전반적으로 게임을 제어할 수 있는 오브젝트(obj_system)를 하나 구성합시다.

 

 

(▲게임을 제어할 시스템 오브젝트)


이것은 게임에서 맨 앞에 위치해야하니 depth를 -10000정도로 설정하도록 하겠습니다.
Create이벤트를 추가하고, 필요한 변수들을 선언합니다.

 



     ★ obj_sytem - Create 이벤트

     global.card_list=ds_list_create();//카드의 값을 넣을 변수 생성

     card_max=4;//강좌에서 사용할 카드는 총 4개!
     i=0;
     repeat(card_max){
     repeat(2){ds_list_add(global.card_list,i);}//짝을 맞추어야 하니 4X2로 카드를 추가함.
     i+=1;}
     ds_list_shuffle(global.card_list);//카드를 섞음


     global.card_slot[0]=noone;//첫번째 선택 카드 슬롯
     global.card_slot[1]=noone;//두번째 선택 카드 슬롯
     card_check=0;//2개를 선택되었을 때 체크할 변수



ds_list는 게임메이커에서 지원하는 데이터 구조물로써, 여러가지 값을 넣고 사용할 때, 빠르고,

사용하기 쉬운 상당히 유용한 기능입니다.
예를 들자면 여러가지를 집어넣을 수 있는 만능 가방같은 것이라 보면 됩니다.
여기에 카드 번호를 넣고 섞는 것이죠.
그러면 카드를 배치할 때 랜덤으로 배치할 수 있는 것이죠.


이것을 사용할때는 ds_list_create()로 만들고 사용해야하며, 필요 없을 때는 ds_list_destroy()로

파기합니다. 그리고 값을 추가할 때는 ds_list_add(id,값)로 추가하면 됩니다.

참고 : noone은 상수로 -4이며, 인스턴스가 없을 때 값으로 사용합니다.

Room End 이벤트를 추가하고, ds_list를 파기하도록 합니다.

 

 
     ★ obj_sytem - Room End 이벤트

     ds_list_destroy(global.card_list);



이제 카드를 배치하는 이벤트를 구성해볼까요.
먼저 카드를 배치되는 위치에 사용할 오브젝트(obj_pos)를 하나 만듭니다.
스프라이트를 지정하고, 배치할 위치만 알 필요가 있기 때문에 visible은 체크해제합니다.

 

 

(▲이 오브젝트의 위치에 카드를 생성함)


스프라이트 이미지는 룸에 배치할때 어느 위치에 배치되는지 알기 쉬운 이미지로 구성하시면 됩니다.
예를 들면,

 

 

(▲카드가 배치될 위치)


룸에 이것처럼 배치하는 것이지요.

위치로 사용할 오브젝트를 만들었으니, 이제 카드를 이것이 있는 곳에 배치하는 이벤트를 작성해봅시다.
일단 카드를 배치하기 전에 약간의 지연시간후 배치하는 것이 좋겠지요. 이것은 알람을 이용하도록

합시다.
시스템 오브젝트(obj_system)로 이동해서 Create 이벤트에 사용할 알람을 설정합니다.

 



     ★ obj_sytem - Create 이벤트

     alarm[0]=60;
     game_check=0;//카드를 배치했는지 체크함



다음은 알람이벤트를 추가하고, 카드 오브젝트를 생성합니다.

 



     ★ obj_sytem - Alarm 0 이벤트

     n=instance_number(obj_pos);
     for(i=0;i<n;i+=1;){
     it=instance_find(obj_pos,i);//카드 위치 오브젝트를 검색.

     if i<ds_list_size(global.card_list){
     aa=instance_create(it.x,it.y,obj_card);//그 위치에 카드를 생성
     aa.ind=ds_list_find_value(global.card_list,i);//생성된 카드에 카드 번호를 부여
     }

     }

     ds_list_clear(global.card_list);//카드를 모두 생성했으니 카드 값을 비움
     game_check=1;//배치 완료



이렇게 하면 위치 오브젝트가 있는 곳에 카드가 생성됩니다.



 

 



◈카드 선택(obj_card)

 


이제 카드를 선택하는 이벤트를 작성해봅시다.

카드 오브젝트(obj_card)로 이동해서 마우스 이벤트인 Left Released 이벤트를 추가합니다.

 



     ★ obj_card - Left Released 이벤트

     if select=0{

     if global.card_slot[0]=noone{//첫번째 슬롯에 카드선택이 없으면 현재 카드를 입력
     global.card_slot[0]=id;select=1;
     }

     else{
     if global.card_slot[1]=noone{//두번째 슬롯에 카드선택이 없으면 현재 카드를 입력
     global.card_slot[1]=id;select=1;}
     }

     }



이렇게 하면 마우스 왼쪽 버튼을 눌렀을 때, 첫번째 카드 슬롯이 비었으면 현재 선택한 카드 id를 입력하고,
그렇지 않으면, 두번째 카드 슬롯이 비었을 때 현재 카드 id를 입력합니다(여기서 id는 인스턴스의 id를 말함).
두 슬롯이 모두 차있으면 다른 카드를 선택해도 선택이 안되겠지요.

이제 카드 설정은 모두 끝났습니다. 굳!
다음은 선택된 카드가 같은지 체크하는 이벤트를 작성해봅시다.

시스템 오브젝트(obj_system)로 이동해서, Step이벤트를 추가합니다.
그리고 두 슬롯을 체크하도록 합니다.

 



     ★ obj_sytem - Step 이벤트

     if card_check=0{
     if instance_exists(global.card_slot[0]) && instance_exists(global.card_slot[1]){//두 슬롯을 체크
     alarm[5]=30;//체크 지연 시간
     card_check=1;//카드 체크
     }
     }



현재 카드 슬롯을 체크해서 모두 있다면 약간의 지연시간 후, 카드가 틀리면, 다시 뒷면을 표시하고,

같으면 두 카드를 파기합니다.

알람 이벤트(Alarm 5)를 추가하고, 카드를 체크하도록 합니다.

 



     ★ obj_sytem - Alarm 5 이벤트

     if instance_exists(global.card_slot[0]) && instance_exists(global.card_slot[1]){
     if global.card_slot[0].ind=global.card_slot[1].ind{//두 슬롯이 같으면 두 카드는 파기함
     with(global.card_slot[0]){instance_destroy();}
     with(global.card_slot[1]){instance_destroy();}
     }}

     with(obj_card){select=0;}//틀리면 카드를 덮음

     global.card_slot[0]=noone;
     global.card_slot[1]=noone;//카드 슬롯을 비움
     card_check=0;//체크 끝



이렇게 하면 2개의 카드를 체크해서, 카드가 같으면 2개의 카드는 파기시킵니다.
그리고 틀리면 다시 카드를 덮게 되는 것이죠.
체크가 끝나면 카드 슬롯을 다시 원상태로 비움니다(noone을 할당).






◈ 클리어 이벤트(obj_system)

 


이번엔 카드를 모두 클리어했을 때 이벤트를 만들어 봅시다.
시스템 오브젝트의 Step 이벤트에, 아래와 같이 작성합니다.

 



     ★ obj_sytem - Step 이벤트

     if game_check=1{
     if !(instance_exists(obj_card)){
     alarm[10]=90;
     game_check=-1;}
     }



이것은 카드를 모두 배치했을 때를 조건으로, 룸 상에 카드가 있는지를 체크합니다.
그리고 약간의 지연시간후 게임을 재시작할지 아니면 다른 룸으로 이동할지 작성할 수 있겠지요.
강좌에선 그냥 재시작하도록 하겠습니다. 헤헤~

지연시간을 위해 알람 이벤트(Alarm 10)를 추가합니다.

 



     ★ obj_sytem - Alarm 10 이벤트

     room_restart();



이렇게 하면 클리어했을 때 룸을 재시작하게 됩니다.

시작과 클리어시 그에 해당하는 문구를 띄워볼까요.

 

 

(▲시작시 이미지와 클리어 이미지. spr_ingame)


강좌에선 위와같이 2개의 이미지를 사용해보도록 하겠습니다.
시스템 오브젝트(obj_system)에서 이미지를 표시합니다.

 



     ★ obj_sytem - Draw 이벤트

     //시작을 알리는 이미지
     if alarm[0]>0{
     draw_sprite_ext(spr_ingame,0,320,240,1,1,0,c_white,1);
     }

     //클리어 이미지
     if alarm[10]>0{
     draw_sprite_ext(spr_ingame,1,320,240,1,1,0,c_white,1);
     }



모든 설정이 끝났습니다.
룸에 배치해보고 잘 되는지 확인해봅시다.

 

 

(▲룸에 배치)


룸에 배경을 깔고, 오브젝트는 위치 오브젝트(obj_pos)와 시스템 오브젝트(obj_system)를 배치하시면

됩니다.

 

 

(▲테스트 화면)


음... 배경이 허전하니 이상하군요.

만드실 때는 취향대로 입맛에 맞게 만드시면 됩니다.

 

 

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

 

match1-1.gmk
다운로드

 

match1-1.exe
다운로드

 

 

 

300x250

댓글