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

[게임메이커강좌-액션Rpg 강좌]액션Rpg-2-인벤토리(4/4)

by 타락카얀 2013. 10. 1.
728x90

 

 

GAME MAKER 강좌

 

 

KAYAN

 

 

이번에는 필드에 아이템이 있을 때 습득하는 방법에 대해 알아보도록 합시다.

 

 

(▲ 인벤토리)

 

 

 

 

 

 

 

 

◈필드에 있는 아이템 습득(obj_item)

 

 


아이템 오브젝트들의 parent 오브젝트(obj_item)로 이동합니다.

 

 

(▲아이템! 안에 무엇이 들어있을까)


공통된 설정은 parent 오브젝트에 설정하는 것이 효율적입니다.
Create 이벤트를 추가하고 아이템 번호와 아이템 수에 관련된 변수를 선언하도록 합니다.

 



     ★ obj_item - Create 이벤트

     item=0;//아이템 번호
     item_n=1;//아이템 수량

     target_id=noone;//특정 인스턴스에게 사용하고자 할때의 목표물



강좌에선 이정도 선언하도록 하겠습니다.
아이템 설정과 같지요.

다음은 End Step 이벤트를 추가하고 아이템의 깊이를 설정하도록 해요.

 



     ★ obj_item - End Step 이벤트

     depth=floor(room_height-y);



이제 아이템을 표시해야 겠지요.
Draw 이벤트를 추가하고, 아이템을 표시하도록 해요.

 



     ★ obj_item - Draw 이벤트

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



아이템이 모여있을때는 약간 떨궈놓도록 합시다.
아이템의 parent오브젝트(obj_item)와의 충돌 이벤트에 서로 밀려나는 이벤트를 작성해 봅시다.

 



     ★ obj_item - obj_item과의 충돌 이벤트

     spd=1;
     dir=point_direction(x,y,other.x,other.y)+180;
     x+=lengthdir_x(spd,dir)*place_free(x+lengthdir_x(spd,dir),y);
     y+=lengthdir_y(spd,dir)*place_free(x,y+lengthdir_y(spd,dir));


 

이렇게 하면 같이 모여있을때 충돌하지 않는 곳까지 밀려나게 됩니다.

이제 아이템과 플레이어가 충돌했을때 [X]키를 누르면 아이템을 습득하는 것으로 해볼까요.

 



     ★obj_item - obj_item과의 충돌 이벤트

     if keyboard_check_pressed(ord("X")){

     //아이템 습득 내용

     }



아이템 습득 내용에 습득 이벤트를 작성하시면 됩니다.
여기엔 스크립트를 이용하도록 합시다.
일단 아이템이 여러개 있을 수 있으니, 최대 아이템 개수를 설정하도록 합시다.
스크립트를 하나 만들고, 여러개 이상 습득할 수 있는 아이템 목록을 작성하도록 해요.

 



     ★ 스크립트 - get_item_max

     //get_item_max(item);
     var n;
     n=1;
     switch(argument0){
     //======================= 아이템 목록 =========================

     case 0:   n=5;break;//체력 포션
     case 1:   n=5;break;//마나 포션

     //======================= 아이템 목록 =========================
     }

     return n;



이것은 목록에 없다면 최대 습득 개수(아이템 1개 슬롯)는 1개이고, 목록에 있다면 목록에 지정된 개수만큼
슬롯에 채울 수 있게 하는 것입니다.
이것은 이렇게 사용할 수 있습니다.


     예) a=get_item_max(item)//item번호를 체크해 최대 개수를 반환

