안녕하세요. 모여라! 촛불집회! 출시 후에 쓴 코드를 살펴보면서 강의를 해보려 했는데 좀 늦었네요.
오늘의 주제는 게임메이커 스튜디오에서 자신만의 스크립트를 만들자! 그리고 스크립트 제작팁 입니다.
액션을 쓰시는 분들이 어렵게 생각하시는데, 배워두시면 좋을 거에요.
우리가 게임메이커에서 인스턴스를 생성할 때 액션이나 명령어를 씁니다.
ii = instance_create(x,y,obj) 이런식으로 말이죠. 생성된 인스턴스를 패쓰로 이동 시키려고 합니다. 그럼 다른 명령어가 필요하겠죠.
mp_grid_path(id, path, xstart, ystart, xgoal, ygoal, allowdiag); 어디 도착하면 또 다른 무언가를 해라. 이러면 또 다른 명령어가 필요하구요.
...
....
.....
다 만들었다. 그럼 이걸 복사해서....다른 오브젝트에 붙여넣고...아이고...오브젝트마다 또 다른 설정을 해줘야합니다.
스크립트는 무엇인가하면 어느 프로그램에서나 그렇듯
이런식의 반복되고 자주 쓰고 긴 명령어들을 모아서 복사 붙여넣기 하는 대신 자신만의 명령어를 만들어 빠르게 처리하는 것입니다.
그럼 이제 스크립트를 만들어봅시다.
오늘 만들어 볼 것은 터치가 일정 범위(사각형) 안에 들어왔을 때 클릭하면 클릭했다고 알려주는 스크립트를 만들어볼것이에요.
기존 명령어인 point_in_rectangle - 포인트 1, 2 가 네모 범위 안에 있는지 알아보는 스크립트 - 를 이용한 스크립트이죠.
왼쪽 리소스 트리에서 Script 부분을 찾아서 Create Script 로 새로운 스크립트를 만들어봅시다.
이름은 scr_rectangle_click_in 으로 생성 합시다.
제가 실제로 쓰고 있는 코드에요. 실제로는 이것만 쓰진 않고 다른 것과 합해서 씁니다.
///scr_rectangle_click_in(x1,y1,x2,y2)
var dmouse_x = device_mouse_x_to_gui(0)
var dmouse_y = device_mouse_y_to_gui(0)
var clicked
clicked = point_in_rectangle(dmouse_x,dmouse_y,argument0,argument1,argument2,argument3);
return (clicked and device_mouse_check_button_released(0,mb_left));
첫줄 부터 하나씩 봅시다.
///scr_rectangle_click_in(x1,y1,x2,y2)
첫 줄은 스크립트의 이름을 넣어주세요.
첫 줄에 ///스크립트 이름(설명)을 넣게 되면 다른 곳에서 이 스크립트를 쓸 때 밑의 스크린샷처럼 도움 표기가 나옵니다.
이거 // 두개! 안됩니다. /// 꼭 셋과 스크립트 이름을 적어주세요!
다른곳에서 쓸 때 무슨 스크립트이며 여기에는 무엇을 써야하는지 쉽게 알 수 있게 해주니까 꼭 쓰도록 해요.
자작 스크립트가 많아지면 이게 무슨 스크립트인지 뭘써야했는지 기억도 안납니다.
다음은
var dmouse_x = device_mouse_x_to_gui(0)
var dmouse_y = device_mouse_y_to_gui(0)
이것은 마우스 위치를 알아보는 코드에요. 멀티 터치시에 0번 터치의 x, y위치를 dmouse_x, dmouse_y에 저장했습니다.
아직 쉽죠?
var clicked
clicked = point_in_rectangle(dmouse_x,dmouse_y,argument0,argument1,argument2,argument3);
point_in_rectangle 명령어는 어떤 점 px,py가 네모 범위(x1,y1,x2,y2) 안에 들어왔는지 아닌지를 판별해주는 기본함수입니다.
그런데 우리는 이렇게 썼습니다.
point_in_rectangle(dmouse_x,dmouse_y,argument0,argument1,argument2,argument3);
여기 argument 라는 것이 있습니다. 흔히 인수라고 부르는 것이고
인스턴스 생성 명령어의 예를 들면 x,y,obj 같은 것이 argument 입니다.
argument는 0에서 15까지 총 16개의 인수를 쓸 수 있습니다.
instance_create(x,y,obj)를 보면
x = argument0
y = argument1
obj = argument2
이런 식으로... point_in_rectangle 명령어에는 이런식으로 구성이 되어있을거에요.
px = argument0
py = argument1
x1 = argument2
y1 = argument3
x2 = argument4
y2 = argument5
instance_create 명령어에는 x위치, y위치 오브젝트 이름의 3개의 인수가 필요하고
point_in_rectangle 명령어에는 기본으로 px 부터 y2 까지 6개의 인수가 꼭 필요합니다.
모자른다면 컴파일 때 에러를 뿜어내죠.
하지만 우리가 지금 만들 scr_rectangle_click_in 명령어는
point_in_rectangle에 들어가는 px, py가 터치부분인 dmouse_x, dmouse_y 으로 고정이 되니까.
인수가 6개 모두 필요 없고 뒷부분의 x1 x2 y1 y2만 임의로 바꿔주면 되기 때문에 인수가 4개가 필요한것입니다.
그래서 point_in_rectangle(dmouse_x,dmouse_y,argument0,argument1,argument2,argument3); 으로 쓰게 되는 거죠.
앗! 그럼 스크립트에는 무조건 인수가 필요한가요? 아닙니다. 예를 들어 변수 선언을 다시 할때마다 같은 명령어를 호출 한다던가 하는 단순 명령어 모음 같은 스크립트는 인수가 필요 없을 수도 있죠. 인수는 사용자가 필요할 때 필요한 인수만 쉽게 바꿀 수 있도록 하는 기능입니다. 그리고
clicked = point_in_rectangle(...) 이런식으로
clicked이란 변수에 point_in_rectangle을 할당 했는데 터치한 곳이 네모 범위 안이면 true를, 아니면 false를 저장하게 됩니다.
다음줄~
return (clicked and device_mouse_check_button_released(0,mb_left));
return함수는 이 스크립트의 결과를 밖으로 빼내주는 역할을 합니다.
앞서 설명 했듯 clicked에 true 값이 지정되어있고,
device_mouse_check_button_released(0,mb_left) // 터치를 체크해서 터치를 땔 때 true 값이면
값을 true 로 반환해라 라는 뜻의 이야기입니다.
이래저래 복잡해보였지만
결국 터치 체크해서, 터치가 일정범위(네모 안)에 들어가 있으면 true 아니면 false 반환해 라는 이야기이죠.
스크립트를 만들었으니 이제 원래 코드로도 한번 만들어볼까요.
위치 (100,100,100,100) 이란 네모 칸 안에 터치한 순간을 판별을 하는 것을 코드로 한번 구현해 봅시다.
스텝이벤트에 넣을거에요.
대충 이런 식으로 만들 수 있겠죠. 우리가 만든 스크립트로 이것을 구현해봅시다.
if point_in_rectangle(device_mouse_x_to_gui(0), device_mouse_y_to_gui(0),100,100,100,100) == true
{
if device_mouse_check_button_released(0,mb_left) == true {
이벤트 실행
}
}
if scr_rectangle_click_in(100,100,100,100)
{
이벤트 실행
}
어때요. 비교가 되나요? 아주 드라마틱하게....(.....) 변한 모습입니다.
...귀찮은 명령어를 조금 줄여주죠. 대단해라!!
쉬운 스크립트이기에 별로 드라마틱하게 보이지는 않았습니다만
더 복잡하고 어려운 스크립트에 응용을 해보면 정말 코딩시간을 줄여주게 될것이에요.
여기서 끝나기에는 아쉬우니까 하나 더 팁을 써야겠어요.
arugment_count 라는 함수가 있습니다. 스크립트 내에서 인수를 카운팅하는 함수죠.
간단하게 instance_create명령어로 예를 들어보죠. 바로 써볼까요. scr_instance 라는 새 함수를 만들거에요.
아까 썻던 것과 다른 점이 보이시나요?
///scr_create_instance[x,y,obj] // 스크립트 설명
switch (arugment_count) // 스위치문입니다. 이걸로 arugment_count 변수를 체크해서 명령어를 바꿀 거에요
{
case 0: instance_create(0,0,obj_cider) break; //인수를 카운트 해서 다른 인수가 없이 함수가 쓰였다면 0,0에 obj_cider를 생성한다.
case 1: instance_create(0,0,argument[0]) break; //인수가 하나면 0,0에 인수로 지정된 오브젝트를 생성한다.case 2: instance_create(argument[0],argument[1],obj_cider) break;// 인수가 둘이면 인수로 지정된 x,y 지점에 obj_cider를 생성한다.
case 3: instance_create(argument[0],argument[1],argument[2]) break; // 인수가 셋이면 인수로 지정된 x,y 지점에 오브젝트를 생성한다.
}
인수에는 두가지 종류가 있습니다. argument0 ~argument15 와 argument[0]~ argument[15] 이죠.
언듯보기에는 무슨 차이가 있는거야? 라고 하지만 argument0는 꼭 있어야 하는 인수로 없으면 컴파일에서 에러를 뿜는 인수고
argument[0]류는 없어도 그만인 인수라고 할 수 있습니다.
이 스크립트를 작성하면
instance_create(0,0,obj_cider);
scr_instance();
이 두가지는 같은 결과를 불러오게 됩니다.
뭐, 얼마 차이 안나는데 물론 굳이 쓰는 이유는 뭐야라고 생각 할 수도 있겠네요.
기본 스크립트를 변형하는 것은 그저 그렇습니다만...자신만의 스크립트에서는 조금 위력을 발휘합니다.
모든 것은 그저 자작 스크립트의 명령어 타이핑의 귀찮음을 조금이라도 줄이기 위해서입니다!
다른 쓰임새도 있겠죠. 여러가지로 쓰임새를 생각해보세요. 다음 강좌까지 안녕~