본문 바로가기
GameMaker강좌[GM8]/RPG강좌

[게임메이커강좌-액션Rpg 강좌]액션Rpg-1-캐릭터 이동 (2/2)

by 타락카얀 2013. 9. 21.
728x90

 

 

GAME MAKER 강좌

 

 

KAYAN

 

 

 

이전 강좌 이어서 시작해봅시다.

 

 

(▲이번 강좌에서 만들 캐릭터이동)

 

 

 

 

 

 

 

 

 

◈글로벌 변수(obj_game_start)

 

 


일반 로컬 변수는 룸으로 이동할때 변경된 변수들은 보존 되지 않습니다.
하지만 RPG 에서는 룸과 룸으로 이동할때 변수 보존은 필수지요.
이럴때 사용하는 것이 global 변수입니다.
이것은 아래와 같이

     global.변수명=값

이런 식으로 구성됩니다.
예를 들면

     global.player_hp=30

이렇게 하는 것이지요.
이것은 게임에서 특정 상황을 제외하고, 게임으로 들어가기전에 한번만 설정하는 것이 좋습니다.
룸에 매회 변수 선언을 한다면 다른 룸으로 이동시 계속 초기화 되겠지요.

게임에 필요한 글로벌 변수를 생각하여 설정해보도록 합시다.
먼저 이 변수를 선언할 오브젝트(obj_game_start)를 하나 만듭니다.

 

 

(▲글로벌 변수를 설정할 오브젝트)


Room Start 이벤트를 추가하고, 게임에 필요한 변수들을 선언하도록 합니다.

 



     ★ obj_game_start - Room Start 이벤트

     global.gold=1000;//자금

     global.player_LV=1;//레벨

     global.player_hp=30;//체력
     global.player_hp_max=30;//최대 체력
     global.player_mp=30;//마나
     global.player_mp_max=30;//최대 마나

     //다른 룸으로 이동시 시작 위치
     global.map_direction=0;
     global.map_xstart=0;
     global.map_ystart=0;



     room_goto_next();//다음 룸으로 이동



마지막에 다음 룸으로 바로 이동 시켰지만, 이것은 여러분의 게임에 맞게 이동 함수는 지우고, 이벤트에 따라
다음 룸으로 이동하도록 만드시면 됩니다.
위에 것은 게임에 필요한 변수들을 글로벌 변수로 설정하는 것입니다.

아래와 같이 다른 룸보다 맨 처음에 룸을 하나 만들고, 이 오브젝트를 배치하시면 됩니다.

 

(▲다른 룸보다 위에 위치함)


이렇게 하면 다른 룸보다 먼저 실행되겠지요.



 

 


◈글로벌 변수에 따른 플레이어 설정(obj_pl)

 

 


플레이어 오브젝트(obj_pl)로 이동해서 글로벌 변수에 따른 설정을 해보도록 합시다.
Step 이벤트에, HP가 0일때 설정을 추가하도록 합니다.

 



     ★obj_pl - Step 이벤트

     if global.player_hp<=0{instance_destroy();}



플레이어가 파기될때 이펙트를 발생해보도록 할까요.

강좌에서 사용할 이펙트는 그냥 흰색 동그라미입니다.

 

 

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


이펙트로 사용할 오브젝트(obj_ef1)를 하나 만듭시다.

 

 

(▲이펙트 오브젝트)


이전 강좌에서도 많이 만들어 보셨죠. 후후-

강좌랑 달리 간단하게 1개의 애니메이션 이펙트를 만들 수도 있고, 단순한 그래픽만 생성하도록 할 수도 있습니다.

여러분 취향대로 만드시면 될것 같아요.

강좌에선 여러개를 생성하여 이펙트를 구성 할 것입니다.

 

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

 



     ★obj_ef1 - Create 이벤트

     spr=sprite_index;//스프라이트
     img=0;//서브 이미지
     fade_spd=0.05;//투명도 감소 속도
     sca=1;//확대
     sca_spd=0;//확대 속도
     rot=0;//회전
     rot_spd=0;//회전 속도
     col=c_white;//색 혼합
     alp=1;//투명도



헉! 헉!
다용도로 이용하기 위해 많은 변수를 설정했습니다.
여러분은 필요한 변수만 만들도록 해요.

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

 



     ★obj_ef1 - Draw 이벤트

     draw_sprite_ext(spr,img,x,y,sca,sca,rot,col,alp);



Step 이벤트를 추가하고, 파기되는 이벤트를 작성하도록 합니다.

 



     ★obj_ef1 - Step 이벤트

     if alp>0{alp-=fade_spd;}else{alp=0;instance_destroy();}
     rot+=rot_spd;
     sca+=sca_spd;



