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

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

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

 

 

GAME MAKER 강좌

 

 

KAYAN

 

 

 

이제 인벤토리에 대한 설정을 만들어봅시다.

 

 

(▲인벤토리)

 

 

 

 

 

◈인벤토리 설정

 

 

아직은 빈 껍데기 일뿐입니다.
인벤토리의 설정을 만들어봅시다.
먼저 인벤토리에 사용할 폰트를 하나 만들도록 해요.

 

 

(▲인벤토리에 사용할 폰트)


인벤토리 스크립트(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;

     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;}


 

 


이제 아이템을 선택하는 이벤트 틀을 작성하도록 합시다.

 

 



     ★스크립트 - draw_inv_tap

     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{//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{
     global.item_select=_slot;//아이템 선택(슬롯을 선택함)
     if global.item_pick_slot=-1{global.item_pick_slot=_slot;}
     }

     }
     //--------------아이템 선택--------------

     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);}
     }



아직도 시작일뿐인데... 꽤 길군요. 헉헉
이것은 아이템을 선택하는 부분까지 설정하는 것입니다.
아이템 슬롯 1칸에 마우스 포인터가 위치했을 때, 클릭하면 그 칸이 선택되는 것입니다.
만약 아이템이 있는 경우라면 맨 아래 코드에서 정보를 표시하게 되는 것이지요.

아이템 슬롯의 체크 순서는 다음과 같습니다.

 

 

(▲아이템이 표시되는 순서. 그리고 아이템이 선택되면 정보를 표시)


이런식으로 첫번째 칸부터 가로순서대로 체크하게 됩니다.

     for(k=0;k<8;k+=1;){//세로
     for(i=0;i<5;i+=1;){
//가로

    
//체크 내용. 세로줄(k) 1개씩, 가로(i)로 5칸씩 체크함.

     }
     }


그래서 세로X가로로 8X5, 총 40칸을 체크하게 됩니다.
여러분의 칸에 맞게 설정하시면 되겠지요.

테스트를 위해 인벤토리가 표시되는 시스템 오브젝트(obj_system)Create 이벤트에 아래와 같이

     global.item_slot[0]=0;
     global.item_slot_n[0]=1;


아이템 아무거나 슬롯에 추가해보고, 제대로 체크가 되는지 확인해보도록 해요.
아이템 스프라이트 이미지 순서와 아이템 정보 이미지의 순서가 같아야 하며,
추가시 아이템 서브이미지 번호로 추가하시면 됩니다.

 

 

(▲테스트 화면)


아이템 보관함과 장비함 연동이 필요하기 때문에 다음은 장비함 틀을 설정해보도록 합시다.

 

 

(▲체크할 장비함 칸)


인벤토리 스크립트(draw_inv_tap)에 추가적으로 이벤트를 작성하도록 해요.

 



     ★스크립트 - draw_inv_tap

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

     _w=32;//칸의 넓이
     _h=32;//칸의 높이

     _slot=0;//장비함 슬롯

     i=0;repeat(global.eqm_slot_max){//장비함 개수만큼 반복시킴

     switch(i){//칸의 좌표
     case 0:ex1=272;ey1=64;break;//0번 칸
     case 1:ex1=272;ey1=128;break;//1번 칸

     case 2:ex1=208;ey1=128;break;//2번 칸
     case 3:ex1=336;ey1=128;break;//3번 칸

     case 4:ex1=272;ey1=192;break;//4번 칸

     case 5:ex1=208;ey1=16;break;//5번 칸
     case 6:ex1=240;ey1=16;break;//6번 칸
     case 7:ex1=272;ey1=16;break;//7번 칸

     default:ex1=272;ey1=64;//기본값
     }

     _x=_pos_x+ex1;//체크할 최종 좌표
     _y=_pos_y+ey1;

     //--------------------▼스크립트 호출

     //체크 내용

     //--------------------▲스크립트 호출

     _slot+=1;i+=1;}



이것은 불규칙하게 있는 장비함 칸의 좌표를 체크할 수 있도록, 틀을 구성한 것입니다.
체크 내용부터 아이템을 드래그하여 장착 또는 해제할 수 있는 이벤트를 작성하면 됩니다.

일단 아이템을 장착할 수 있는 장비 목록을 만들도록 합시다.

 

 

(▲강좌의 아이템 목록)