다음은 위의 스크립트(get_item_max)를 사용해 인벤토리로 아이템을 추가하는 스크립트를 만들어보도록 합시다.
스크립트를 하나 추가하고, 아이템을 추가하는 이벤트를 작성하도록 해요.

 



     ★ 스크립트 - add_item

     //add_item(item,n);

     var _slot,i,_it,_it_n,_max,a;
     _it=argument0;//아이템 번호
     _it_n=argument1;//추가할 아이템 개수

     _max=get_item_max(_it);
     i=0;repeat(global.item_slot_max){
     //--------------------------최대 추가 개수가 1개일때
     if _max=1{
     if global.item_slot[i]=-1{
     global.item_slot[i]=_it;
     global.item_slot_n[i]=1;
     _it_n-=1;}}

     //--------------------------최대 추가 개수가 1개 초과일때
     if global.item_slot_n[i]<_max && _max>1 && _it_n>0{
     if global.item_slot[i]=_it || global.item_slot[i]=-1{

     global.item_slot[i]=_it;
     a=min(_it_n,_max-global.item_slot_n[i]);
     global.item_slot_n[i]+=a;
     _it_n-=a;
     }}
     //--------------------------

     if _it_n<=0{break;}
     i+=1;}


     return _it_n;//남은 개수를 반환함



이것은 아이템을 인벤토리에 추가하고, 남은 개수를 반환하는 스크립트입니다.
이제 이것을 다시 아이템 parent오브젝트의 아이템 추가 이벤트에 삽입하도록 합시다.

 



     ★obj_item - obj_item과의 충돌 이벤트

     if keyboard_check_pressed(ord("X")){

     item_n=add_item(item,item_n);//아이템을 추가하고, 남은 개수를 반환시킴
     if item_n<=0{instance_destroy();}//추가하고 아이템이 안 남았다면 아이템 오브젝트는 파기함

     }



이것은 아이템을 인벤토리에 추가하고, 아이템이 남지 않았다면 해당 아이템 오브젝트는 파기하는 것입니다.

제대로 되는지 룸에 배치해보고, 확인해봅시다.

다음은 화면에 체력과 마나, 경험치 같은 바를 표시해보도록 합시다.
화면에 표시할 바는 아래처럼 2가지로 구성됩니다.

 

 

(▲바의 구성)


0번 이미지가 수치를 표시, 1번이 뒷배경입니다.
이와 같이 3종류를 스프라이트 이미지로 구성하도록 합시다.

 

 

(▲3종류의 바 이미지)


다음은 시스템 오브젝트(obj_system)로 이동해서 바 이미지를 표시하도록 합니다.

 



     ★ obj_item - obj_item과의 충돌 이벤트

     //------------------------▼이벤트 추가
     var vx,vy,vw,vh;
     vx=view_xview[0];//뷰의 좌표
     vy=view_yview[0];
     vw=view_wview[0];
     vh=view_hview[0];

     _p=global.player_hp*192*(1/global.player_hp_max);//체력의 수치
     draw_sprite_ext(spr_hp_bar,1,vx+16,vy+16,1,1,0,c_white,1);
     draw_sprite_part_ext(spr_hp_bar,0,0,0,_p,8,vx+16,vy+16,1,1,c_white,1);

     _p=global.player_mp*192*(1/global.player_mp_max);//마나의 수치
     draw_sprite_ext(spr_mp_bar,1,vx+16,vy+26,1,1,0,c_white,1);
     draw_sprite_part_ext(spr_mp_bar,0,0,0,_p,8,vx+16,vy+26,1,1,c_white,1);

     _p=global.player_exp*192*(1/global.player_exp_max);//경험치의 수치
     draw_sprite_ext(spr_exp_bar,1,vx+16,vy+36,1,1,0,c_white,1);
     draw_sprite_part_ext(spr_exp_bar,0,0,0,_p,8,vx+16,vy+36,1,1,c_white,1);
     //------------------------▲이벤트 추가

     if instance_exists(obj_player){
     if global.inventory_open=1{
     draw_inv_tap(view_xview[0]+64,view_yview[0]+64);
     }
     }else{
     global.inventory_open=0;
     }



인벤토리보다 후위에 위치시키려면 위와 같이, 인벤토리보다 상위에 위치하려면 인벤토리설정 뒤에
추가하시면 됩니다.

 

[참고]

     수치계산)

     필요한 이미지의 길이=(체력X이미지의 최대 길이)X(1/최대 체력)

     _p=global.player_hp*192*(1/global.player_hp_max);

