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

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

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

 

 

GAME MAKER 강좌

 

 

KAYAN

 

 

 

 

이번 강좌에서 만들 부분은 인벤토리입니다.

 

 

(▲인벤토리)


이번 강좌는 스크립트를 중점적으로 다루기 때문에 조금 복잡할 것입니다.
잘 따라해봅시다.

 

 

 

 

 

 

 

 

◈인벤토리 만들기(obj_system)

 


먼저 인벤토리에 사용할 이미지를 준비하고, 스프라이트(spr_inv_tap)로 구성합니다.

 

 

(▲강좌에서 사용할 인벤토리 이미지)


이미지를 제작할때 칸을 일정한 크기로 제작하셔야 만들때도 쉽습니다.

 

 

(▲인벤토리 스프라이트)


강좌에서 중심점은 계산하기 쉽도록 (0, 0)으로 맞추었습니다.
인벤토리의 구성은 아래와 같이 구성될거에요.

 

 

(▲인벤토리 구성 설명)


인벤토리에 들어갈 이미지도 준비하도록 합시다.

 

(▲아이템 이미지)


그리고 1개의 스프라이트 이미지(spr_item)로 구성하도록 합니다.

 

 

(▲아이템 스프라이트 이미지)

 

또한 아이템의 정보 박스에 들어갈 크기로 아이템 정보 역시 이미지로 만들어 스프라이트로 구성하도록 합니다.

 

 

(▲아이템 정보)


아이템 정보는 아이템 스프라이트의 순서에 맞게 구성하도록 하세요.

인벤토리를 표시하기 위해서는 오브젝트가 필요하겠지요.
이 오브젝트는 모든 룸에 배치되어야 합니다.
강좌에서는 편의상 이전에 만든 시스템 오브젝트(obj_system)를 사용하도록 하겠습니다.
여러분이 오브젝트를 따로 사용할 것이라면 다른 이름의 오브젝트를 새로 만들도록 하세요.

인벤토리를 만들기 전에 필요한 변수들을 미리 만들어 놓아야 겠지요.
이 변수들은 룸마다 보존되어야 하기 때문에 글로벌 변수로 선언해야 합니다.
이전 강좌에서 글로벌 변수를 선언했던 오브젝트(obj_game_start)를 이용하여, 플레이어의 능력치부터 선언하도록

합시다.

 



     ★ obj_game_start - Room Start 이벤트

     //경험치
     global.player_exp=0;
     global.player_exp_max=100;

     //스탯
     global.player_str=5;//힘
     global.player_def=5;//방어
     global.player_int=5;//지력
     global.player_dex=5;//민첩
     global.player_dmg=5;//데미지

     //총 스탯(기본 스탯치+ 아이템으로 인한 추가 스탯치)
     global.player_str_total=global.player_str;
     global.player_def_total=global.player_def;
     global.player_int_total=global.player_int;
     global.player_dex_total=global.player_dex;
     global.player_dmg_total=global.player_dmg;



강좌에선 대충 요만큼만 설정하도록 하겠습니다.

다음은 인벤토리에 필요한 변수들을 선언하도록 합니다.
먼저 아이템 슬롯에 필요한 변수들입니다.

 



     ★ obj_game_start - Room Start 이벤트

     global.inventory_open=0;//아이템 창 ON/OFF

     //아이템 슬롯
     global.item_slot_max=40;//총 아이템 슬롯 개수

     i=0;

     repeat(global.item_slot_max){
     global.item_slot[i]=-1;//아이템
     global.item_slot_n[i]=0;//아이템 개수
     i+=1;}

     global.item_select=-1;//아이템 선택
     global.item_pick_slot=-1;//아이템 선택(아이템을 옮길때)



이것은 인벤토리의 이미지에 잇는 아이템을 보관할 슬롯 개수(강좌에선 40개)에 맞게 선언하시면 됩니다.
이처럼 배열을 이용하면 수량이 많아도 쉽게 설정할 수 있지요.

[참고]
repeat 문 : repeat문은 일부 코드를 지정한 횟수만큼 반복시킬때 사용합니다.
     예)
     repeat(5){instance_create(x,y,obj_effect);}//총 5회동안 obj_effect를 (x, y)위치에 생성함.


