게임메이커/액션
1. 들어가기 전에
- 게임메이커: 스튜디오(GMS)를 우선하여 작성하였다.
- 액션의 이름은 액션을 갖다 놓았을 때 열리는 창 이름으로 한다. 별도의 창이 없을 경우 아이콘에 마우스를 올려놓았을 때의 툴팁 이름을 사용한다.
- 이 문서의 모든 액션 아이콘은 게임메이커 8.x(GM8) 아이콘이다.
- 액션별로 아이콘의 모양과 색상이 다르다.
- 현재 기준(Relative)이라는 것은 그 변수에 추가로 더한다는 의미이다. 예를 들어 변수
에 1이라고 쓰고 현재 기준을 체크하면,a
라는 변수에 1을 더한다. 빼려고 한다면 -1을 넣어주면 된다.a
- 맥락에 따라 '현재 기준'의 의미는 조금씩 다른데, x/y가 있는 대부분의 액션에서는 자신의 위치를 기준으로 한다는 의미이고, 기타 변수가 있는 액션에서는 대입하지 않고 가/감산한다는 의미이다.
- if문 액션의 아닐 경우(NOT)이라는 것은 조건이 참이 아니라 거짓일 때 실행된다는 의미이다.
- 거의 모든 코드에는 '적용 대상'(Applies to) 설정이 있는데, 이는 해당 액션의 효과를 누구를 대상으로 적용시킬지 설정하는 메뉴이다. 기본값은 '자신'(Self)이고, 충돌 이벤트 등에서 '기타'(Other)로 설정하면 충돌한 인스턴스에 적용된다. '대상:'(Object:)에서 특정 오브젝트를 선택하면 해당하는 모든 인스턴스에 적용된다.
- 기울임체로 표기된 액션은 별도의 창이 뜨지 않고 액션 영역에 바로 추가된다.
- 대응하는 코드는 '현재 기준'과 '아닐 경우'를 모두 체크하지 않았을 때, GMS 1.x 문법(GM8 액션일 경우 GM8 문법)을 기준으로 한다.
- 4문장 이상의 긴 코드는 접기 문법을 사용하여 숨겨 두었다. 읽으려면 [ 코드 보기 ] 부분을 클릭하면 된다.
- 코드에 따옴표("...")가 있을 경우 따옴표를 반드시 포함해야 한다. 큰따옴표를 쓰든 작은따옴표를 쓰든 양쪽이 맞으면 상관 없다.
- GM8에서는 색상 관련 함수 이름에 color만 사용했지만, GMS부터 colour가 표준이 되었다. color로 바꾸어 써도 잘 동작한다.
- 코드 목록은 게임메이커: 스튜디오 1.x 도움말(영문)
2. Move 탭
2.1. Move
아래 액션은 인스턴스의 속도 자체에 관여하므로 특별한 일이 없다면 한 번만 실행시켜도 계속 이동한다. 즉, 따로 멈추는 설정을 해주어야 한다는 얘기이다.
2.2. Jump
여기서 Jump는 말 그대로 점프를 의미하는 것이 아니라 '특정 좌표로 순간이동'을 의미한다. 인스턴스의 위치에만 관여하므로 계속 이동시키려면 계속 실행시켜야 한다. 이는 아래의 Steps에도 동일하게 적용된다.
2.3. Paths
2.4. Steps
3. Main1 탭
3.1. Objects
3.2. Sprite
3.3. Sounds
GM8까지 사용하던 레거시 오디오 엔진과 GMS에 추가된 신규 오디오 엔진이 있다. GMS에서도 Global Game Settings에서 레거시 엔진으로 바꿀 수 있다.
3.4. Rooms
게임메이커: 스튜디오에서는 룸 전환 효과를 사용할 수 없다. 전환 효과는 하나씩 쓰면서 마음에 드는 것으로 정하면 된다.
4. Main2 탭
4.1. Timing
4.2. Info
게임메이커 8.x에는 게임 창 등에 파일이나 웹사이트를 띄우는 '스플래시' 계열 액션(Splash로 시작하는 모든 액션과 Show Info)이 있다. 스플래시 창에 파일이 필요한 액션의 경우 해당 파일을 게임과 같이 배포하거나 파일 포함 기능으로 끼워넣어야 한다.
4.3. Game
4.4. Resources
5. Control 탭
5.1. Questions
5.2. Other
5.3. Code
5.4. Variables
6. Score 탭
6.1. Score
게임 내 점수는 전역 변수
score
에 저장된다.6.2. Lives
남은 생명은 전역 변수
lives
에 저장된다.6.3. Health
남은 체력은 전역 변수
health
에 저장된다. 최대 체력은 무조건 100으로 고정된다.7. Extra 탭
7.1. Particles
게임메이커의 파티클 체계는 크게 시스템, 타입, 이미터의 세 종류가 있다. 세 종류 모두 코드를 사용하면 개수 제한 없이 여러 개를 만들 수 있으며, 각각 고유번호를 부여받는다.
- 파티클 시스템(Particle System): 아래의 파티클 타입과 이미터를 담는 틀로 생각하면 된다. 액션으로는 1개만 만들 수 있다.
- 파티클 타입(Particle Type): 파티클이 눈에 보이는 모양, 즉 그래픽을 정의한 것. 모양, 방향, 속도, 중력, 색상, 투명도, 수명 등 여러 속성을 부여할 수 있지만 파티클 하나하나를 통제할 수는 없다. 액션으로는 16개만 만들 수 있다.
엔진에 기본으로 정의된 파티클 모양은 14종류[21] 가 있으며, 이외에도 직접 만든 스프라이트를 적용할 수 있다.
- 파티클 이미터(Particle Emitter): 파티클을 화면에 생성하는 생성기와 같은 것. 코드를 사용할 경우 이미터가 없어도 파티클을 소환할 수 있다. 액션으로는 8개만 만들 수 있다.
- 파티클: 실제로 파티클 이미터에서 생성되는 시각적 효과. 게임메이커 도움말에서는 파티클과 파티클 이미터를 섞어 쓰는 경향이 있지만, 해당 문서에서는 두 단어를 엄격히 구분한다.
파티클에 대한 더 자세한 설명은 도움말의 해당 항목을 확인하면 된다.
아래 코드에서는
sys
에 파티클 시스템, type
에 파티클 타입, emit
에 파티클 이미터의 고유번호를 저장하는 것으로 가정한다.7.2. CD (GM8)
컴퓨터에 넣은 CD를 인식하고 재생하는 액션이다. GMS에서는 지원이 중단되었다.
코드로 사용할 때는 반드시
cd_init()
을 먼저 사용해야 한다. CD를 바꿔 끼웠을 때도 한 번씩 사용해야 한다.7.3. Other
8. Draw 탭
8.1. Drawing
8.2. Settings
대부분의 드로우 액션은 이 탭에서 설정한 색상과 글꼴의 영향을 받는다. Draw 이벤트가 아닌 다른 곳에서도 사용할 수 있다.
8.3. Other
[1] 각각 가로/세로로 적용시키려면
hor
, vert
를 true로, 아니면 false로 맞춘다. margin
은 인스턴스의 중심이 방의 경계에서 얼마나 떨어져 있어야 반대쪽으로 이동시킬지를 결정하며, 기본값은 0이다.[2] 튕김 처리를 정밀하게 하려면 adv
를 true로, 대충 하려면 false로 맞춘다.[3] endaction
이 가질 수 있는 값은 액션에서의 순서대로 path_action_stop
, path_action_restart
, path_action_continue
, path_action_reverse
이다. absolute
는 '''절대적 위치'''에서 시작할 때 true로 설정하는 것에 주의.[4] checkall
은 모든 객체를 판정하려면 true, 솔리드 객체만 판정하려면 false로 맞춘다.[5] 다른 인스턴스를 지우려면 with(지울 오브젝트) {instance_destroy();}
혹은 instance_destroy(지울 오브젝트)
로 쓰면 된다. instance_destroy(지울 오브젝트, false)
로 쓰면 Destroy 이벤트가 발생하지 않는다.[6] 애니메이션이 필요 없을 경우 image_single = (subimage);
로 특정한 서브이미지에서 멈추게 할 수 있으며, -1로 설정하면 애니메이션이 다시 재생된다. GM6에서 공식적으로 삭제되었다고는 하지만, GMS에서도 잘 작동한다.[7] 스프라이트를 가로로 뒤집으려면 image_xscale
을, 세로로 뒤집으려면 image_yscale
을 음수로 설정한다.[색상값] A B C D E F 색상값으로 c_*
계열 상수를 넣을 수 있다. 이외에도 원하는 색상 값을 넣으려면 make_colour_rgb(r, g, b)
나 make_colour_hsv(hue, saturation, value)
함수를 이용하거나 헥스 코드 #RRGGBB를 $BBGGRR
포맷으로 입력하면 된다. 다만 GMS 1.4.9999의 경우 $BBGGRR
포맷의 색상값을 특정 조건에서 $RRGGBB
로 인식하는 버그가 있으니 주의.[8] priority
는 재생할 사운드의 우선순위이며, 클수록 동시에 많은 사운드가 재생되어도 끊기지 않는다.[레거시1] sound_play(sound)
혹은 sound_loop(sound)
[레거시2] sound_stop(sound)
[레거시3] sound_isplaying(sound)
[비동기] A B 창이 떠 있는 동안 게임이 멈춘다. GMS의 경우 이러한 함수는 디버그 전용이 되었고, 공식 도움말에서는 게임이 멈추지 않는 *_async
꼴의 비동기 함수를 권장한다.[9] delay
밀리초 이후에 표시된다. 이하 모든 'Splash'로 시작하는 액션에 해당된다.[10] 게임 창으로 띄운다.[11] splash_set_main
함수의 인자는 게임 창으로 띄울 때 true, 새 창이나 전체화면으로 띄울 때 false로 설정한다. splash_set_fullscreen
함수의 인자는 전체화면으로 띄울 때 true, 그렇지 않을 때 false로 설정한다.[파일시스템] A B C GMS에서는 GM8과 달리 샌드박싱이 적용되어 따로 지정된 디렉토리 바깥의 파일을 읽고 쓸 수 없다. 외부 영역의 파일을 읽으려면 get_open_filename
, 외부 영역에 저장하려면 get_save_filename
함수를 통해 파일 열기/저장하기 창을 띄워야 한다.[12] kind
의 값에 따라 다르게 취급되는데, 대표적으로 0은 일반 사운드, 1은 배경음악이다. preload
를 설정하지 않으면 그 사운드가 실제로 재생될 때까지 기다렸다가 불러온다.[13] 전자는 솔리드, 후자는 모든 오브젝트를 확인한다.[연산자] A B C D E ==
대신 다양한 비교 연산자를 사용할 수 있다. !=
은 같지 않을 때, <
/>
은 미만/초과, <=
/>=
은 이하/이상.[이상이하] A B C D E 액션 자체의 설정만으로는 미만/초과가 아닌 이상/이하를 확인할 수 없으므로, 이상/이하가 필요하다면 각각 미만/초과 + 아닐 경우의 조합을 사용해야 한다.[14] if문뿐만 아니라 for문 등 조건을 요구하는 문법에 넣으면 된다. 진리값의 경우 true는 1, false는 0의 값을 가지므로 수식에 (괄호를 치고) 그대로 집어넣어도 된다.[15] button
이 가질 수 있는 값은 액션에서의 순서대로 mb_none
, mb_left
, mb_right
, mb_middle
이다. 마우스 아무 버튼을 뜻하는 mb_any
도 사용할 수 있다.[16] 상속 관계에서 부모와 자식 오브젝트는 여러 가지 이벤트를 가질 수 있는데, 부모에게 있는데 자식에게는 없는 이벤트가 있을 경우 자식은 그 이벤트를 '물려받아서' 그대로 실행한다. 한편 부모와 자식 모두 같은 이벤트가 있을 경우 자식은 부모의 이벤트를 물려받지 않고 자신의 것을 실행하는데, 이때 Call Parent Event로 부모의 이벤트를 강제로 물려받게 한다. 한편 부모의 이벤트를 자식이 물려받게 하고 싶지 않다면 이를 역이용해서 자식의 이벤트에 주석 액션 하나를 넣거나 빈 코드를 넣으면 된다. 아무 것도 없는 이벤트는 강제로 삭제되므로 하나라도 넣어야 한다.[17] 스크립트 자체는 인자를 0번부터 15번까지 16개 받을 수 있다.[18] 이 함수는 script
를 제외하고 인자를 0부터 14까지 15개 받을 수 있다.[19] 전자는 한 줄만 쓸 수 있지만, 후자는 여러 줄에 걸쳐 쓸 수 있다.[형변환] A B 문자열과 숫자를 그냥 합치려고 하면 형변환 오류가 발생하므로, 반드시 string
함수로 숫자를 문자열로 변환하여 합쳐야 한다.[20] score
대신 다른 값을 넣으면 하이스코어에 다른 점수가 등록된다. 글꼴 파트의 style
의 경우 0은 보통, 1은 굵게, 2는 기울임체, 3은 굵은 기울임체이다.[21] Pixel, Disc(꽉 찬 원), Square, Line, Star, Circle(테두리만 있는 원), Ring(안쪽이 점점 옅어지는 원), Sphere(안쪽이 점점 짙어지는 원), Flare, Spark, Explosion, Cloud, Smoke, Snow. 코드로 사용할 경우 각각 pt_shape_*
꼴의 상수로 사용하며, 모두 소문자로 써야 한다.[22] 액션 이름은 '파티클 생성'이지만, 실제로는 파티클 '''타입'''을 생성한다.[23] part_type_sprite
에서 animate
는 해당 스프라이트의 애니메이션을 파티클에 적용할지의 여부, stretch
는 파티클의 수명이 끝날 때 애니메이션도 같이 끝나도록 강제 조절할지의 여부, random
은 매 스텝마다 무작위 서브이미지를 보일지의 여부이다.[wiggle] A B *_wiggle
인자에 0이 아닌 숫자를 지정하면 매 스텝마다 그 값이 무작위로 그만큼 커지거나 작아진다.[24] GM8에서는 알 수 없는 이유로 shape로 표기되어 있었다.[25] 색상의 경우 colour1
로 고정된 단색을 부여하거나 colour3
으로 세 색 사이에서 바뀌게 할 수 있으며, colour_hsv
나 colour_rgb
로 make_colour_*
처럼 색상을 지정할 수 있다. 투명도의 경우 alpha1
로 고정된 투명도를 부여하거나 alpha3
으로 세 투명도 값 사이에서 바뀌게 할 수 있다. 무작위 투명도 기능은 없다.[incr] *_incr
인자에 0이 아닌 숫자를 지정하면 매 스텝마다 그 값이 그만큼 커진다.[26] 파티클의 마찰력에 직접적으로 관여하는 함수는 없으므로 마찰력을 구현하려면 speed_incr
인자에 -friction
을 넣어 매 스텝마다 속도가 줄게 해야 한다.[27] shape
가 가질 수 있는 값은 액션에서의 순서대로 ps_shape_rectangle
, ps_shape_ellipse
, ps_shape_diamond
, ps_shape_line
이다. distribution
은 이미터 영역 안에서 파티클이 등장하는 분포를 설정하는데, ps_distr_linear
(고르게 분포), ps_distr_gaussian
(정규분포. 가운데에 집중됨), ps_distr_invgaussian
(모서리에 집중됨)의 세 값을 가질 수 있다.[28] cursor
가 가질 수 있는 값은 액션에서의 순서대로 cr_none
, cr_default
이다. 이외에도 cr_arrow
(보통 상황에서의 마우스 커서), cr_handpoint
(링크 위에 마우스를 올렸을 때의 커서), cr_beam
(텍스트를 편집할 때의 커서) 등 여러 상수를 넣을 수 있다. [29] 엄밀하게는 현재 image_index
값이 적용된다.[outline] A B outline
은 액션에서와 달리 테두리가 true, 채우기가 false인 점에 유의.[30] align
이 가질 수 있는 값은 액션에서의 순서대로 fa_left
, fa_center
, fa_right
이다. 이외에도 draw_set_valign
으로 세로 정렬을 할 수 있는데, 이 함수에 인자로 줄 수 있는 값은 fa_top
, fa_middle
, fa_bottom
이다.[31] full
인자는 창 모드일 경우 false, 전체화면 모드일 경우 true로 설정한다. 창 모드와 전체화면 모드를 전환하려면 window_set_fullscreen(!window_get_fullscreen())
을 입력한다.[32] type
이 가질 수 있는 값은 ef_cloud
, ef_ellipse
, ef_explosion
, ef_firework
, ef_flare
, ef_rain
, ef_smoke
, ef_smokeup
, ef_snow
, ef_spark
, ef_star
의 12종류이다. size
는 크기 순서대로 0, 1, 2를 쓸 수 있다.