이제 인벤토리에서 장비함에 아이템을 장착했을 때, 능력치를 추가하는 방법에 대해 알아봅시다.
이것 역시 스크립트를 이용합시다.
스크립트를 하나 만들고, 장비함에 장착할 수 있는 아이템 목록을 설정하도록 해요.

 



     ★스크립트 - set_eqm_statistics

     //set_eqm_statistics();

     //아이템 추가 스탯
     ext_str=0;
     ext_def=0;
     ext_int=0;
     ext_dex=0;
     ext_dmg=0;

     var i;
     i=0;repeat(global.eqm_slot_max){
     switch(global.eqm_slot[i]){
     //======================= 장비 아이템 목록 =========================

     case 2:   ext_def+=3;break;
     case 3:   ext_dmg+=5;break;
     case 4:   ext_int+=2;break;
     case 5:   ext_def+=8;break;
     case 6:   ext_dex+=2;break;

     //======================= 장비 아이템 목록 =========================
     }

     i+=1;}


     //아이템으로 인한 스 합계
     global.player_str_total=global.player_str+ext_str;
     global.player_def_total=global.player_def+ext_def;
     global.player_int_total=global.player_int+ext_int;
     global.player_dex_total=global.player_dex+ext_dex;
     global.player_dmg_total=global.player_dmg+ext_dmg+floor(global.player_str_total*(1/2));



이것은 이제 시스템 오브젝트(obj_system)에서 호출하시면 됩니다.
Step 이벤트이든 Draw 이벤트이든 어디서든 호출해도 되지만,
강좌에선 Draw 이벤트에서 인벤토리가 활성화 되었을 때만, 호출하도록 하겠습니다.

 



     ★ obj_item - obj_item과의 충돌 이벤트

     var vx,vy,vw,vh;
     vx=view_xview[0];//뷰의 좌표
     vy=view_yview[0];
     vw=view_wview[0];
     vh=view_hview[0];

     _p=global.player_hp*192*(1/global.player_hp_max);//체력의 수치
     draw_sprite_ext(spr_hp_bar,1,vx+16,vy+16,1,1,0,c_white,1);
     draw_sprite_part_ext(spr_hp_bar,0,0,0,_p,8,vx+16,vy+16,1,1,c_white,1);

     _p=global.player_mp*192*(1/global.player_mp_max);//마나의 수치
     draw_sprite_ext(spr_mp_bar,1,vx+16,vy+26,1,1,0,c_white,1);
     draw_sprite_part_ext(spr_mp_bar,0,0,0,_p,8,vx+16,vy+26,1,1,c_white,1);

     _p=global.player_exp*192*(1/global.player_exp_max);//경험치의 수치
     draw_sprite_ext(spr_exp_bar,1,vx+16,vy+36,1,1,0,c_white,1);
     draw_sprite_part_ext(spr_exp_bar,0,0,0,_p,8,vx+16,vy+36,1,1,c_white,1);


     if instance_exists(obj_player){
     if global.inventory_open=1{
     draw_inv_tap(view_xview[0]+64,view_yview[0]+64);

     //------------------------▼이벤트 추가
     set_eqm_statistics();
     //------------------------▲이벤트 추가

     }
     }else{
     global.inventory_open=0;
     }



이렇게 하면 인벤토리가 활성화되었을 때, 장비를 장착하면, 바로 추가 스탯이 적용되게 됩니다.

 

휴우~ 인벤토리에 대한 파트가 끝났네요.

모두 제대로 되는지 확인해보도록 해요.

 


(▲테스트 화면)

 

이번 강좌는 꽤 길어졌네요. 헤헤~

강좌들을 주요 부분으로 나누다보니...

어째든 지루하지 않으셨는지 모르겠군요.

다음 강좌에선 적 설정에 대해 구성하도록 합시다.

 

 

 

 

-다음 강좌에서 계속-

 

 

 

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

 

 

RpgX-02.gmk
다운로드

 

RpgX-02.exe
다운로드

 

 

 

 

 

300x250

댓글