게임메이커/이벤트

게임메이커/게임메이커: 스튜디오에서 오브젝트의 이벤트에 대하여 설명한다. 게임메이커 도움말을 확인하면서 편집 바람.

1 Create

  • event_create.gif 이런 아이콘을 가지고 있다

인스턴스가 처음 생성 시 작동한다. 변수 초기화, 타임라인 시작, 패스(Path) 설정 등 이 인스턴스가 한 번만 수행해야 하는 일에 사용한다.

이 이벤트가 실행될 때는 오브젝트가 생성된 직후이다. 예를 들어 foo라는 오브젝트의 Create Event에 hp = 80;이라는 코드가 있고 bar 오브젝트에서 instance_create(x, y, foo); foo.hp = 30;이라는 코드를 실행한다면 bar의 instance_create(x, y, foo);, foo의 hp = 80;, bar의 foo.hp = 30;의 순서로 실행되어 foo의 hp는 80이 아니라 30이 된다.

2 Mouse

  • event_mouse.gif 이런 아이콘을 가지고 있다.

이 이벤트는 여러 하위 이벤트로 분리된다.
iOS, 안드로이드에서 일반 터치는 좌클릭, 더블터치는 우클릭에 대응된다. 이 설정을 끄려면 게임 시작 시 device_mouse_dbclick_enable(false)를 실행시키면 된다. 참고로 이 이벤트로는 모바일(iOS, 안드로이드)에서는 첫번째 터치만을 인식한다. 즉 멀티터치를 이용하려면 device_mouse_* 계열 코드를 이용해야한다는 것이다.

  • Left/Right/Middle button
마우스가 오브젝트의 마스크 위에 올려진 채 누르고 있는 동안 계속 실행된다. 마우스를 누르거나 뗄 때, 혹은 연속으로 마우스를 클릭할 시에도 실행된다.
  • No button
마우스가 오브젝트의 마스크 위에 올려진 채 아무 버튼도 누르지 않으면 위와 같이 계속 실행된다.
  • Left/Right/Middle button pressed
마우스가 오브젝트의 마스크 위에 올려진 채 누르는 순간 한 번 실행된다.
  • Left/Right/Middle button released
마우스가 오브젝트의 마스크 위에 올려진 채 떼는 순간 한 번 실행된다.
  • Mouse enter/leave
마우스가 오브젝트의 마스크 위에 올라가거나 내려갈 때 한 번 실행된다.
  • Mouse wheel up/down
마우스가 오브젝트의 마스크 위에 올려진 채 마우스 휠을 굴릴 때 한 번 실행된다.
  • Global mouse
'Gloabl left/right/middle button', 'Gloabl left/right/middle pressed', 'Gloabl left/right/middle released' 등 9종류의 하위 이벤트로 나누어져 있다. 해당 이벤트들은 마우스가 게임 룸 내에 있기만 하면 위와 비슷하게 작동한다.
  • Joystick 1/2
구 버전 게임메이커에만 존재한다. 각각 'Left', 'Right', 'Up', 'Down', 'Button 1~8' 등 12종류의 하위 이벤트로 나누어져 있다.

3 Destroy

  • event_destroy.gif 이런 아이콘을 가지고 있다

해당 인스턴스가 파괴될 때 작동한다. 적 오브젝트가 사망 시 점수 추가나 사망 이펙트를 적용하는 데 유용하다.

인스턴스를 삭제하는 코드나 액션(instance_destroy(); 등)을 사용할 때 실행된다.

4 Other

  • event_other.gif 이런 아이콘을 가지고 있다
  • Outside room
인스턴스의 스프라이트가 룸 밖으로 완전히 나가면 한 번 실행된다. 스프라이트가 없다면 x, y 좌표로 판정한다.
룸 밖으로 나간 총알을 제거하는 용도로 사용할 수 있다.
  • Intersect boundary
인스턴스의 스프라이트가 룸 가장자리에 닿거나 룸 밖으로 나갈 시 연속으로 실행된다. 위와 같이 스프라이트가 없다면 x, y 좌표로 판정한다.
공을 룸 밖으로 나가는 대신 '튕겨져' 돌아오게 하는 용도로 사용할 수 있다.
  • Views
'Outside view 0~7', 'Boundary view 0~7' 등 16종류의 하위 이벤트로 나누어져 있으며 해당 뷰를 사용하고 있지 않다면 작동하지 않는다. 'Outside Room', 'Intersect Boundary'를 뷰를 대상으로 실행한 것과 같다.
  • Game start
