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

[게임메이커 강좌-기초][GMS2] 충돌 체크와 충돌 이벤트

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

 

 

GAME MAKER 강좌

 

KAYAN

 

 

 

 

 

◈ 충돌 체크와 충돌 이벤트

 

 

 

이번 강좌에서는 충돌 이벤트에 대해 알아보도록 합시다.

 

 

(▲ 충돌 체크)

 

스프라이트는 게임에서 보여줄 수 있는 이미지이며, 이것은 애니메이션으로 구성할 수 있습니다.

또한, 이것은 게임메이커에서 충돌 체크에 관련된 충돌 마스크(Collision mask)라는 중요한 역할을 합니다.

 

(▲ 충돌 마스크)

 

이 충돌 마스크의 범위를 어떻게 설정했는가에 따라, 오브젝트 간의 충돌시 피격범위가 달라 질 수 있습니다.

즉, 화면의 이미지상에 보이는 것과는 달리 전혀 다른 위치에서 충돌이 이루어 질 수도 있다는 것이지요.

따라서 그런 것들을 고려하여 충돌 마스크 범위를 설정하는 것이 중요합니다.

 

충돌 마스크 설정은 먼저 어떤 기준으로 마스크를 지정할 것인지 선택합니다.

 

 

   ◎ 모드

 

      - Automatic : 자동 설정

      - Full Image : 전체 이미지

      - Manual : 메뉴얼

 

 

[Automatic]은 이미지의 투명도를 계산하여 충돌 범위를 자동으로 잡아주고, [Full image]

이미지의 형태와는 상관없이 이미지 전체크기를 기준으로 처리하며, [Manual]은 사용자가

직접 충돌 범위를 지정할 수 있습니다.

 

다음은 모양을 지정합니다.

 

(▲ 충돌 경계 모양)

 

   ◎ 타입(모양)

 

      - Rectangle : 사각형(기본)

      - Rectangle with rotation : 사각형(image_angle 로 회전해도 유효범위 유지)

      - Ellipse : 타원형

      - Diamond : 다이아몬드형

      - Precise : 모든 이미지 프레임을 합친 이미지 모양으로 처리(투명한 부분 제외)

      - Precise Per Frame : 이미지 프레임별로 마스크를 처리(투명한 부분 제외)

 

 

기본 [Rectangle] 설정은 충돌 처리가 빠르고, 나머지 설정은 정확한 충돌 체크를 기본으로 하기 때문에

충돌 처리가 느리다고 합니다만, 사실 그렇게 눈에 띄지는 않습니다.

 

주의 할 것은 충돌 마스크 설정은 image_angle 내장 변수값(스프라이트 이미지 회전)에 영향을 받는 점입니다.

기본 [Rectangle] 설정은 image_angle 값에 따라 충돌 경계 범위가 늘어날 수 있고,

다른 충돌 모양은 image_angle 값에 회전이 적용되어 충돌 경계 모양을 유지합니다.

 

(▲ 기본 Rectangle 설정은 회전시 충돌 경계 범위가 늘어남)

 

[Rectangle with rotation] 는 기본 [Rectangle] 설정과 같지만, image_angle 값에 따라 충돌 경계 범위도

회전하게 되어 일정하게 충돌 체크를 할 수 있습니다.

[Ellipse], [Diamond] 타입도 충돌 경계 범위가 회전합니다.

 

(▲ Rectangle with rotation 설정)

 

[Precise] 는 이미지에서 완전하게 투명한 부분은 제외하고, 색칠해져 있는 부분만 충돌 경계 범위로 설정합니다.

 

(▲ Precise 설정)

 

즉, [Precise] 는 이미지의 완전히 투명한 부분은 충돌 체크가 되지 않습니다.

다만, 이것은 스프라이트 이미지의 모든 프레임 합쳤을 때의 이미지를 기준으로 하기 때문에,

단일 프레임은 상관없지만, 여러 프레임인 경우, 첫 프레임에 완전히 투명한 부분이 있더라도

그 다음 프레임에 그 부분이 색칠해져 있다면 충돌 경계 범위에 포함하게 됩니다.

 

만약 프레임마다 별도로 체크하고 싶다면, [Precise Per Frame] 타입을 설정하시면 됩니다.

 

 

게임의 상황에 맞추어 충돌 마스크를 설정하면 됩니다.

 

오브젝트에 별도의 마스크를 지정하지 않으면 오브젝트에 지정된 스프라이트 이미지가 기본 마스크로 설정됩니다.

 

충돌 마스크를 별도로 지정(오브젝트의 Collision Mask)하게 되면, 오브젝트의 Sprite 에 지정된

스프라이트 이미지의 충돌 설정은 무시되고, 충돌 마스크로 지정한 충돌 설정대로 체크하게 됩니다.

 

(▲ 충돌 마스크 지정)

 

충돌 체크는 기본적으로 [Collision 이벤트]를 통해 체크할 수 있습니다.

 

(▲ 충돌 이벤트)

 

[Collision 이벤트]는 충돌을 체크할 오브젝트를 지정해주고, 충돌시 해당 오브젝트 간의 이벤트를 구성할 수 있습니다.

이 이벤트에서 충돌 대상을 제어할 수 있는데, 그 때 other 라는 기능 사용할 수 있습니다.

other 는 충돌 대상을 지칭하는 기능입니다.

예를 들어, 충돌 대상의 HP라는 변수를 -5 만큼 감소시킨다면,

 


   other.HP-=5;

 

[Collision 이벤트]에서 이와 같이 할 수 있어요.

참고로 other 는 충돌 상대를 지칭하는 것일 뿐, 충돌 상대의 id 를 반환하는 것이 아니기 때문에,

충돌 상대 인스턴스의 id가 필요할 경우, other.id 로 해야 id 값을 얻을 수 있습니다.

 

이 기능은 with 문 안에서도 사용할 수 있는데, with 문 안에서는 with 문을 실행하는 오브젝트를 지칭합니다.

예를 들어, 아래와 같이

 


   // A 오브젝트에서 실행
   
   with(B){other.set+=1;}


 

A 오브젝트에서 with 문을 실행했을 때, other 는 with 문을 실행하는 A 오브젝트의 set 변수를 제어하게 됩니다.

 


   // A 오브젝트에서 실행
   
   with(B){with(C){other.set+=1;}}


 

이와 같은 경우, other 가 있는 with문을 B 오브젝트에서 실행하기 때문에, other는 A가 아닌, B의 set 변수를 제어하게 됩니다.

 

 

 

 

 

 

 

300x250

댓글