GAME MAKER 강좌
KAYAN
◈ 가상의 충돌 체크 - 좌표 충돌 체크
게임메이커에서는 가상의 영역을 지정하여 특정 좌표 또는 가상의 도형을 만들어 충돌하는지 체크할 수 있는 기능이 있습니다.
이 기능은 오브젝트의 [충돌 이벤트]를 실행시키는 스프라이트 이미지의 충돌 마스크 기능과는 전혀 관계가 없습니다.
즉, 가상의 충돌 이벤트를 구성할 수 있는 기능이라 보시면 됩니다.
이번 강좌에서는 가상의 영역과의 충돌 여부를 확인할 수 있는 함수에 대해 알아보도록 합시다.
먼저 특정 좌표가 가상의 영역 내에 있는지를 체크할 수 있는 함수부터 알아봅시다.
범위 체크는 원형, 사각형, 삼각형으로 체크할 수 있습니다.
◎ point_in_circle(px, py, x1, y1, rad) : 원형 체크 ◎ point_in_rectangle(px, py, x1, y1, x2, y2) : 사각형 체크 ◎ point_in_triangle(px, py, x1, y1, x2, y2, x3, y3) : 삼각형 체크 |
아래 함수를 사용하면 지정한 좌표가 가상의 원형 영역 내에 있는지를 확인할 수 있습니다.
◎ point_in_circle(px, py, x1, y1, rad) - px : (목표물) 확인할 소스 위치의 x 좌표 - py : (목표물) 확인할 소스 위치의 y 좌표 - x1 : (검사대) 원 중심의 x 좌표 - y1 : (검사대) 원 중심의 y 좌표 - rad : (검사대) 원의 반지름 |
함수는 좌표가 정의된 원 안에 있으면 true를 반환하고, 그렇지 않으면 함수는 false를 반환합니다.
(▲ point_in_circle)
예)
if point_in_circle(mouse_x, mouse_y, x, y, 16) { over = true; } else { over = false; } |
예시는 반지름이 16인 원 안에 마우스 좌표가 있으면 over 변수에 true 값을 할당하고,
그렇지 않으면 false 값을 할당합니다.
아래 함수는 지정한 좌표가 가상의 사각형 영역 내에 있는지를 확인할 수 있습니다.
◎ point_in_rectangle(px, py, x1, y1, x2, y2) - px : (목표물) 확인할 소스 위치의 x 좌표 - py : (목표물) 확인할 소스 위치의 y 좌표 - x1 : (검사대) 사각형 왼쪽의 x 좌표 - y1 : (검사대) 사각형 위쪽의 y 좌표 - x2 : (검사대) 사각형 오른쪽의 x 좌표 - y2 : (검사대) 사각형 아래쪽의 y 좌표 |
함수는 좌표가 정의된 사각형 안에 있으면 true를 반환하고, 그렇지 않으면 함수는 false를 반환합니다.
(▲ point_in_rectangle)
예)
if point_in_rectangle(mouse_x, mouse_y, x -10, y - 10, x + 10, y + 10) { audio_play_sound(snd_click, 0, false); } |
예시는 지정한 사각형 안에 마우스 좌표가 있으면 사운드를 재생합니다.
다음은 지정한 좌표가 가상의 삼각형 영역 내에 있는지를 확인할 수 있습니다.
◎ point_in_triangle(px, py, x1, y1, x2, y2, x3, y3) - px : (목표물) 확인할 소스 위치의 x 좌표 - py : (목표물) 확인할 소스 위치의 y 좌표 - x1 : (검사대) 삼각형의 첫 번째 모서리의 x 좌표 - y1 : (검사대) 삼각형의 첫 번째 모서리의 y 좌표 - x2 : (검사대) 삼각형의 두 번째 모서리의 x 좌표 - y2 : (검사대) 삼각형의 두 번째 모서리의 y 좌표 - x3 : (검사대) 삼각형의 세 번째 모서리의 x 좌표 - y3 : (검사대) 삼각형의 세 번째 모서리의 y 좌표 |
함수는 좌표가 정의된 삼각형 안에 있으면 true를 반환하고, 그렇지 않으면 함수는 false를 반환합니다.
(▲ point_in_triangle)
예)
var inst = instance_nearest(x, y, obj_Player); if instance_exists(inst) { var x1 = x + lengthdir_x(100, image_angle - 45); var y1 = y + lengthdir_y(100, image_angle - 45); var x2 = x + lengthdir_x(100, image_angle + 45); var y2 = y + lengthdir_y(100, image_angle + 45); if point_in_triangle(inst.x, inst.y, x, y, x1, y1, x2, y2) { can_see = true; } } |
예시는 가까운 obj_Player 오브젝트의 (x, y) 좌표가 지정한 삼각형 안에 있으면 can_see 변수에 true 값을 할당합니다.
◈ 가상의 충돌 체크 - 가상의 도형과의 충돌 체크
다음은 가상의 도형이 지정한 영역 내에 있는지를 체크할 수 있는 함수입니다.
범위 체크는 좌표 체크와 마찬가지로 원형, 사각형, 삼각형으로 체크할 수 있습니다.
◎ rectangle_in_circle(sx1, sy1, sx2, sy2, x, y, rad) : 원형 ◎ rectangle_in_rectangle(sx1, sy1, sx2, sy2, dx1, dy1, dx2, dy2) : 사각형 ◎ rectangle_in_triangle(sx1, sy1, sx2, sy2, dx1, dy1, dx2, dy2, dx3, dy3) : 삼각형 |
먼저 원형 안에 사각형과의 충돌여부를 확인할 수 있는 함수입니다.
◎ rectangle_in_circle(sx1, sy1, sx2, sy2, x, y, rad) - sx1 : (목표물) 확인할 사각형 소스 왼쪽의 x 좌표 - sy1 : (목표물) 확인할 사각형 소스 위쪽의 y 좌표 - sx2 : (목표물) 확인할 사각형 소스 오른쪽의 x 좌표 - sy2 : (목표물) 확인할 사각형 소스 아래쪽의 y 좌표 - x : (검사대) 원 중심의 x 좌표 - y : (검사대) 원 중심의 y 좌표 - rad : (검사대) 충돌을 확인할 중심점 주변의 반지름 |
이 함수는 정의한 사각형과 충돌하지 않았는지, 사각형 소스가 완전히 원형 대상 경계 내부에
완전히 들어가 있는지, 아니면 정의된 원형 영역을 단순히 겹치고 있는지를 확인할 수 있습니다.
(▲ rectangle_in_circle)
그들끼리 충돌하지 않으면 함수는 0 을 반환하고, 소스가 대상 내부에 완전히 들어가
있으면 1 을 반환하며, 단순히 겹치는 경우 2 를 반환합니다.
예)
inst = instance_nearest(x, y, obj_Bullet); if instance_exists(inst) { if rectangle_in_circle(inst.x - 5, inst.y - 5, inst.x + 5, inst.y + 5, x, y - 25, 20) > 0 { hit = true; } } |
예시는 가까운 obj_Bullet 오브젝트의 위치를 중심으로10 x 10 크기의 사각형을 만들어
지정한 원형 범위 내에 충돌하는 경우 hit 변수에 true 값을 할당합니다.
아래 함수는 지정한 두 사각형과의 충돌여부를 확인 할 수 있습니다.
◎ rectangle_in_rectangle(sx1, sy1, sx2, sy2, dx1, dy1, dx2, dy2) - sx1 : (목표물) 확인할 사각형 소스 왼쪽의 x 좌표 - sy1 : (목표물) 확인할 사각형 소스 위쪽의 y 좌표 - sx2 : (목표물) 확인할 사각형 소스 오른쪽의 x 좌표 - sy2 : (목표물) 확인할 사각형 소스 아래쪽의 y 좌표 - dx1 : (검사대) 사각형 왼쪽의 x 좌표 - dy1 : (검사대) 사각형 위쪽의 y 좌표 - dx2 : (검사대) 사각형 오른쪽의 x 좌표 - dy2 : (검사대) 사각형 아래쪽의 y 좌표 |
이 함수는 정의한 두 개의 사각형 영역을 확인하여, 그들이 충돌하지 않았는지, 사각형 소스가
대상 사각형 경계 내부에 완전히 들어가 있는지, 아니면 단순히 겹치고 있는지를 확인합니다.
(▲ rectangle_in_rectangle)
그들이 충돌하지 않으면 함수는 0 을 반환하고, 사각형 소스가 사각형 대상 내부에 완전히
들어가 있으면 1 을 반환하며, 단순히 겹치는 경우 2 를 반환합니다.
예)
switch(rectangle_in_rectangle(x - 50, y - 50, x + 50, y + 50, mouse_x - 50, mouse_y - 50, mouse_x + 50, mouse_y + 50)) { case 0: image_blend = c_yellow; break; case 1: image_blend = c_red; break; case 2: image_blend = c_orange; break; } |
예시는 현재 오브젝트 좌표를 중심으로 100x100 크기의 사각형을 만들고, 마우스 좌표 중심인 100x100 크기의
사각형과의 충돌여부에 따라 image_blend 변수에 색을 할당합니다.
아래 함수는 지정한 삼각형 영역과 사각형 소스와의 충돌여부를 확인 할 수 있습니다.
◎ rectangle_in_triangle(sx1, sy1, sx2, sy2, dx1, dy1, dx2, dy2, dx3, dy3) - sx1 : (목표물) 확인할 사각형 소스 왼쪽의 x 좌표 - sy1 : (목표물) 확인할 사각형 소스 위쪽의 y 좌표 - sx2 : (목표물) 확인할 사각형 소스 오른쪽의 x 좌표 - sy2 : (목표물) 확인할 사각형 소스 아래쪽의 y 좌표 - x1 : (검사대) 삼각형의 첫 번째 모서리의 x 좌표 - y1 : (검사대) 삼각형의 첫 번째 모서리의 y 좌표 - x2 : (검사대) 삼각형의 두 번째 모서리의 x 좌표 - y2 : (검사대) 삼각형의 두 번째 모서리의 y 좌표 - x3 : (검사대) 삼각형의 세 번째 모서리의 x 좌표 - y3 : (검사대) 삼각형의 세 번째 모서리의 y 좌표 |
이 함수는 정의한 삼각형 영역과 사각형 소스 영역을 확인하여, 두 개의 영역이 충돌하지 않았는지,
사각형 소스가 삼각형 대상 경계 내부에 완전히 들어가 있는지, 아니면 단순히 겹치고 있는지 확인합니다.
(▲ rectangle_in_triangle)
그들이 충돌하지 않으면 함수는 0 을 반환하고, 사각형 소스가 삼각형 대상 내부에 완전히
들어가 있으면 1 을 반환하며, 단순히 겹치는 경우 2 를 반환합니다.
예)
var inst = instance_nearest(x, y, obj_Player); if instance_exists(inst) { var x1 = x + lengthdir_x(100, image_angle - 45); var y1 = y + lengthdir_y(100, image_angle - 45); var x2 = x + lengthdir_x(100, image_angle + 45); var y2 = y + lengthdir_y(100, image_angle + 45); if rectangle_in_triangle(inst.bbox_left, inst.bbox_top, inst.bbox_right, inst.bbox_bottom, x, y, x1, y1, x2, y2) == 1 { can_see = true; } } |
예시는 가까운 obj_Player 오브젝트의 충돌 마스크 경계가 지정한 삼각형 안에 완전히 들어가 있다면,
can_see 변수에 true 값을 할당합니다.
'GameMaker강좌[GMS2] > GMS2기초강좌' 카테고리의 다른 글
[게임메이커 강좌-기초][GMS2]룸 순서 변경 (0) | 2023.07.11 |
---|---|
[게임메이커 강좌-기초][GMS2] 다중 충돌 체크 - 충돌 인스턴스 목록화 (0) | 2023.02.15 |
[게임메이커강좌-기초][GMS2] collision 충돌 체크 함수 (0) | 2023.02.14 |
[게임메이커 강좌-기초][GMS2] 기본 충돌 체크 함수 (0) | 2023.02.14 |
[게임메이커 강좌-기초][GMS2] 충돌 체크와 충돌 이벤트 (0) | 2023.02.13 |
댓글