특수한 이벤트로써 게임 시작시 한 번 실행된다. 해당 이벤트를 가진 오브젝트가 첫 룸에 배치되어 있어야 한다. 일반적으로 컨트롤러 오브젝트에 정의되며 전역 변수 초기화, 파일 읽기 등에 사용한다.
'Create Event'보다 늦게 시작되는 것에 주의하자.
  • Game end
게임 종료 직전에 한 번 실행되며, 종료되기 전 해당 이벤트를 가진 오브젝트가 룸에 존재해야 한다. 일반적으로 데이터를 저장하기 위해 사용한다.
HTML5 모듈을 이용하여 게임을 제작했을 시 일부 브라우저의 경우 이 이벤트를 지원하지 않을 수 있다.
  • Room start
룸 시작 시 한 번 실행된다. Persistent가 체크된 룸에는 최초 입장 시에만 실행된다.[1]
'Create Event'보다 늦게 실행되는 것에 주의.
  • Room end
룸 종료 시 한 번 실행된다. Persistent가 체크된 룸에서는 실행되지 않는다.
메모리 누수 방지를 위해 파티클 시스템 제거나 리소스 로드 등을 제거하는데 유용하게 쓰일 수 있다.
  • No more lives
기본적으로 제공하는 전역 변수 lives가 0 이하일 때마다 실행된다. 일반적으로 룸 종료, 재시작 용도로 사용한다.
  • No more health
기본적으로 제공하는 전역 변수 health가 0 이하일 때마다 실행된다. 일반적으로 lives를 감산하거나 룸 종료, 재시작 용도로 사용한다.
  • Animation end
스프라이트의 마지막 서브이미지까지 보여지고 첫 번째 서브이미지로 돌아갈 때, 즉 스프라이트의 애니메이션이 한 번 루프된 후 실행된다.
  • Animation update
게임메이커: 스튜디오에만 존재한다. 자세한 사항 추가 바람.
  • End of path
패스가 끝났을 때 실행된다. 타워 디펜스 타입의 게임 등에 중요한 요소로 사용된다.
  • Close button
구 버전 게임메이커에만 존재한다. 게임 창의 X 버튼을 눌렀을 때 실행된다.
  • User defined
특수한 이벤트로써 게임메이커에서 스스로 실행되지 않으며, event_user(n); 코드로 호출할 수 있다. 스크립트 기능과 비슷하나 해당 오브젝트 내에서만 작동하며 스크립트보다 빠르다. 0부터 15까지 16종류를 사용할 수 있다.

5 Alarm

  • event_timer.gif 이런 아이콘을 가지고 있다.

알람을 설정하면 일정 시간 이후 해당 이벤트가 실행된다. 매 시간마다 무엇을 할 것인지 정하는데 매우 유용하다. 같은 주기로 몬스터를 소환하는 등으로 사용할 수 있다. 0부터 11까지 12종류를 사용할 수 있다.

내부적으로는 기본적으로 제공하는 전역 변수 alarm[n]으로 판정하며, 해당하는 알람 이벤트가 없다면 카운트다운되지 않는다.

6 Draw

  • event_draw.gif 이런 아이콘을 가지고 있다

여러 가지 하위 이벤트로 나누어진다.

  • 같은 종류의 Draw 이벤트가 있다면 Begin-일반-End 순으로 실행되고
  • 같은 Draw 이벤트를 여러 인스턴스가 공유한다면 오브젝트의 depth 값이 낮은 순으로 위에 표시되며
  • depth 값이 같다면 인스턴스의 id가 높은 순으로 위에 표시된다.

일반 'Draw' 이벤트를 제외한 8종류의 하위 이벤트는 게임메이커: 스튜디오에서만 사용할 수 있다.

  • Draw
'Draw', 'Draw begin/end'의 3가지로 나누어져 있으며, 게임에 스프라이트, 텍스트 등을 그릴 때 사용된다.
이 이벤트들의 유무에 따라 자신의 스프라이트만 드로우하는 'default draw' 모드와 직접 draw_* 계열 코드나 액션을 사용하여 드로우하는 'custom draw'모드로 나누어진다. 'custom draw'모드에서는 자신의 스프라이트도 드로우되지 않으므로 draw_self(); 등을 이용해 따로 드로우해야 한다.
  • Draw GUI