강좌에서는 투명도가 0이 되면 파기되도록 작성하였습니다.
다음은 중요한 깊이를 설정해야겠지요.
물론 화면 맨 앞에 표시되도록 할 수도 있고, 깊이에 따라 표시되도록 설정할 수 있습니다만,
강좌에서는 깊이에 따라 표시되도록 하겠습니다.
End Step 이벤트를 추가하고 깊이에 대한 이벤트를 작성하도록 합니다.

 



     ★ obj_ef1 - End Step 이벤트

     depth=floor(room_height-y);



이제 이 이펙트를 플레이어 파기 이벤트에서 생성하도록 해봅시다.
플레이어 오브젝트(obj_pl)로 이동해서 Destroy 이벤트를 추가하도록 합니다.

 



     ★ obj_pl - Destroy 이벤트

     repeat(8){
     it=instance_create(x,y,obj_ef1);
     it.spr=spr_effect1;//이펙트로 사용할 스프라이트 이미지를 지정
     it.img=0;
     it.sca=random_range(0.05,0.6);
     it.direction=irandom(360);
     it.speed=random_range(2,5);
     it.friction=0.1;
     }


     it=instance_create(x,y,obj_ef1);
     it.spr=spr_effect1;
     it.img=0;

     it.col=c_red;
     it.sca_spd=0.05;

     it=instance_create(x,y,obj_ef1);
     it.spr=spr_effect1;
     it.img=0;



이렇게 하면 아래와 같이 이펙트가 발생하게 됩니다.

 

(▲이펙트 발생)






◈블럭 배치 팁(obj_bl32)

 

 


맵에 일부 지역을 이동 못하도록 블럭을 배치하는 방법입니다.
이미지별로 오브젝트를 만들고 룸에 배치할때, 1~2개면 몰라도 몇수십개의 오브젝트를 일일이 선택하여

배치하기가 힘들지요.
이럴때는 아래와 같이 이동 못하는 지역을 특정 블럭과 타일을 이용하여 배치하는 것이 좀 더 효율적입니다.

 

 

(▲붉은색 오브젝트가 배치된 곳이 이동 불가능 지역)


간단해보이죠.
일단 이와 같이 배치할 수 있게 블럭 오브젝트(obj_bl32)를 하나 만들도록 합니다.
parent에 블럭들의 parent오브젝트(obj_block)을 지정하고, 룸에 배치하기 편하도록 sprite에 마스크용으로

반투명한 스프라이트를 하나 만들어 지정하도록 합니다.

그리고 이 블럭은 게임상에 표시될 필요가 없기 때문에 visible 체크 해제하고 solid를 체크하도록 합니다.

강좌에서는 32X32크기의 불은색 반투명 스프라이트를 지정했습니다.
그리고 이 오브젝트를 이동 불가능한 지역에 배치하면 됩니다.







◈다른 룸으로 이동시킬 포탈(obj_portal, obj_portal_next, obj_portal_prev)

 
다른 룸으로 이동 가능한 포탈을 만들어 보도록 합시다.
먼저 parent로 사용할 오브젝트를 하나 만들고, 실제 배치할 오브젝트를 만들도록 합니다.
강좌에선 다음 룸으로 이동(obj_portal_next), 이전 룸으로 이동(obj_portal_prev)할 수 있는 오브젝트 2가지를

만들도록 하겠습니다.

     예)obj_portal(parent 오브젝트) - obj_portal_next, obj_portal_prev(실제 배치될 하위 오브젝트)

 

 

(▲포탈 오브젝트)


실제 배치되는 오브젝들에 parent(obj_portal)을 지정해주고, sprite에 룸에 배치시 확인이 쉬운 스프라이트를

지정하도록 합니다.
그리고 룸에 보일 필요가 없다면 visible을 체크 해제하도록 해요.
만약 애니메이션이나 그래픽적으로 보일 필요가 있는 포탈이라면 애니메이션 스프라이트를 지정하셔도 됩니다.
이때는 visible을 체크하셔야겠죠.


먼저 다음 룸으로 이동 시킬 오브젝트를 설정해보도록 하겠습니다.
다음 룸으로 이동시킬 포탈 오브젝트(obj_portal_next)으로 이동해서, Create 이벤트를 추가하고 필요한 변수들을
선언하도록 합니다.

 



     ★ obj_portal_next - Create 이벤트

     check=0;



이것은 다음 룸으로 이동하였다가 돌아왔을 때, 현재 위치라면 이벤트를 발생시키지 못하도록 체크할 변수를

설정하는 것 입니다.
그리고 Step 이벤트를 추가하고, 다음 룸으로 이동시킬 이벤트를 작성하도록 합니다.

 



     ★ obj_portal_next - Step 이벤트

     if place_meeting(x,y,obj_player){//플레이어와 충돌하는지 체크
     if check=0{

     with(obj_player){global.map_direction=direction;//다음 룸에 갔을 때 방향은 현재 방향으로 설정
     direction+=180;//만약 방향을 따로 지정하지 않았을 때는 반대방향으로 설정
     x+=lengthdir_x(20,direction);
     y+=lengthdir_y(20,direction);
     }

     room_goto_next();//다음 룸으로 이동

     check=1;

     }}

     else{
     if check=1{check=0;}//플레이어가 포탈을 벗어날 경우 다시 리셋함
     }



