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

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

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

이번에는 포션같이 아이템을 사용하는 방법에 대해 만들어 봅시다.

 

 

(▲인벤토리)

 

 

 

 

◈인벤토리에서 포션사용

 


아이템 사용은 오브젝트를 따로 이용하여 설정할 것입니다.
일단 아이템 오브젝트로 사용하기 위해 스프라이트 이미지(spr_item_inst)를 하나 준비하도록 해요.

 

 

(▲ 아이템 이미지)


이 이미지는 필드에서 아이템 꾸러미로 사용될 거에요.
이 아이템을 습득하게 되면 거기에 설정된 아이템이 추가가 되는 것이죠.
다음은 오브젝트를 parent(obj_item)과 실제 배치될 오브젝트(obj_item0, obj_item1, ...)를 각각 만들도록 해요.
     예)obj_item(parent 오브젝트) - obj_item0, obj_item1, ... (실제 배치되는 하위 오브젝트)

 

 

(▲아이템 오브젝트)


그리고 하위 오브젝트에는 아이템 꾸러미 이미지를 sprite에 지정하고 parentparent오브젝트(obj_item)

지정하세요. 실제 배치되는 아이템 오브젝트를 하나 선택후 Create 이벤트를 추가해, 아이템 번호와 아이템 수에

관련된변수들을 만들도록 해요.
강좌에선 obj_item0 을 체력 포션으로 설정하겠습니다.

 



     ★ obj_item0 - Create 이벤트

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



아이템 번호는 이전에 준비한 아이템 스프라이트와 인벤토리 설정과 일치해야 설정하기가 쉽습니다.

다음은 이 포션을 사용했을 때, 어떤 효과가 있는지 이벤트가 필요하겠지요.
필요할때만 실행할 수 있도록 사용자 정의 이벤트를 이용하도록 합시다.
User Defined 0 이벤트를 추가하고, 사용했을 때의 효과를 이벤트로 작성하도록 해요.

 



     ★ obj_item0 - User Defined 0 이벤트

     visible=0;//사용할 때는 보이지 않음

     //------------------이벤트 시작-------------------

     _point=30;//체력을 30 회복 시켜줌

     if global.player_hp<global.player_hp_max-_point{global.player_hp+=_point;}//체력을 _point양만큼 회복
     else{global.player_hp=global.player_hp_max;}

     //------------------이벤트 종료-------------------

     instance_destroy();



이것은 체력 아이템을 사용했을 때의 효과를 이벤트로 작성한 것입니다.
먼저 사용했을 때는 필드에 보일 필요가 없기 때문에 visible을 0으로하여 화면에 표시하지 않습니다.
다음은 플레이어의 HP를 30정도 올려준 후에 파기하게 되는 것이죠.

이제 장비를 제외한 이렇게 포션처럼 사용할 수 있는 오브젝트들의 목록을 작성하여 관리해야합니다.
왜냐하면 인벤토리에서도 목록을 체크해야하기 때문입니다.
스크립트(set_use_item) 하나를 만들고, 아이템 목록에 관한 이벤트를 작성합시다.

 



     ★ 스크립트 - set_use_item

     //set_use_item(item);
     var _obj;
     _obj=-1;//오브젝트가 없다면 -1을 반환시킴

     switch(argument0){
     //======================= 아이템 목록 =========================
     case 0: _obj=obj_item0;break;//체력 포션
     case 1: _obj=obj_item1;break;//마나 포션





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

     return _obj;



오브젝트는 상수값으로 최소 0값을 지닙니다.
따라서 오브젝트가 있을 때는 0보다 크니, 오브젝트가 없다면 음수 값으로 반환시키면 되는 것이죠.
그리고 이것을 인벤토리 스크립트에서 체크하도록 하면 되는 것입니다.

     사용예)
     a=set_use_item(item)
     if set_use_item(item)>=0{아이템 사용 이벤트}



다시 인벤토리 스크립트(draw_inv_tap)로 돌아가서 버튼을 이용한 아이템 사용 이벤트를 추가하도록 해요.

 

 

(▲버튼을 이용하여 아이템을 사용해보자)


