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

[게임메이커 강좌-기초][GMS2] 다중 충돌 체크 - 충돌 인스턴스 목록화

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

 

 

GAME MAKER 강좌

 

KAYAN

 

 

 

 

 

◈ 다중 충돌 체크 - 인스턴스간의 충돌

 

 

여러개가 동시에 충돌했을 때, 기본 충돌 함수(예: instance_place)를 사용하면 충돌한 상대중 1개만 반환되었죠.

이번 강좌에서는 여러개의 인스턴스가 동시에 충돌했을 때 충돌한 모든 상대를 목록화하는 기능에 대해 알아봅시다.

 

(▲ 충돌 체크)

 

현재 인스턴스와 여러 무리의 인스턴스가 충돌했을 때, 상대 ID를 목록화할 수 있는 기능은 아래와 같습니다.

 


   ◎ instance_place_list(x, y, obj, list, ordered)
   ◎ instance_position_list(x, y, obj, list, ordered)

 

이 기능은 충돌한 상대들의 ID를 리스트 데이터 구조체(ds_list)에 저장하기 때문에 리스트 데이터 구조체도 같이 사용해야 합니다.

리스트 데이터 구조체에 저장하는 ID는 거리별로 정렬시킬 수 있고, 그냥 무작위로 저장할 수도 있죠.

 

 

※ [참고] 기본 함수 : 충돌한 상대중 1개의 인스턴스 ID만 반환함.

   ◎ instance_place(x, y, obj)

   ◎ instance_position(x, y, obj)

 

 

먼저 아래 함수는 현재 인스턴스와 여러 무리 인스턴스간의 충돌했을 때 목록화하는 함수입니다.

 


   ◎ instance_place_list(x, y, obj, list, ordered)


      - x : 인스턴스 충돌을 검사할 x 위치
      - y : 인스턴스 충돌을 검사할 y 위치
      - obj : 인스턴스 충돌을 검사할 오브젝트

      - list : 충돌한 인스턴스의 ID를 저장하는데 사용할 리스트 데이터 구조체 ID(ds_list)
      - ordered : 목록이 거리별로 정렬(true)할지, 또는, 정렬 안 할지 (false) 여부를 지정

 

함수는 instance_position 함수와 같은 기능을 가졌고, 여러개의 ID의 충돌을 감지하여 충돌한

인스턴스들의 ID를 리스트 데이터 구조체에 저장합니다.

거리별로 정렬하면 리스트 데이터 구조체의 0번이 가장 가까운 거리의 인스턴스 ID입니다.

 

(▲ instance_place_list)

 

그리고 함수를 사용할 때, 현재 인스턴스와 충돌 검사할 인스턴스는 충돌 마스크가 설정되어 있어야 합니다.

 

(▲ 충돌 마스크 설정)

 

함수는 충돌한 인스턴스의 수를 반환하며, 만약 충돌한 인스턴스가 없다면 0이 반환됩니다.

 

예)


   var _list = ds_list_create();
   var _num = instance_place_list(x, y, obj_Enemy, _list, false);
   if _num > 0
       {
       for (var i = 0; i < _num; ++i;)
           {
           instance_destroy(_list[| i]);
           }
       }
   ds_list_destroy(_list);

 

예시는 지정한 위치에서 충돌하는 obj_enemy 오브젝트를 검사하여 충돌하는 오브젝트를 모두 파기합니다.

 

 

아래 함수는 지정한 위치에 충돌하는 인스턴스들을 목록화하는 함수입니다.

 


   ◎ instance_position_list(x, y, obj, list, ordered)


      - x : 인스턴스 충돌을 검사할 x 위치
      - y : 인스턴스 충돌을 검사할 y 위치
      - obj : 인스턴스 충돌을 검사할 오브젝트

      - list : 충돌한 인스턴스의 ID를 저장하는데 사용할 리스트 데이터 구조체 ID(ds_list)
      - ordered : 목록이 거리별로 정렬(true)할지, 또는, 정렬 안 할지 (false) 여부를 지정


 