이것은 포탈을 통해 다음 룸으로 시키는 것입니다.
먼저 플레이어와 충돌 했을때 다음 룸으로 이동했다가 돌아왔을 경우 설정을 미리 해놓는 것입니다.
그리고 다음룸으로 이동하지요.
만약 돌아왔을 때는 포탈에 위치한 상태가 되었을 때, 바로 다음 룸으로 이동하지 못하도록 check변수를

닫아 놓는 것입니다.

다음 룸으로 이동했다가 돌아왔을때 로컬 변수가 초기화되지 않냐구요?
오브젝트들의 현재 로컬 변수는 물론 위치같은 것도 보존 시킬수도 있습니다.
이것은 간단하게 룸의 Setting탭Persistent를 체크만 하면 됩니다.
이렇게 하면 게임을 재시작(룸 재시작이 아닌 게임 리셋)을 하지 않는 한, 룸에 배치된 현재 오브젝트들의

설정들이 보존되는 것이죠.
물론 체크를 하지 않거나, 체크 해제하면 설정들이 보존되지 않습니다.
코드로는

     room_persistent=true 또는 room_persistent=false

이렇게 설정할 수 있습니다. 이것은 현재 룸에서만 설정할 수 있습니다.

[참고]
room_set_persistent(ind,persistent)로 다른 룸을 설정할 수 있으나, 해제는 현재룸만 가능.

다음 룸으로 이동 시킬 포탈이 완성되었습니다.
이전 룸으로 돌아가는 포탈(obj_portal_prev) 또한 만들어 보도록 합시다.

마찬가지로 오브젝트(obj_portal_prev)를 하나 만든 후, visible은 체크해제 합니다.

그리고 Create 이벤트를 추가하고, 필요한 변수들을 선언하세요.

 



     ★ obj_portal_prev - Create 이벤트

     check=0;



그리고 Step 이벤트를 추가하고, 이전 룸으로 돌아가는 이벤트를 구성하도록 합니다.

 



     ★ obj_portal_prev - Step 이벤트

     if place_meeting(x,y,obj_player){
     if check=0{

     with(obj_player){global.map_direction=direction;
     direction+=180;
     x+=lengthdir_x(20,direction);
     y+=lengthdir_y(20,direction);
     }

     room_goto_previous();

     check=1;

     }}

     else{
     if check=1{check=0;}
     }



이것은 플레이어가 포탈에 닿았을때 이전 룸으로 이동 시키는 것입니다.
이벤트 자체는 다음 룸으로 이동시키는 포탈 오브젝트(obj_portal_next)의 설정과 같습니다.
만약 특정한 룸으로 이동시키고자 할때는

     room_goto(이동할 룸이름)

을 사용하세요.

 

 

(▲다음룸으로 이동시키는 포탈)

 

 

(▲이전룸으로 이동시키는 포탈)


포탈은 맵의 지형과 순서에 맞게 해당 오브젝트들을 배치시키시면 됩니다.

 

다음은 방향을 보존시키기위해 오브젝트(obj_system)를 하나 만들도록 해요.

 

 

(▲시스템 오브젝트)


그리고 Create 이벤트를 추가하고, 필요한 변수들의 선언과 좌표 및 방향을 갱신시키도록 합니다.

 



     ★ obj_system - Create 이벤트

     global.game_over=0;//게임 오버

     with(obj_player){
     direction=global.map_direction;//방향 설정
     global.map_xstart=x;//게임오버되어 플레이어를 재생성했을 경우를 위해 좌표를 기록함.
     global.map_ystart=y;
     }



이렇게 하면 룸을 이동했을 때 방향을 갱신하게 되지요.
이 오브젝트는 룸에 시작했을때 작동되야 하기 때문에 좌표 및 방향 갱신이 필요한 룸마다 배치하시면 됩니다.

 

현재까지한 설정이 제대로 되는지 룸에 적절히 배치하고 테스트 해봅시다.

 

 

(▲ 테스트 화면)


강좌가 조금 복잡했지만, 필드 형식의 게임이라 그리 어렵지는 않았을 거라 생각됩니다.
다음 강좌에서는 아이템을 담고 사용할 수 있는 인벤토리 창에 대해 만들어 보도록 해요.

 

 



 

-다음 강좌에서 계속-

 

 

 

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

 

RpgX-01.gmk
다운로드

 

RpgX-01.exe
다운로드

 

 

 

300x250

댓글