이벤트는 스크립트의 끝에 쯤 추가하시면 됩니다.
(어디에 하든 상관없지만, 아이템 보관함과 장비함 설정에 영향을 주지 않도록 두 설정 뒤에 해야함).

 



     ★스크립트 - draw_inv_tap

     var i,k,mx,my,_pos_x,_pos_y,_w,_h,_x,_y,mbc_L,mbp_L,mbr_L,mbp_R;
     mx=mouse_x;
     my=mouse_y;
     mbc_L=mouse_check_button(mb_left);
     mbp_L=mouse_check_button_pressed(mb_left);
     mbr_L=mouse_check_button_released(mb_left);
     mbp_R=mouse_check_button_pressed(mb_right);
     _pos_x=view_xview[0]+64;
     _pos_y=view_yview[0]+64;
     _w=32;
     _h=32;




     //-------------인벤토리 설정---------------

     ...

     //-------------인벤토리 설정---------------

     //-------------장비함 설정---------------

     ...

     //-------------장비함 설정---------------



     //---------------------------아이템 드래그 중일때 아이템 표시
     if !(global.item_pick_slot=-1) && _drag_on=1{
     if global.item_slot[global.item_pick_slot]>=0{
     draw_sprite_ext(spr_item,global.item_slot[global.item_pick_slot],mx,my,1,1,0,c_white,0.5);}}

     if !(global.eqm_pick_slot=-1) && _drag_on=1{
     if global.eqm_slot[global.eqm_pick_slot]>=0{
     draw_sprite_ext(spr_item,global.eqm_slot[global.eqm_pick_slot],mx,my,1,1,0,c_white,0.5);}}


     //----------------------------▼이벤트 추가

     //---------------------------사용하기 버튼 설정

     _x=_pos_x+16;//버튼의 위치
     _y=_pos_y+328;
     _w=64;_h=16;//버튼의 크기(넓이와 높이)
     if mx>_x && my>_y && mx<_x+_w && my<_y+_h{
     c=c_red;draw_rectangle_color(_x-1,_y-1,_x+_w,_y+_h,c,c,c,c,1);//버튼에 위치하면 테두리모양으로 표시
     if mbp_L && global.item_select>=0{//아. 버튼을 눌렀는가?

     //-----------------------------
     _slot=global.item_select;
     _it=global.item_slot[_slot];
     if !(_it=-1){_use=set_use_item(_it);
     if _use>=0{//선택된 아이템 슬롯에 사용 가능한 아이템이 있는가?
     if global.item_slot_n[_slot]>=1{
     _aa=instance_create(-1000,-1000,_use,);//해당 아이템을 룸밖에 생성함
     with(_aa){event_user(0);}//아이템 사용 설정이 있는 사용자 이벤트 호출
     }

     if global.item_slot_n[_slot]>1{global.item_slot_n[_slot]-=1;}//사용이 끝난 아이템을 삭제함
     else{global.item_slot[_slot]=-1;global.item_slot_n[_slot]=0;}
     }}
     //-----------------------------

     }}
     //----------------------------▲이벤트 추가

     if !(mbc_L){global.item_pick_slot=-1;global.eqm_pick_slot=-1;}//아이템 선택 초기화


     //드래그 On/Off
     if mbp_L{if _drag_on=0{_drag_x=mx;_drag_y=my;_drag_on=5;}}
     if _drag_on=5{if point_distance(mx,my,_drag_x,_drag_y)>2{_drag_on=1;}}
     if !(mbc_L){_drag_on=0;}



주요 코드마다 설명이 있지만, 이것은 사용하기 버튼을 눌렀을 때, 아이템을 사용하는 것입니다.
아이템을 사용했을 때 룸 밖에 생성하는 것은 게임에 직접적인 영향을 주지 않기 위해서 입니다.
그리고 사용했을 때, 아이템이 여러개 있다면 1개씩 감소시키고, 만약 개수가 0개가 된다면
해당 아이템이 있는 슬롯을 비우게 하는 것이죠.

제대로 되는지 테스트 해봅시다.
음. 적용이 되는지 아무런 정보가 없으니 모르겠군요.
아래와 같이 플레이어의 스탯 정보를 표시해보도록 합시다.

 

 

(▲플레이어의 스탯 정보)