함수는 instance_position 함수와 같은 기능을 가졌고, 여러개의 ID의 충돌을 감지하여 목록화 합니다.

instance_place_list 함수와 마찬가지로 충돌한 인스턴스들의 ID를 리스트 데이터 구조체에 저장합니다.

거리별로 정렬하면 리스트 데이터 구조체의 0번이 가장 가까운 거리의 인스턴스 ID입니다.

 

(▲ instance_position_list)

 

그리고 함수를 사용할 때, 현재 인스턴스와 충돌 검사할 인스턴스는 충돌 마스크가 설정되어 있어야 합니다.

 

함수는 충돌한 인스턴스의 수를 반환하며, 만약 충돌한 인스턴스가 없다면 0이 반환됩니다.

 

예)


   var _list = ds_list_create();
   var _num = instance_position_list(mouse_x, mouse_y, all, _list, false);
   if _num > 0
       {
       for (var i = 0; i < _num; ++i;)
           {
           instance_destroy(_list[| i]);
           }
       }
   ds_list_destroy(_list);

 

예시는 지정한 위치에서 충돌하는 obj_enemy 오브젝트를 검사하여 충돌하는 오브젝트를 모두 파기합니다.

 

 

 

 

 

 

 

 

 

◈ 다중 충돌 체크 - Collision 함수

 

 

오브젝트와 오브젝트 간의 충돌 체크할 수 있는 것 이외에 가상의 도형으로 오브젝트와 충돌 체크하여

목록화 할 수 있는 Collision 함수를 알아봅시다.

 


   ◎ collision_point_list(x, y, obj, prec, notme, list, ordered)
   ◎ collision_line_list(x1, y1, x2, y2, obj, prec, notme, list, ordered)
   ◎ collision_circle_list(x1, y1, rad, obj, prec, notme, list, ordered)
   ◎ collision_ellipse_list(x1, y1, x2, y2, obj, prec, notme, list, ordered)
   ◎ collision_rectangle_list(x1, y1, x2, y2, obj, prec, notme, list, ordered)

 

이 기능은 충돌한 상대들의 ID를 리스트 데이터 구조체(ds_list)에 저장하기 때문에 리스트 데이터 구조체도 같이 사용해야 합니다.

 

 

함수들은 공통적으로 prec, notme를 가지고 있습니다.

 

   ◎ prec : prec 은 정확도를 지정하면 됩니다.

                false 로 지정하면, 충돌 마스크 이미지의 사각형 충돌 경계 상자를 기준으로 단순 체크합니다.

                true (느림)를 지정하면 지정한 충돌 경계 상자 모양대로 체크할 수 있습니다.

               여기서 충돌 모양이 Precise 로 설정된 경우는 이미지 모양 대로 충돌을 체크할 수 있고,

               원형(Disk), 다이아몬드형(Diamond)은 지정한 모양대로 체크 가능합니다.

 

 

   ◎ notme : notme 는 현재 인스턴스를 체크에서 제외 할지를 지정하면 됩니다.

                 true 로 지정하면 현재 인스턴스는 제외하고, false 로 지정하면 함수를 호출하는

                 현재 인스턴스까지 포함하고 충돌 검사합니다.

 

※ [참고] : 체크하려는 obj 가 현재 인스턴스의 parent, 또는, 현재 오브젝트, 현재 인스턴스 id와 같아야, 현재 인스턴스도 체크 할 수 있습니다.

 

※ [참고] : notme 를 false 로 지정하는 경우, 충돌 검사할 오브젝트(obj)가 함수를 호출하는 현재 오브젝트와 동일할 때, 함수를 호출하는 인스턴스 자신을 포함한 오브젝트(obj)의 모든 인스턴스에 대해 충돌 검사를 진행합니다. 이 경우 충돌 검사에서 자기 자신을 포함하기 때문에 자신의 id가 반환될 수 있습니다.

