이동 및 제어
이 문서에서는 화면에 물체를 그리는 방법에 대한 예제를 다루었지만, 물체를 그리는 것만으로는 충분하지 않습니다. 따라서 이 섹션에서는 객체의 이동 방법과 다양한 게임 유형에 대한 기본 제어 방식을 설명합니다. 모든 예제는 GML Visual과 GML 코드로 제공되므로, 편한 방식을 선택하여 사용할 수 있습니다.
마우스를 향해 이동하기
객체가 사용자와 상호작용하며 이동하는 가장 간단한 방법 중 하나는 마우스를 사용하는 것입니다. 이 예제에서는 사용자가 왼쪽 마우스 버튼을 클릭한 위치로 객체가 이동하도록 하는 기본 코드를 보여줍니다.
- 객체를 열고 스프라이트를 할당한 후,
Global Left Mouse Down
이벤트를 추가합니다. - 다음 코드를 추가합니다:
move_towards_point(mouse_x, mouse_y, 2);
이 코드는 객체가 화면의 특정 위치로 이동하도록 지시합니다. mouse_x
와 mouse_y
는 현재 마우스 커서의 위치를 나타내는 내장 변수입니다.
- 이 객체의 인스턴스를 방에 배치하고 플레이 버튼을 눌러 방을 클릭하여 인스턴스가 마우스를 따라 이동하는지 확인합니다.
문제 해결
- 버튼을 놓으면 인스턴스가 계속 이동하는 문제:
Global Mouse Button Released
이벤트를 추가하고 다음 코드를 입력합니다:
speed = 0;
- 인스턴스가 마우스를 따라 진동하는 문제:
Step Event
를 추가하고 다음 코드를 입력합니다:
var _dist = point_distance(x, y, mouse_x, mouse_y);
if (_dist <= speed) {
speed = 0;
}
4방향 및 8방향 이동
이제 객체를 4방향(위, 아래, 왼쪽, 오른쪽)으로 이동하는 방법을 보여줍니다.
- 객체를 열고 스프라이트를 할당한 후,
Step Event
를 추가합니다. - 다음 코드를 입력합니다:
if (keyboard_check(vk_left)) {
x = x - 2;
} else if (keyboard_check(vk_right)) {
x = x + 2;
} else if (keyboard_check(vk_up)) {
y = y - 2;
} else if (keyboard_check(vk_down)) {
y = y + 2;
}
이 코드는 인스턴스가 한 번에 하나의 방향으로만 이동하도록 합니다.
8방향 이동으로 확장하기
4방향 이동 코드를 수정하여 8방향 이동으로 쉽게 변환할 수 있습니다. else
명령을 제거하여 다음과 같이 변경합니다:
if (keyboard_check(vk_left)) {
x = x - 2;
}
if (keyboard_check(vk_right)) {
x = x + 2;
}
if (keyboard_check(vk_up)) {
y = y - 2;
}
if (keyboard_check(vk_down)) {
y = y + 2;
}
게임패드 이동
게임패드의 왼쪽 아날로그 스틱을 사용하여 이동하는 방법을 다룹니다.
Create Event
에서 다음 코드를 추가하여 연결된 게임패드를 감지합니다:
gamepads = [];
Async System
이벤트를 사용하여 게임패드가 연결되거나 연결 해제될 때 처리합니다:
if (async_load[? "event_type"] == "gamepad discovered") {
var _pad = async_load[? "pad_index"];
gamepad_set_axis_deadzone(_pad, 0.2);
array_push(gamepads, _pad);
} else if (async_load[? "event_type"] == "gamepad lost") {
var _pad = async_load[? "pad_index"];
var _index = array_get_index(gamepads, _pad);
array_delete(gamepads, _index, 1);
}
Step Event
를 추가하고 다음 코드를 입력하여 실제 이동을 구현합니다:
if (array_length(gamepads) > 0) {
var _h = gamepad_axis_value(gamepads[0], gp_axislh);
var _v = gamepad_axis_value(gamepads[0], gp_axislv);
x += _h * 4;
y += _v * 4;
}
고급 8방향 이동
8방향 이동에서 대각선 이동이 수직 및 수평 이동보다 빠른 문제를 해결합니다.
Step Event
에서 다음 코드를 추가합니다:
var _left = keyboard_check(vk_left);
var _right = keyboard_check(vk_right);
var _up = keyboard_check(vk_up);
var _down = keyboard_check(vk_down);
var _hspd = _right - _left;
var _vspd = _down - _up;
- 다음 코드를 추가하여 인스턴스를 이동시킵니다:
||
|---|
var _spd = 4;
var _dir = point_direction(0, 0, _hspd, _vspd);
var _xadd = lengthdir_x(_spd, _dir);
var _yadd = lengthdir_y(_spd, _dir);
x = x + _xadd;
y = y + _yadd;
}
이 코드는 대각선 이동 속도를 조절하여 부드러운 8방향 이동을 구현합니다.
기능 | 설명 |
---|---|
마우스 이동 | 객체가 마우스를 따라 이동 |
4방향 이동 | 위, 아래, 왼쪽, 오른쪽으로 이동 |
8방향 이동 | 대각선 포함한 이동 |
게임패드 이동 | 아날로그 스틱을 사용한 이동 |
고급 8방향 이동 | 대각선 이동 속도 조절 |
이 예제들을 통해 여러분은 자신의 프로젝트를 시작할 수 있는 충분한 이해를 얻었기를 바랍니다.