Programming/GMS

GMS, 드로우 이벤트를 심화해서 배워보자

wnsrn3436 2013.10.19 11:33

 

이번 강좌에서는 흔히 쓰면서도 개념을 알 듯 모를 듯한 게임메이커의 드로우 이벤트에 대해서 알아보겠습니다.

어찌 보면 가장 기초적인 개념이면서도 가장 심화적인 부분이 바로 이 드로우 이벤트입니다.

 

 

1. 인스턴스가 사라져요

 

 

드로우 이벤트를 사용하게 되면 인스턴스가 사라지게(?) 됩니다.

이렇게 되는 이유는 드로우 이벤트를 사용하기 전에는 게임메이커에서 자체적으로 인스턴스의 스프라이트를 그리지만,

드로우 이벤트를 사용하게 되면 게임메이커에서 인스턴스의 스프라이트를 그리지 않기 때문입니다.

 

 

사라짐 문제의 해결 방법은 draw_self() 함수를 사용하는 것입니다.

이 함수는 draw_sprite_ext(sprite_index, image_index, x, y, image_xscale, image_yscale, image_angle, image_blend, image_alpha) 와 동일한 기능을 수행합니다.

 

 

2. 최상위에 존재하는 인스턴스를 만들고 싶어요

 

 

드로우 이벤트는 인스턴스가 생성된 역순서대로, 즉 역순차적으로 처리됩니다.

그러므로 최초에 생성된 인스턴스는 무조건 맨 위에 존재할 수밖에는 없습니다.

어떻게 특정한 인스턴스를 맨 위에 존재하게 할 수 있을까요?

 

 

해결 방법은 Depth를 보다 낮게 변경하는 것입니다. (음수를 넣을 수 있습니다.)

Depth가 작으면 작을수록 드로우 이벤트는 Depth가 큰 인스턴스보다 늦어집니다.

결과적으로 Depth가 작은 인스턴스는 맨 위에 존재하게 됩니다.

 

 

3. 글자나 이미지가 화면에 고정되게 하고 싶어요

 

 

게임을 만들다 보면 특정 수치 혹은 이미지를 화면에 고정시켜야 할 때가 있습니다.

하지만 뷰를 사용하다 보면 화면에 고정한 수치가 뷰를 따라오지 않는 현상을 볼 수도 있지요.

 

 

해결 방법은 뷰의 위치를 x 좌표와 y 좌표에 더하는 것입니다.

하지만 이 방법은 인스턴스의 Depth에 의존하기 때문에 화면을 한 템포 늦게 쫓아올 수도 있습니다.

일반적으로 Depth의 수치를 조절하면 되겠지만,

 

 

Draw GUI 이벤트를 사용해도 무방합니다.

이 이벤트는 모든 인스턴스의 드로우 이벤트가 끝난 뒤에 시작되며, 좌표를 화면상의 좌표로 인식하기 때문에 뷰에 대한 영향이 없습니다.

그래서 그냥 draw_text(10, 10, "HP: "+string(hp)) 를 박아주셔도 무방해집니다.

 

 

4. 드로우 처리가 두 번 되네요?

 

 

혹시 뷰를 두 개 사용하시지는 않으신가요? 드로우 이벤트는 뷰의 숫자에 따라 n번 그려집니다.

어떤 특정한 뷰에만 그리고 싶다면 view_current 라는 시스템 변수를 사용하여 현재 몇 번째 뷰를 그리고 있는지 체크해주세요.

 

if(view_current==0){draw_text(32, 32, "Player 1")}

else{draw_text(32, 32, "Player 2")}

 

이런 식으로 사용하시면 됩니다.

 

 

5. 드로우 관련 함수들은 무조건 드로우 이벤트에서만 처리되나요?

 

 

대답은 NO 입니다.

드로우 함수들은 어떠한 이벤트에서도 처리되기는 합니다.

다만 인스턴스들의 이벤트(드로우 이벤트가 아닌)가 끝나면 백그라운드가 그려지기 때문에 보이지 않을 뿐이죠.

 

증명을 하기 위해 Draw background color 버튼의 체크를 해제해봅시다.

이 옵션은 매 스탭마다 해당 색상으로 룸을 칠하는 것입니다. (룸이 새로 색칠되기 때문에 그전에 그려진 드로우 찌꺼기들은 제거되는 것입니다.)

 

 

그리고 난 뒤 Create 이벤트에서 draw_clear 를 해봅시다.

룸에 특정한 색이 그려진 것을 보실 수가 있을 것입니다.

 

http://cafe.naver.com/playgm

Tag
0 Comments