그리고 true 일 경우, 함수를 호출하는 오브젝트의 인스턴스 자신은 제외하고 다른 인스턴스에 대해서만 충돌 검사합니다.

 

 

 

 

※ [참고] 기본 함수 : 충돌한 상대중 1개의 인스턴스 ID만 반환함.

   ◎ collision_point(x, y, obj, prec, notme)

   ◎ collision_line(x1, y1, x2, y2, obj, prec, notme)

   ◎ collision_circle(x1, y1, rad, obj, prec, notme)

   ◎ collision_ellipse(x1, y1, x2, y2, obj, prec, notme)

   ◎ collision_rectangle(x1, y1, x2, y2, obj, prec, notme)

 

 

아래 함수는 지정한 (x,y) 위치와 지정한 오브젝트(obj)들이 충돌했을 때, 상대 인스턴스의 ID들을 목록화 합니다.

 


   ◎ collision_point_list(x, y, obj, prec, notme, list, ordered)


      - x : 충돌을 검사할 위치의 x 좌표
      - y : 충돌을 검사할 위치의 y 좌표

      - obj : 인스턴스 충돌을 검사할 오브젝트

      - prec : 검사가 정확한 충돌 (true, 느림) 또는 일반적으로 경계 상자 (false, 빠름)를 기반으로 할지 지정
      - notme : 호출하는 현재 인스턴스를 검사에서 제외할지 (true), 또는 포함할 지(false) 지정

      - list : 충돌한 인스턴스의 ID를 저장하는데 사용할 리스트 데이터 구조체 ID(ds_list)
      - ordered : 목록이 거리별로 정렬(true)할지, 또는, 정렬 안 할지 (false) 지정

 

함수는 collision_point 함수와 같은 기능을 가졌고, 여러개의 ID의 충돌을 감지하여 목록화 합니다.

거리별로 정렬하면 리스트 데이터 구조체의 0번이 가장 가까운 거리의 인스턴스 ID입니다.

 

(▲ collision_point_list)

 

함수는 충돌한 인스턴스의 수를 반환하며, 만약 충돌한 인스턴스가 없다면 0이 반환됩니다.

 

예)


   var _list = ds_list_create();
   var _num = collision_point_list(x, y, obj_Enemy, false, true, _list, false);
   if _num > 0
       {
       for (var i = 0; i < _num; ++i;)
           {
           instance_destroy(_list[| i]);
           }
       }
   ds_list_destroy(_list);

 

예시는 지정한 위치에서 충돌하는 obj_enemy 오브젝트를 검사하여 충돌하는 오브젝트를 모두 파기합니다.

 

 

아래 함수는 지정한 선분에 지정한 오브젝트(obj)가 충돌했을 때, 상대 인스턴스의 ID 를 목록화하는 함수입니다.

 


   ◎ collision_line_list(x1, y1, x2, y2, obj, prec, notme, list, ordered)


      - x1 : 충돌을 검사할 선 시작 위치의 x 좌표
      - y1 : 충돌을 검사할 선 시작 위치의 y 좌표
      - x2 : 충돌을 검사할 선 끝 위치의 x 좌표
      - y2 : 충돌을 검사할 선 끝 위치의 y 좌표

      - obj : 인스턴스 충돌을 검사할 오브젝트

      - prec : 검사가 정확한 충돌 (true, 느림) 또는 일반적으로 경계 상자 (false, 빠름)를 기반으로 할지 지정
      - notme : 호출하는 현재 인스턴스를 검사에서 제외할지 (true), 또는 포함할 지(false) 지정

      - list : 충돌한 인스턴스의 ID를 저장하는데 사용할 리스트 데이터 구조체 ID(ds_list)
      - ordered : 목록이 거리별로 정렬(true)할지, 또는, 정렬 안 할지 (false) 지정

 

(x1,y1)과 (x2,y2)로 선의 길이를 지정할 수 있습니다.

 

