move_and_collide 함수 설명
move_and_collide
함수는 주어진 거리만큼 X 및 Y 축에서 인스턴스를 이동시키면서 특정 객체나 타일 맵과의 충돌을 피하는 기능을 제공합니다. 이 함수는 인스턴스가 경사면이나 작은 단계들을 탐색하면서 이동할 수 있도록 도와줍니다. 함수는 충돌한 인스턴스와 타일 맵의 ID를 포함하는 배열을 반환합니다.
함수 작동 방식
이 함수는 인스턴스를 단계별로 이동시키며 각 단계에서 충돌을 확인합니다. obj
인자는 피해야 할 객체, 인스턴스 또는 타일 맵을 지정하며, 기본적으로 함수는 4단계로 인스턴스를 이동시킵니다(이 값은 num_iterations
인자를 통해 변경할 수 있습니다). 각 반복에서 인스턴스는 주어진 방향으로 point_distance(0, 0, dx, dy)/num_iterations
픽셀만큼 이동하고 충돌을 확인합니다.
예를 들어, num_iterations
가 4이고 (8, 0)
으로 이동하고자 할 경우, 인스턴스는 각 반복에서 2픽셀씩 이동한 후 충돌을 확인합니다. 만약 충돌이 발견되면, 인스턴스는 충돌을 피하기 위해 dx
, dy
방향의 수직 방향으로 이동하려고 시도합니다.
속도 제한
선택적 인자 max_x_move
와 max_y_move
를 사용하면 인스턴스가 X 및 Y 축에서 이동할 수 있는 최대 거리를 지정할 수 있습니다. 이는 플랫폼 게임에서 흔히 발생하는 문제를 피하는 데 도움이 됩니다. 이 함수는 인스턴스의 스프라이트 충돌 마스크를 사용하여 충돌을 확인합니다.
함수 문법
move_and_collide(dx, dy, obj, [num_iterations], [xoff], [yoff], [max_x_move], [max_y_move]);
인자 이름 | 타입 | 설명 |
---|---|---|
dx | Real | X 축을 따라 이동하려는 거리 |
dy | Real | Y 축을 따라 이동하려는 거리 |
obj | Object Asset | 피해야 할 객체, 인스턴스, 타일 맵 ID, 키워드 all/other 또는 이 항목들을 포함하는 배열 |
num_iterations | Real | 이동할 단계 수 (기본값은 4) |
xoff | Real | 충돌 시 이동할 방향의 X 성분; 기본 동작을 사용하려면 0을 지정 |
yoff | Real | 충돌 시 이동할 방향의 Y 성분; 기본 동작을 사용하려면 0을 지정 |
max_x_move | Real | X 축에서 인스턴스가 이동할 최대 속도; 제한 없음은 -1로 지정 (기본 동작) |
max_y_move | Real | Y 축에서 인스턴스가 이동할 최대 속도; 제한 없음은 -1로 지정 (기본 동작) |
반환값
- 배열: 충돌한 객체 인스턴스의 배열
활용 예제
예제 1: 기본 이동
move_and_collide(8, 0, all);
위 코드는 호출된 인스턴스를 오른쪽으로 8픽셀 이동시키고 모든 객체 인스턴스를 피하려고 시도합니다. num_iterations
인자가 제공되지 않았으므로 기본값인 4가 사용됩니다.
예제 2: 충돌한 인스턴스 표시
var _colliding_instances = move_and_collide(speed_x, speed_y, obj_terrain);
for (var i = 0; i < array_length(_colliding_instances); i++) {
var _collider = _colliding_instances[i];
with (_collider) {
show_debug_message("Collision with instance {0}", id);
}
}
위 코드는 호출된 인스턴스에서 move_and_collide
함수를 실행합니다. 사용자 정의 speed_x
와 speed_y
변수를 사용하여 이동을 시도하고 obj_terrain
인스턴스를 피하려고 합니다. 충돌한 인스턴스는 임시 배열 _colliding_instances
에 저장되고, for 루프와 show_debug_message
를 통해 표시됩니다.
예제 3: 타일 맵
var _tilemap = layer_tilemap_get_id("Tiles_1");
move_and_collide(8, 0, _tilemap);
위 코드는 호출된 인스턴스를 오른쪽으로 8픽셀 이동시키고 "Tiles_1" 레이어의 타일과 충돌하지 않도록 시도합니다. 타일 맵 ID는 한 번만 가져오면 되므로 첫 번째 줄을 Create 이벤트로 이동할 수 있습니다.