이것쯤이야! 글자 표시하는 방법은 이전에도 많이 해보셨죠?
글자 표시는 장비함 설정 뒤와 사용하기 버튼 이벤트 사이에 작성하시면 됩니다.

 



     ★스크립트 - draw_inv_tap

     var i,k,mx,my,_pos_x,_pos_y,_w,_h,_x,_y,mbc_L,mbp_L,mbr_L,mbp_R;
     mx=mouse_x;
     my=mouse_y;
     mbc_L=mouse_check_button(mb_left);
     mbp_L=mouse_check_button_pressed(mb_left);
     mbr_L=mouse_check_button_released(mb_left);
     mbp_R=mouse_check_button_pressed(mb_right);
     _pos_x=view_xview[0]+64;
     _pos_y=view_yview[0]+64;
     _w=32;
     _h=32;
     //-------------인벤토리 설정---------------

     ...

     //-------------인벤토리 설정---------------

     //-------------장비함 설정---------------

     ...

     //-------------장비함 설정---------------


     //----------------------------▼이벤트 추가



     draw_set_font(font0);
     _x=_pos_x+20;//자금이 표시되는 곳의 좌표
     _y=_pos_y+288;
     draw_text_color(_x,_y,string(global.gold),c_white,c_white,c_white,c_white,1);//자금 표시


     _x=_pos_x+380;//스탯치가 표시되는 곳의 좌표
     _y=_pos_y+16;
     i=0;repeat(9){
     switch(i){
     case 0: tt1="LV";tt2=string(global.player_LV);break;
     case 1: tt1="HP";tt2=string(global.player_hp);break;
     case 2: tt1="MP";tt2=string(global.player_mp);break;
     case 3: tt1="EXP";tt2=string(global.player_exp)+"/"+string(global.player_exp_max);break;
     case 4: tt1="STR";tt2=string(global.player_str_total);break;
     case 5: tt1="DEF";tt2=string(global.player_def_total);break;
     case 6: tt1="INT";tt2=string(global.player_int_total);break;
     case 7: tt1="DEX";tt2=string(global.player_dex_total);break;
     case 8: tt1="DMG";tt2=string(global.player_dmg_total);break;


     default : tt1="";tt2="";
     }
     draw_text_color(_x,_y,string(tt1),c_black,c_black,c_black,c_black,1);//스탯 정보 표시
     draw_text_color(_x+32,_y,string(tt2),c_red,c_red,c_red,c_red,1);//스탯치 표시
     _y+=12;i+=1;}

     //----------------------------▲이벤트 추가

     //---------------------------아이템 드래그 중일때 아이템 표시
     if !(global.item_pick_slot=-1) && _drag_on=1{
     if global.item_slot[global.item_pick_slot]>=0{
     draw_sprite_ext(spr_item,global.item_slot[global.item_pick_slot],mx,my,1,1,0,c_white,0.5);}}

     if !(global.eqm_pick_slot=-1) && _drag_on=1{
     if global.eqm_slot[global.eqm_pick_slot]>=0{
     draw_sprite_ext(spr_item,global.eqm_slot[global.eqm_pick_slot],mx,my,1,1,0,c_white,0.5);}}


     //---------------------------사용하기 버튼 설정

     ...

     //---------------------------사용하기 버튼 설정


     if !(mbc_L){global.item_pick_slot=-1;global.eqm_pick_slot=-1;}//아이템 선택 초기화


     //드래그 On/Off
     if mbp_L{if _drag_on=0{_drag_x=mx;_drag_y=my;_drag_on=5;}}
     if _drag_on=5{if point_distance(mx,my,_drag_x,_drag_y)>2{_drag_on=1;}}
     if !(mbc_L){_drag_on=0;}



이것은 글자를 표시하는 것입니다.
표시하는 수만큼 반복문을 통해 표시했지만, 하나하나 표시하셔도 됩니다.

플레이어의 HP(global.player_hp)를 조금 감소 시키고, 다시 테스트 해봅시다.
체력이 회복되나요?
만약 안된다면, 사용하기 버튼 설정 부분과, 아이템의 User Defined 이벤트를 다시 확인해보도록 해요.

다음은 아이템을 슬롯에서 제거하는 방법에 대해 알아보도록 합시다.

 

 

(▲ 아이템 버리기 버튼. 누르면 해당 슬롯의 아이템이 제거됨.)


