본문 바로가기
GameMaker강좌[GMS2]/GMS2기초강좌

[게임메이커 강좌-기초][GMS2] 가상의 충돌 체크

by 타락카얀 2023. 2. 15.
728x90

 

 

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 값을 할당합니다.

 

 

 

 

 

300x250

댓글