먼저 스크립트(get_eqm_slot_match) 하나 생성하고, 장비함 칸마다 들어갈 수 있는 아이템 목록을 작성하도록 해요.
이 스크립트는 단순히 목록만 만드는 것이 아니라, 아이템을 장착하고 해제 할때도 사용해야하기 때문에
반환 값(return)을 가지는 것이 좋습니다.

 



     ★스크립트 - get_eqm_slot_match

     //get_eqm_slot_match(slot,item);
     var _slot,_it,_match;
     _slot=argument0;//장비함 슬롯
     _it=argument1;//아이템 번호

     _match=0;

     //=================0번(투구)=================
     if _slot=0{
     switch(_it){
     //-----------------------
     case 2: _match=1;break;
     //-----------------------
     }}


     //=================1번(갑옷)=================
     if _slot=1{
     switch(_it){
     //-----------------------
     case 5: _match=1;break;
     //-----------------------
     }}


     //=================2번(왼쪽 무기)=================
     if _slot=2{
     switch(_it){
     //-----------------------
     case 3: _match=1;break;
     //-----------------------
     }}


     //=================3번(오른쪽 무기)=================
     if _slot=3{
     switch(_it){
     //-----------------------
     case 3: _match=1;break;
     //-----------------------
     }}


     //=================4번(부츠)=================
     if _slot=4{
     switch(_it){
     //-----------------------

     //-----------------------
     }}



     //=================5~7번(기타 슬롯)=================
     if _slot=5 || _slot=6 || _slot=7{
     switch(_it){
     //-----------------------
     case 4: _match=1;break;
     case 6: _match=1;break;
     //-----------------------
     }}

     return _match;//장착할 수 있는 아이템이라면 1을, 그렇지 않다면 0을 반환하게 됨.



이 스크립트를 보시다시피 장비함 슬롯과 아이템 범호를 체크해 슬롯에 목록이 있다면
반환값에 따라 아이템을 장착하고, 만약 없다면 반환값에 따라 장착할 수 없게 만드는 것입니다.

 

[참고]

     argument : argument는 스크립트 내부에 사용되는 인자로써, 0~15번까지 총 16가지를 스크립트에 사용할 수

     있습니다. 이것은 스크립트 외부에서 값을 입력했을 때, 스크립트 내부에서 받은 값을 이용하여 이벤트를

     작성할 수 있지요. 뭐, 변수에 할당하는 것과 같다고 보시면 됩니다. 단, 인자로 받은 값은 해당 스크립트

     내에서만 사용가능하지요. 구성은 대략 이렇습니다.

 

     스크립트(0번,1번, ... ,15번)//스크립트 내에 사용된 argument번호 만큼만 지정하면 됨. 단, 번호순.

 

     스크립트 내부에선 argument0, ..., argument15 중 필요한 값만 사용해서 대입하거나, 다른 변수와 비교, 또는 할당

     할 수 있습니다. 단, 번호 순으로 사용해야하고, 스크립트 내부에서 사용된 인자만 외부에서 지정할 수 있습니다.

 


이렇게 반환값을 가지는 스크립트는 아래와 같이 사용할 수 있습니다.

     예1)
     _slot=get_eqm_slot_match(1,5);
//스크립트 내부에서 정해진 값이 _slot에 할당됨

     예2)
     if get_eqm_slot_match(1,5){
//스크립트 내부에서 정해진 값으로 이벤트를 실행
     global.eqm_slot[1]=5;
     global.eqm_slot_n[1]=1;
     }


이것은 장착하고자 하는 [아이템 5번]이 [1번 슬롯]의 목록에 있다면, 장비함 슬롯(global.eqm_slot)
아이템 번호를 삽입하는 것입니다.
굳!
간단하죠?

이제 이것을 응용하여 아이템을 드래그하거나 장비함에 장착 또는 해제 가능하게 합시다.
먼저 인벤토리 스크립트가 호출되는 시스템 오브젝트(obj_system)Create 이벤에,
드래그에 필요한 변수들을 선언하도록 해요.

 



     ★obj_system - Create 이벤트

     item_db_click=0;//더블클릭 체크

     _drag_x=0;//드래그시 최초 좌표
     _drag_y=0;
     _drag_on=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;

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


     ...


     //-------------장비함 설정---------------
     _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;
     case 6:ex1=240;ey1=16;break;
     case 7:ex1=272;ey1=16;break;

     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);
     }

     //----------------------------▲이벤트 삽입
     _slot+=1;i+=1;}




     //----------------------------▼이벤트 삽입
     if !(mbc_L){global.item_pick_slot=-1;global.eqm_pick_slot=-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;

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


     ...


     //-------------장비함 설정---------------
     _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;
     case 6:ex1=240;ey1=16;break;
     case 7:ex1=272;ey1=16;break;

     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;}



     if !(mbc_L){global.item_pick_slot=-1;global.eqm_pick_slot=-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;){
     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{

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

     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 !(mbc_L){global.item_pick_slot=-1;global.eqm_pick_slot=-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;
     //-------------인벤토리 설정---------------

     ...

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

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

     ...

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


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

     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;}}//2픽셀정도 떨어지면 드래그 On!
     if !(mbc_L){_drag_on=0;}
     //----------------------------▲이벤트 추가



마찬가지로 중요 코드에 설명이 있지만, 이것은 해당 슬롯에 아이템이 있는경우 드래그 했을 때,
아이템을 표시하는 것입니다.

제대로 되는지 테스트 해봅시다.

 

 

(▲테스트 화면)


후아~ 드디어 막바지에 다다렀습니다.
조금 더 힘내봅시다.

 

 

 

 


-다음 강좌에서 계속-

 

 

 

 

300x250

댓글