버리기 버튼 이벤트는 사용하기 버튼 설정 뒤에 추가하시면 됩니다.
이전에 인벤토리 설정에서 오른쪽 버튼을 클릭해 아이템 슬롯을 비우는 설정을 만들어 보았죠?
설정은 그것과 같은 것입니다.

 



     ★스크립트 - draw_inv_tap

     var i,k,mx,my,_pos_x,_pos_y,_w,_h,_x,_y,mbc_L,mbp_L,mbr_L,mbp_R;
     mx=mouse_x;
     my=mouse_y;
     mbc_L=mouse_check_button(mb_left);
     mbp_L=mouse_check_button_pressed(mb_left);
     mbr_L=mouse_check_button_released(mb_left);
     mbp_R=mouse_check_button_pressed(mb_right);
     _pos_x=view_xview[0]+64;
     _pos_y=view_yview[0]+64;
     _w=32;
     _h=32;
     //-------------인벤토리 설정---------------

     ...

     //-------------인벤토리 설정---------------

     //-------------장비함 설정---------------

     ...

     //-------------장비함 설정---------------

     //---------------------------스탯 정보 표시

     ...

     //---------------------------스탯 정보 표시

     //---------------------------드래그 아이템 표시

     ...

     //---------------------------드래그 아이템 표시

     //---------------------------사용하기 버튼 설정

     ...

     //---------------------------사용하기 버튼 설정

     //----------------------------▼이벤트 추가

     //-------------------아이템 제거하기 버튼 설정


     _x=_pos_x+111;//버튼의 위치
     _y=_pos_y+328;
     _w=64;_h=16;//버튼의 크기(넓이와 높이)
     if mx>_x && my>_y && mx<_x+_w && my<_y+_h{//마우스 포인터가 버튼에 위치하는가?
     c=c_red;draw_rectangle_color(_x-1,_y-1,_x+_w,_y+_h,c,c,c,c,1);
     if mbp_L && global.item_select>=0{//버튼을 클릭했는가?
     //---------------
     _slot=global.item_select;

     global.item_slot[_slot]=-1;//선택된 아이템 슬롯을 비움
     global.item_slot_n[_slot]=0;
     //---------------
     }}

     //----------------------------▲이벤트 추가

     if !(mbc_L){global.item_pick_slot=-1;global.eqm_pick_slot=-1;}//아이템 선택 초기화


     //드래그 On/Off
     if mbp_L{if _drag_on=0{_drag_x=mx;_drag_y=my;_drag_on=5;}}
     if _drag_on=5{if point_distance(mx,my,_drag_x,_drag_y)>2{_drag_on=1;}}
     if !(mbc_L){_drag_on=0;}



컥! 뭔가 이벤트가 길어진 느낌이군요.
이것은 버리기 버튼을 눌렀을 때 선택한 슬롯만 초기화시키는 것입니다.
게임 상에서는 슬롯을 비우는 것 같은 효과를 보이지요.

이어서 닫기 버튼을 눌렀을 때 인벤토리를 닫아보도록 합시다.

 

 

(▲인벤토리 닫기 버튼)


닫기 버튼 이벤트는 버리기 버튼 설정 뒤에 추가하시면 됩니다.

 



     ★스크립트 - draw_inv_tap

     ...

     //---------------------------사용하기 버튼 설정

     ...

     //---------------------------사용하기 버튼 설정

     //---------------------------버리기 버튼 설정

     ...

     //---------------------------버리기 버튼 설정

     //----------------------------▼이벤트 추가

     //---------------------닫기 버튼
     _x=_pos_x+160;//닫기 버튼의 위치
     _y=_pos_y;
     _w=16;_h=16;//닫기 버튼의 크기
     if mx>_x && my>_y && mx<_x+_w && my<_y+_h{//마우스 포인터가 버튼에 위치 했는가?
     if mbp_L{//클릭했는가?
     global.item_select=-1;global.item_pick_slot=-1;//모든 인벤토리 설정을 초기화함
     global.eqm_select=-1;global.eqm_pick_slot=-1;
     global.inventory_open=0;//인벤토리를 닫음
     }}

     //----------------------------▲이벤트 추가

     if !(mbc_L){global.item_pick_slot=-1;global.eqm_pick_slot=-1;}//아이템 선택 초기화


     //드래그 On/Off
     if mbp_L{if _drag_on=0{_drag_x=mx;_drag_y=my;_drag_on=5;}}
     if _drag_on=5{if point_distance(mx,my,_drag_x,_drag_y)>2{_drag_on=1;}}
     if !(mbc_L){_drag_on=0;}



간단하죠? 굳!
그냥 버튼을 클릭했을 때, 아이템 선택에 관련된 변수들을 초기화하고, 인벤토리 창(global.inventory_open) 변수를
0으로해 창을 닫는 것입니다.

제대로 작동되는지 테스트 해보도록 해요.