예제에선 변수 내용이 스크립트 init_inv 에 선언되어있습니다.
그리고 obj_game_startRoom Start 이벤트에서 호출 되어 있습니다.참고하세요.

다음은 장비함에 들어갈 변수 역시 추가로 선언하도록 합시다.

 



     ★ obj_game_start - Room Start 이벤트

     //장비함
     global.eqm_slot_max=8;//종 장비함 개수

     i=0;

     repeat(global.eqm_slot_max){
     global.eqm_slot[i]=-1;//장비 아이템
     global.eqm_slot_n[i]=0;//장비 아이템 개수
     i+=1;}

     global.eqm_select=-1;//아이템 선택
     global.eqm_pick_slot=-1;//아이템 선택(아이템을 옮길때)



장비함도 마찬가지입니다.
아이템을 장착할 수 있는 슬롯 개수(강좌에선 8개)만큼 선언하면 됩니다.

다음은 인벤토리 창을 한번 띄워봅시다.

인벤토리창은 global.inventory_open 가 1일때 활성화되고, 0일때 비활성되도록 하겠습니다.
그리고 플레이어가 필드에 있을 때만 활성화되어야겠지요.
시스템 오브젝트로 이동해서, 인벤토리를 활성화봅시다.

 



     ★ obj_system - Step 이벤트

     if instance_exists(obj_player){
     if keyboard_check_pressed(ord("I")){//키보드 [i]키를 눌렀을 때 활성화
     global.inventory_open=!(global.inventory_open);//인벤토리를 활성화 또는 비활성화
     }}



이것은 [i]키를 눌렀을 때 인벤토리를 활성화 하는 것입니다.

[참고]
global.inventory_open=!(global.inventory_open) 는 true(1) 또는 false(0)값을 할당하는 것입니다.
즉, global.inventory_open 값이 0(false)일때 1(true)로 만들고, 반대로 1일때 0으로 전환시키게 됩니다.
그리고 값의 변동은 0(true)과 1(false) 둘중 1개의 값을 가지게 됩니다.

 


다음은 Draw 이벤트에서 인벤토리를 표시해야 겠지요.
Draw 이벤트를 추가하고, 아래와 같이 인벤토리를 표시할 수 있게 작성하도록 합니다.

 



     ★ obj_system - Draw 이벤트

     if instance_exists(obj_player){
     if global.inventory_open=1{
     //--------------------▼

     이 곳에 인벤토리 표시

     //--------------------▲
     }
     }else{global.inventory_open=0;}



이것은 플레이어가 룸에 존재하고, 인벤토리 변수가 1로 되었을 때, 인벤토리를 표시할 수 있고,
만약 플레이어가 룸에 없다면 인벤토리는 비활성화 시키는 것입니다.

인벤토리를 작성하다 보면 길어질 수 있으므로 스크립트를 이용하도록 하겠습니다.
스크립트(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);//인벤토리 이미지 표시



으아~ 단순히 필요한 변수들을 선언했는데 길어졌군요.
보시다시피 마우스 체크에 필요한 부분을 변수로 먼저 선언했습니다.
뷰가 움직이기 때문에 인벤토리가 위치하는 곳은 뷰의 좌표와 같이 계산해 표시해야합니다.
만약 0번 뷰를 사용한다면 x좌표엔 view_xview[0]를, y좌표는 view_yveiw[0]을 포함해 사용해야겠지요.

이제 이 스크립트를 시스템 오브젝트(obj_system)Draw 이벤트에서 작성했던, 인벤토리표시 부분에서

호출시켜야 합니다.

 



     ★ obj_system - Draw 이벤트

     if instance_exists(obj_player){
     if global.inventory_open=1{
     //--------------------▼스크립트 호출

     draw_inv_tap();//인벤토리 스크립트

     //--------------------▲스크립트 호출
     }
     }else{global.inventory_open=0;}



위와같이 스크립트를 호출 시키면 됩니다.


이제 인벤토리가 제대로 표시되는지 테스트 해보도록 해요.

 

 

 

 

-다음 강좌에서 계속-

 

 

 

 

300x250

댓글