'Draw GUI', 'Draw GUI begin/end'의 3가지로 나누어져 있으며, 뷰 위치나 크기에 상관없이 화면에 바로 드로우된다. 즉, 게임 창을 기준으로 드로우된다. 이 때문에 뷰 기준으로 드로우하는 좌표 view_xview + x, view_yview + y 대신 사용하기도 하는데 이 이벤트는 창을 기준으로 드로우하기 때문에 뷰를 회전시키거나 창을 늘려도 그 위치에 그대로 드로우되는 점에서 차이가 있으며 Android, iOS 등에서는 제대로 된 위치에 드로우되지 않는다.
  • PreDraw/PostDraw
  • Resize
추가 바람.

7 Step

  • event_step.gif 이런 아이콘을 가지고 있다.

1스텝(1/room_speed초)마다 작동하는 이벤트이다. 항상 작동하는 이밴트라고 보면 된다. 체력 체크를 하거나 딜레이 설정 등으로 쓰인다.
Draw 이벤트도 항상 작동하지만 이쪽은 여타 이벤트보다 실행 순위가 가장 늦게 있으니 잘 생각하면서 쓰자. Draw 이벤트에서도 변수 값을 바꾸거나 오브젝트를 만드는 등 Step 이벤트에서 할 수 있는 모든 행동을 할 수 있지만, Step 이벤트를 따로 만드는 편이 가독성이 나아지니 되도록이면 원래 용도대로 Draw는 드로우만 하자.
'Step', 'Begin/End step'의 3가지로 나누어져 있으며, 실행 순서는 Begin-일반-End이다.

8 Keyboard, Key Press/Release

  • event_keyboard.gif Keyboard 이벤트는 키보드만 그려져 있다.
  • event_keypress.gif Press 이벤트는 빨간 화살표와 키보드가 그려져 있다.
  • event_keyrelease.gif Release 이벤트는 초록 화살표와 키보드가 그려져 있다.

특정 키가 눌려 있을 때 계속(Keyboard), 혹은 특정 키를 누른 순간(Key Press)이나 뗀 순간(Key Release) 한 번 실행된다. 각각

  • 상하좌우 방향키
  • Ctrl/Alt/Shift/스페이스 바/엔터 키
  • 'Keypad' 카테고리 아래에
    • 키패드 0~9
    • /, *, -, +, .
  • 'Digits' 카테고리 아래에 0~9(키패드가 아니라 문자 키 위에 수평으로 배열된 숫자 키를 말한다.)
  • 'Letters' 카테고리 아래에 A~Z
  • 'Function keys' 카테고리 아래에 F1~F12
  • 'Others' 카테고리 아래 백스페이스, Esc, Home, End, Page up/down, Delete, Insert
  • No key(아무 키도 눌리지 않았을 때)
  • Any key(아무 키나 눌렸을 때)

의 82가지로 나누어져 있다.

9 Collision

  • event_collision.gif 이런 아이콘을 가지고 있다.

특정 오브젝트와 충돌했을 때 계속 실행된다. 이벤트의 특성 때문에 현재 게임에 만들어져 있는 오브젝트의 수만큼의 하위 이벤트로 나누어져 있다.
이 이벤트 안에서 코드를 쓸 때, other라는 예약어를 사용해서 other.hp와 같이 충돌한 인스턴스를 참조할 수 있다. 다만, other 자체는 상수일 뿐 충돌한 인스턴스 자체를 나타내지는 않기 때문에 충돌한 인스턴스의 id를 참조하려면 other.id와 같이 써야 한다.

10 Trigger

  • event_trigger.gif 이런 아이콘을 가지고 있다.

구 버전 게임메이커에만 존재한다. GML을 이용하여 직접 실행 조건을 지정할 수 있는 사용자 정의 이벤트.

11 Asynchronous

  • 이미지 추가바람 지구 모양의 아이콘을 가지고 있다

게임메이커: 스튜디오에만 존재한다. 인앱 결제 등 인터넷 환경이 개입되거나 입력과 출력이 시간차를 두고 일어날 경우 사용되는 비동기성 이벤트이다.

'Image Loaded', 'HTTP', 'Dialog', 'IAP', 'Cloud', 'Networking', 'Steam', 'Social', 'Push Notification', 'Save / Load', 'Audio Recording', 'Audio Playback', 'System Event' 등의 13가지로 나누어져 있다.
  1. Persistent가 체크된 룸은 다른 룸으로 가도 사라지지 않고 룸 상태를 유지하기 때문. 'Room end' 이벤트도 마찬가지 이유로 실행되지 않는다.