이왕 만든김에 마우스 더블클릭했을 때 아이템 사용하기 설정을 추가해볼까요?

 



     ★ 스크립트 - draw_inv_tap

     var i,k,mx,my,_pos_x,_pos_y,_w,_h,_x,_y,mbc_L,mbp_L,mbr_L,mbp_R;
     mx=mouse_x;
     my=mouse_y;
     mbc_L=mouse_check_button(mb_left);
     mbp_L=mouse_check_button_pressed(mb_left);
     mbr_L=mouse_check_button_released(mb_left);
     mbp_R=mouse_check_button_pressed(mb_right);
     _pos_x=view_xview[0]+64;
     _pos_y=view_yview[0]+64;
     _w=32;
     _h=32;

     draw_sprite_ext(spr_inv_tap,0,_pos_x,_pos_y,1,1,0,c_white,1);
     draw_set_font(font0);

     //-------------인벤토리 설정---------------

     _slot=0;//slot id
     for(k=0;k<8;k+=1;){
     for(i=0;i<5;i+=1;){
     _x=_pos_x+16+(_w*i);
     _y=_pos_y+16+(_h*k);

     if global.item_slot[_slot]>=0{
     draw_sprite_ext(spr_item,global.item_slot[_slot],_x,_y,1,1,0,c_white,1);

     if global.item_slot_n[_slot]>1{
     c=c_black;draw_text_color(_x,_y,string(global.item_slot_n[_slot]),c,c,c,c,1);}
     }

     if mx>_x && my>_y && mx<_x+_w && my<_y+_h{
     if mbp_L{

     //----------------------------▼이벤트 삽입

     if item_db_click=0{item_db_click=20;}//슬롯을 1번 클릭(딜레이를 설정함)
     else{//슬롯을 2번 클릭했는가?
     if global.item_select=_slot{
     _it=global.item_slot[_slot];
     if !(_it=-1){_use=set_use_item(_it);
     if _use>=0{//슬롯에 포션같이 사용가능한 아이템이 있는가?
     if global.item_slot_n[_slot]>=1{//개수가 1개이상인가?
     _aa=instance_create(-1000,-1000,_use,);
     with(_aa){event_user(0);}//아이템을 생성하여 사용하기 설정을 호출함
     }

     if global.item_slot_n[_slot]>1{global.item_slot_n[_slot]-=1;}//아이템을 감소시킴
     else{global.item_slot[_slot]=-1;global.item_slot_n[_slot]=0;}
     }}}
     item_db_click=0;}

     //----------------------------▲이벤트 삽입
     global.item_select=_slot;
     if global.item_pick_slot=-1{global.item_pick_slot=_slot;}
     }

     if mbr_L{

     //-----아이템 보관함내 변경
     if global.eqm_pick_slot=-1{
     if !(global.item_pick_slot=-1){
     _it=global.item_slot[_slot];
     _it_n=global.item_slot_n[_slot];

     global.item_slot[_slot]=global.item_slot[global.item_pick_slot];
     global.item_slot_n[_slot]=global.item_slot_n[global.item_pick_slot];
     global.item_slot[global.item_pick_slot]=_it;
     global.item_slot_n[global.item_pick_slot]=_it_n;
     }}
     else{
     //----- 장비함으로 아이템 이동
     if global.item_slot[_slot]=-1{
     global.item_slot[_slot]=global.eqm_slot[global.eqm_pick_slot];
     global.item_slot_n[_slot]=global.eqm_slot_n[global.eqm_pick_slot];
     global.eqm_slot[global.eqm_pick_slot]=-1;
     global.eqm_slot_n[global.eqm_pick_slot]=0;
     }
     else{//아이템 보관함 슬롯에 아이템이 있을때 교체
     _it=global.item_slot[_slot];
     _it_n=global.item_slot_n[_slot];

     if get_eqm_slot_match(global.eqm_pick_slot,_it)=1{
     global.item_slot[_slot]=global.eqm_slot[global.eqm_pick_slot];
     global.item_slot_n[_slot]=global.eqm_slot_n[global.eqm_pick_slot];
     global.eqm_slot[global.eqm_pick_slot]=_it;
     global.eqm_slot_n[global.eqm_pick_slot]=_it_n;
     }
     }
     }

     //왼쪽 버튼을 눌렀다 떼었을 때
     }

     //-----아이템 보관함으로부터 아이템을 버림
     if mbp_R{
     if global.item_slot[_slot]>=0{
     global.item_slot[_slot]=-1;
     global.item_slot_n[_slot]=0;
     }}
     //-----아이템 보관함으로부터 아이템을 버림


     }

     if global.item_select=_slot{c=c_red;draw_rectangle_color(_x-1,_y-1,_x+_w,_y+_h,c,c,c,c,1);}

     _slot+=1;}}


     _x=_pos_x+208;
     _y=_pos_y+256;
     if global.item_select>=0{img=global.item_slot[global.item_select];
     if img>=0{draw_sprite_ext(spr_item_info,img,_x,_y,1,1,0,c_white,1);}
     }

     //-------------장비함 설정---------------

     ...

     //-------------장비함 설정---------------

     //---------------------------스탯 정보 표시

     ...

     //---------------------------스탯 정보 표시


     ...


     //----------------------------▼이벤트 추가(스크립트 끝부분에 추가)
     if item_db_click>0{item_db_click-=1;}else{item_db_click=0;}//더블클릭 초기화
     //----------------------------▲이벤트 추가