함수는 collision_line 함수와 같은 기능을 가졌고, 여러개의 ID의 충돌을 감지하여 목록화 합니다.

거리별로 정렬하면 리스트 데이터 구조체의 0번이 가장 가까운 거리의 인스턴스 ID입니다.

 

(▲ collision_line_list)

 

함수는 충돌한 인스턴스의 수를 반환하며, 만약 충돌한 인스턴스가 없다면 0이 반환됩니다.

 

예)


   var _list = ds_list_create();
   var _num = collision_line_list(x - 100, y, x + 100, y, obj_Enemy, false, true, _list, false);
   if _num > 0
       {
       for (var i = 0; i < _num; ++i;)
           {
           instance_destroy(_list[| i]);
           }
       }
   ds_list_destroy(_list);

 

예시는 지정한 위치에서 충돌하는 obj_enemy 오브젝트를 검사하여 충돌하는 오브젝트를 모두 파기합니다.

 

 

아래 함수는 지정한 원형에, 지정한 오브젝트(obj)가 충돌했을 때, 상대 인스턴스의 ID 를 목록화하는 함수입니다.

 


   ◎ collision_circle_list(x1, y1, rad, obj, prec, notme, list, ordered);


      - x1 : 충돌을 검사할 원 중심 위치의 x 좌표
      - y1 : 충돌을 검사할 원 중심 위치의 y 좌표
      - rad : 반지름 (중앙에서 가장자리까지의 거리,픽셀 단위)

      - obj : 인스턴스 충돌을 검사할 오브젝트

      - prec : 검사가 정확한 충돌 (true, 느림) 또는 일반적으로 경계 상자 (false, 빠름)를 기반으로 할지 지정
      - notme : 호출하는 현재 인스턴스를 검사에서 제외할지 (true), 또는 포함할 지(false) 지정

      - list : 충돌한 인스턴스의 ID를 저장하는데 사용할 리스트 데이터 구조체 ID(ds_list)
      - ordered : 목록이 거리별로 정렬(true)할지, 또는, 정렬 안 할지 (false) 지정

 

(x1, y1) 는 원형의 중심점, rad 는 반지름을 지정하면 됩니다.

 

함수는 collision_circle 함수와 같은 기능을 가졌고, 여러개의 ID의 충돌을 감지하여 목록화 합니다.

거리별로 정렬하면 리스트 데이터 구조체의 0번이 가장 가까운 거리의 인스턴스 ID입니다.

 

(▲ collision_circle_list)

 

함수는 충돌한 인스턴스의 수를 반환하며, 만약 충돌한 인스턴스가 없다면 0이 반환됩니다.

 

예)


   var _list = ds_list_create();
   var _num = collision_circle_list(x, y, 100, obj_Enemy, false, true, _list, false);
   if _num > 0
       {
       for (var i = 0; i < _num; ++i;)
           {
           instance_destroy(_list[| i]);
           }
       }
   ds_list_destroy(_list);

 

예시는 지정한 위치에서 충돌하는 obj_enemy 오브젝트를 검사하여 충돌하는 오브젝트를 모두 파기합니다.

 

 

이 함수는 지정한 타원형에 지정한 오브젝트(obj)가 충돌했을 때, 상대 인스턴스의 ID 를 목록화하는 함수입니다.

 


   ◎ collision_ellipse_list(x1, y1, x2, y2, obj, prec, notme, list, ordered);


      - x1 : 충돌을 검사할 타원 왼쪽 위치의 x 좌표
      - y1 : 충돌을 검사할 타원 위쪽 위치의 y 좌표
      - x2 : 충돌을 검사할 타원 오른쪽 위치의 x 좌표
      - y2 : 충돌을 검사할 타원 아래쪽 위치의 y 좌표

      - obj : 인스턴스 충돌을 검사할 오브젝트

      - prec : 검사가 정확한 충돌 (true, 느림) 또는 일반적으로 경계 상자 (false, 빠름)를 기반으로 할지 지정
      - notme : 호출하는 현재 인스턴스를 검사에서 제외할지 (true), 또는 포함할 지(false) 지정

      - list : 충돌한 인스턴스의 ID를 저장하는데 사용할 리스트 데이터 구조체 ID(ds_list)
      - ordered : 목록이 거리별로 정렬(true)할지, 또는, 정렬 안 할지 (false) 지정

 

좌측 상단(x1,y1), 우측 하단(x2,y2)로 타원형의 크기(사각형 지정과 같음)를 설정할 수 있습니다.

 

함수는 collision_ellipse 함수와 같은 기능을 가졌고, 여러개의 ID의 충돌을 감지하여 목록화 합니다.

거리별로 정렬하면 리스트 데이터 구조체의 0번이 가장 가까운 거리의 인스턴스 ID입니다.

 

(▲ collision_ellipse_list)

 

함수는 충돌한 인스턴스의 수를 반환하며, 만약 충돌한 인스턴스가 없다면 0이 반환됩니다.

 

예)


   var _list = ds_list_create();
   var _num = collision_ellipse_list(x - 100, y - 100, x + 100, y + 100, obj_Enemy, false, true, _list, false);
   if _num > 0
       {
       for (var i = 0; i < _num; ++i;)
           {
           instance_destroy(_list[| i]);
           }
       }
   ds_list_destroy(_list);

 

예시는 지정한 위치에서 충돌하는 obj_enemy 오브젝트를 검사하여 충돌하는 오브젝트를 모두 파기합니다.

 

 

이 함수는 지정한 사각형 위치에, 지정한 오브젝트(obj)가 충돌했을 때, 상대 인스턴스의 ID 를 목록화하는 함수입니다.

 


   ◎ collision_rectangle_list(x1, y1, x2, y2, obj, prec, notme, list, ordered);


      - x1 : 충돌을 검사할 사각형 왼쪽 위치의 x 좌표
      - y1 : 충돌을 검사할 사각형 위쪽 위치의 y 좌표
      - x2 : 충돌을 검사할 사각형 오른쪽 위치의 x 좌표
      - y2 : 충돌을 검사할 사각형 아래쪽 위치의 y 좌표

      - obj : 인스턴스 충돌을 검사할 오브젝트

      - prec : 검사가 정확한 충돌 (true, 느림) 또는 일반적으로 경계 상자 (false, 빠름)를 기반으로 할지 지정
      - notme : 호출하는 현재 인스턴스를 검사에서 제외할지 (true), 또는 포함할 지(false) 지정

      - list : 충돌한 인스턴스의 ID를 저장하는데 사용할 리스트 데이터 구조체 ID(ds_list)
      - ordered : 목록이 거리별로 정렬(true)할지, 또는, 정렬 안 할지 (false) 지정

 

좌측 상단(x1, y1), 우측 하단(x2, y2)로 사각형의 크기를 설정할 수 있습니다.

 

함수는 collision_rectangle 함수와 같은 기능을 가졌고, 여러개의 ID의 충돌을 감지하여 목록화 합니다.

거리별로 정렬하면 리스트 데이터 구조체의 0번이 가장 가까운 거리의 인스턴스 ID입니다.

 

(▲ collision_rectangle_list)

 

함수는 충돌한 인스턴스의 수를 반환하며, 만약 충돌한 인스턴스가 없다면 0이 반환됩니다.

 

예)


   var _list = ds_list_create();
   var _num = collision_rectangle_list(x - 100, y - 100, x + 100, y + 100, obj_Enemy, false, true, _list, false);
   if _num > 0
       {
       for (var i = 0; i < _num; ++i;)
           {
           instance_destroy(_list[| i]);
           }
       }
   ds_list_destroy(_list);

 

예시는 지정한 위치에서 충돌하는 obj_enemy 오브젝트를 검사하여 충돌하는 오브젝트를 모두 파기합니다.

 

 

 

 

 

300x250

댓글