이것은 아이템을 클릭했을 때, 약간의 딜레이를 주고, 그 시간 안에 1번 더 클릭하면
더블클릭으로 처리해 아이템을 사용하게 하는 것입니다.
의외로 단순하죠.

인벤토리 설정을 다시 한번 확인해봅시다.

더보기

[인벤토리 스크립트]

 

 
     ★스크립트 - draw_inv_tap

     var i,k,mx,my,_pos_x,_pos_y,_w,_h,_x,_y,mbc_L,mbp_L,mbr_L,mbp_R;
     mx=mouse_x;
     my=mouse_y;
     mbc_L=mouse_check_button(mb_left);
     mbp_L=mouse_check_button_pressed(mb_left);
     mbr_L=mouse_check_button_released(mb_left);
     mbp_R=mouse_check_button_pressed(mb_right);
     _pos_x=view_xview[0]+64;
     _pos_y=view_yview[0]+64;
     _w=32;
     _h=32;

     draw_sprite_ext(spr_inv_tap,0,_pos_x,_pos_y,1,1,0,c_white,1);
     draw_set_font(font0);
     //=====================인벤토리 설정=====================
     _slot=0;//slot id
     for(k=0;k<8;k+=1;){//vertical
     for(i=0;i<5;i+=1;){//horizon
     _x=_pos_x+16+(_w*i);
     _y=_pos_y+16+(_h*k);

     if global.item_slot[_slot]>=0{
     draw_sprite_ext(spr_item,global.item_slot[_slot],_x,_y,1,1,0,c_white,1);

     if global.item_slot_n[_slot]>1{
     c=c_black;draw_text_color(_x,_y,string(global.item_slot_n[_slot]),c,c,c,c,1);}
     }

     //---------------아이템 선택
     if mx>_x && my>_y && mx<_x+_w && my<_y+_h{
     if mbp_L{
     //---------------아이템 더블클릭하여 사용하기

     if item_db_click=0{item_db_click=20;}else{
     if global.item_select=_slot{
     _it=global.item_slot[_slot];
     if !(_it=-1){_use=set_use_item(_it);if _use>=0{
     if global.item_slot_n[_slot]>=1{
     _aa=instance_create(-1000,-1000,_use,);
     with(_aa){event_user(0);}
     }

     if global.item_slot_n[_slot]>1{global.item_slot_n[_slot]-=1;}
     else{global.item_slot[_slot]=-1;global.item_slot_n[_slot]=0;}
     }}}
     item_db_click=0;}
     //---------------아이템 더블클릭하여 사용하기
     global.item_select=_slot;
     if global.item_pick_slot=-1{global.item_pick_slot=_slot;}
     }

     if mbr_L{
     //---------------아이템 보관함내 아이템 이동
     if global.eqm_pick_slot=-1{
     if !(global.item_pick_slot=-1){
     _it=global.item_slot[_slot];
     _it_n=global.item_slot_n[_slot];

     global.item_slot[_slot]=global.item_slot[global.item_pick_slot];
     global.item_slot_n[_slot]=global.item_slot_n[global.item_pick_slot];
     global.item_slot[global.item_pick_slot]=_it;
     global.item_slot_n[global.item_pick_slot]=_it_n;
     }}
     else{
     //---------------장비함으로부터 아이템 보관함으로 아이템 이동
     if global.item_slot[_slot]=-1{
     global.item_slot[_slot]=global.eqm_slot[global.eqm_pick_slot];
     global.item_slot_n[_slot]=global.eqm_slot_n[global.eqm_pick_slot];
     global.eqm_slot[global.eqm_pick_slot]=-1;
     global.eqm_slot_n[global.eqm_pick_slot]=0;
     }
     else{
     _it=global.item_slot[_slot];
     _it_n=global.item_slot_n[_slot];

     if get_eqm_slot_match(global.eqm_pick_slot,_it)=1{
     global.item_slot[_slot]=global.eqm_slot[global.eqm_pick_slot];
     global.item_slot_n[_slot]=global.eqm_slot_n[global.eqm_pick_slot];
     global.eqm_slot[global.eqm_pick_slot]=_it;
     global.eqm_slot_n[global.eqm_pick_slot]=_it_n;
     }
     }
     }
 
     }

     //---------------아이템 버리기
     if mbp_R{
     if global.item_slot[_slot]>=0{
     global.item_slot[_slot]=-1;
     global.item_slot_n[_slot]=0;
     }}


     }
     //---------------선택된 슬롯 표시

     if global.item_select=_slot{c=c_red;draw_rectangle_color(_x-1,_y-1,_x+_w,_y+_h,c,c,c,c,1);}

     _slot+=1;}}

     //=====================인벤토리 설정=====================

     _x=_pos_x+208;
     _y=_pos_y+256;
     if global.item_select>=0{img=global.item_slot[global.item_select];
     if img>=0{draw_sprite_ext(spr_item_info,img,_x,_y,1,1,0,c_white,1);}
     }

     //=====================장비함 설정=====================
     _w=32;
     _h=32;

     _slot=0;//slot id

     i=0;repeat(global.eqm_slot_max){

     switch(i){
     case 0:ex1=272;ey1=64;break;//투구
     case 1:ex1=272;ey1=128;break;//갑옷

     case 2:ex1=208;ey1=128;break;//왼쪽 무기
     case 3:ex1=336;ey1=128;break;//오른쪽 무기

     case 4:ex1=272;ey1=192;break;//부츠

     case 5:ex1=208;ey1=16;break;//기타1
     case 6:ex1=240;ey1=16;break;//기타2
     case 7:ex1=272;ey1=16;break;//기타3

     default:ex1=272;ey1=64;
     }

     _x=_pos_x+ex1;
     _y=_pos_y+ey1;


     //---------------아이템 장착 가능할 때 장착 가능한 슬롯 표시
     if global.item_pick_slot>=0{
     if get_eqm_slot_match(_slot,global.item_slot[global.item_pick_slot])=1{
     draw_set_alpha(0.5);
     c=c_red;draw_rectangle_color(_x,_y,_x+_w,_y+_h,c,c,c,c,0);
     draw_set_alpha(1);
     }}

     if global.eqm_pick_slot>=0{
     if get_eqm_slot_match(_slot,global.eqm_slot[global.eqm_pick_slot])=1{
     draw_set_alpha(0.5);
     c=c_red;draw_rectangle_color(_x,_y,_x+_w,_y+_h,c,c,c,c,0);
     draw_set_alpha(1);
     }}

     if global.eqm_slot[_slot]>=0{
     draw_sprite_ext(spr_item,global.eqm_slot[_slot],_x,_y,1,1,0,c_white,1);
     }


     //---------------장비함 슬롯 선택
     if mx>_x && my>_y && mx<_x+_w && my<_y+_h{
     if mbp_L{if global.eqm_pick_slot=-1{global.eqm_pick_slot=_slot;}}


     if mbr_L{
     //---------------장비함에 아이템 장착
     if !(global.item_pick_slot<0){

     _it=global.item_slot[global.item_pick_slot];
     _it_n=global.item_slot_n[global.item_pick_slot];

     if get_eqm_slot_match(i,_it)=1{

     if global.eqm_slot[_slot]=-1{
     global.item_slot[global.item_pick_slot]=-1;
     global.item_slot_n[global.item_pick_slot]=0;}
     else{
     global.item_slot[global.item_pick_slot]=global.eqm_slot[_slot];
     global.item_slot_n[global.item_pick_slot]=global.eqm_slot_n[_slot];
     }

     global.eqm_slot[_slot]=_it;
     global.eqm_slot_n[_slot]=_it_n;}
     }
     //---------------장비함내 아이템 교체
     else{
     if !(global.eqm_pick_slot<0){
     _it=global.eqm_slot[global.eqm_pick_slot];
     _it_n=global.eqm_slot_n[global.eqm_pick_slot];
     if get_eqm_slot_match(i,_it)=1{

     if global.eqm_slot[_slot]=-1{
     global.eqm_slot[global.eqm_pick_slot]=-1;
     global.eqm_slot_n[global.eqm_pick_slot]=0;}
     else{
     global.eqm_slot[global.eqm_pick_slot]=global.eqm_slot[_slot];
     global.eqm_slot_n[global.eqm_pick_slot]=global.eqm_slot_n[_slot];
     }
     global.eqm_slot[_slot]=_it;
     global.eqm_slot_n[_slot]=_it_n;}

     }}
     }

     }

     _slot+=1;i+=1;}
     //=====================장비함 설정=====================

     //=====================스탯 정보 표시=====================

     draw_set_font(font0);
     _x=_pos_x+20;
     _y=_pos_y+288;
     draw_text_color(_x,_y,string(global.gold),c_white,c_white,c_white,c_white,1);


     _x=_pos_x+380;
     _y=_pos_y+16;
     i=0;repeat(9){
     switch(i){
     case 0: tt1="LV";tt2=string(global.player_LV);break;
     case 1: tt1="HP";tt2=string(global.player_hp);break;
     case 2: tt1="MP";tt2=string(global.player_mp);break;
     case 3: tt1="EXP";tt2=string(global.player_exp)+"/"+string(global.player_exp_max);break;
     case 4: tt1="STR";tt2=string(global.player_str_total);break;//스탯은 모두 더한 값인 total값으로
     case 5: tt1="DEF";tt2=string(global.player_def_total);break;
     case 6: tt1="INT";tt2=string(global.player_int_total);break;
     case 7: tt1="DEX";tt2=string(global.player_dex_total);break;
     case 8: tt1="DMG";tt2=string(global.player_dmg_total);break;
     default : tt1="";tt2="";
     }
     draw_text_color(_x,_y,string(tt1),c_black,c_black,c_black,c_black,1);
     draw_text_color(_x+32,_y,string(tt2),c_red,c_red,c_red,c_red,1);
     _y+=12;i+=1;}



     //=====================드래그 중일때 아이템 표시=====================
     if !(global.item_pick_slot=-1) && _drag_on=1{
     if global.item_slot[global.item_pick_slot]>=0{
     draw_sprite_ext(spr_item,global.item_slot[global.item_pick_slot],mx,my,1,1,0,c_white,0.5);}}

     if !(global.eqm_pick_slot=-1) && _drag_on=1{
     if global.eqm_slot[global.eqm_pick_slot]>=0{
     draw_sprite_ext(spr_item,global.eqm_slot[global.eqm_pick_slot],mx,my,1,1,0,c_white,0.5);}}




     //=====================사용하기 버튼 설정=====================
     _x=_pos_x+16;
     _y=_pos_y+328;
     _w=64;_h=16;
     if mx>_x && my>_y && mx<_x+_w && my<_y+_h{
     c=c_red;draw_rectangle_color(_x-1,_y-1,_x+_w,_y+_h,c,c,c,c,1);
     if mbp_L && global.item_select>=0{
     //-----------------------------
     _slot=global.item_select;
     _it=global.item_slot[_slot];
     if !(_it=-1){_use=set_use_item(_it);if _use>=0{
     if global.item_slot_n[_slot]>=1{
     _aa=instance_create(-1000,-1000,_use,);
     with(_aa){event_user(0);}
     }

     if global.item_slot_n[_slot]>1{global.item_slot_n[_slot]-=1;}
     else{global.item_slot[_slot]=-1;global.item_slot_n[_slot]=0;}
     }}
     //-----------------------------
     }}

     //=====================버리기 버튼 설정=====================
     _x=_pos_x+111;
     _y=_pos_y+328;
     _w=64;_h=16;
     if mx>_x && my>_y && mx<_x+_w && my<_y+_h{
     c=c_red;draw_rectangle_color(_x-1,_y-1,_x+_w,_y+_h,c,c,c,c,1);
     if mbp_L && global.item_select>=0{
     //---------------
     _slot=global.item_select;

     global.item_slot[_slot]=-1;
     global.item_slot_n[_slot]=0;
     //---------------
     }}


     //=====================닫기 버튼 설정=====================
     _x=_pos_x+160;
     _y=_pos_y;
     _w=16;_h=16;
     if mx>_x && my>_y && mx<_x+_w && my<_y+_h{
     if mbp_L{
     global.item_select=-1;global.item_pick_slot=-1;
     global.eqm_select=-1;global.eqm_pick_slot=-1;
     global.inventory_open=0;}}


     if !(mbc_L){global.item_pick_slot=-1;global.eqm_pick_slot=-1;}
     if item_db_click>0{item_db_click-=1;}else{item_db_click=0;}


     //=====================드래그 초기화=====================

     if mbp_L{if _drag_on=0{_drag_x=mx;_drag_y=my;_drag_on=5;}}
     if _drag_on=5{if point_distance(mx,my,_drag_x,_drag_y)>2{_drag_on=1;}}
     if !(mbc_L){_drag_on=0;}



이야~! 인벤토리의 설정이 끝났습니다.

인벤토리부분이 꽤나 길었네요.

제대로 작동하는지 테스트 해보도록 해요.

 

 

 

-다음 강좌에서 계속-

 

 

 

 

 

300x250

댓글