[GMS2]몬스터 사체 토막 연출 시스템 만들기

몬스터 사체 토막 연출

 

몬스터를 조각내자
몬스터를 조각내자

 

게임을 제작하다 보면 아무리 파티클을 쓰거나 애니메이션을 주거나 다양한 시도를 해도 만족스럽지

않은 연출이 되는 경우가 많습니다. 스프라이트 애니메이션으로 하자면 너무나 많은 프레임이

필요한 경우도 생기고 비효율적이기 때문에 최소한의 리소스와 최소한의 코드로 계속해서 양산할 수 있는

시스템 개발이 필요하고 덩어리를 조각내고 각각의 조각들을 연출로 쓰는 시스템을 아무리 찾아봐도

없기에 부족하지만 제가 만든 방식을 공유할까 합니다. 이 설명은 게임메이커 스튜디오2를 기준으로 작성되었으나

알고리즘이나 형태 혹은 방식은 다른 엔진에서도 충분히 활용 가능하다고 생각합니다.

 

몬스터의 덩어리를 먼저 나누자

 

조각을 나눈 스프라이트가 필요
조각을 나눈 스프라이트가 필요

 

스프라이트에서 애니메이션 프레임을 활용하여 여러 조각으로 나눕니다. 이름은 상관없지만

저의 경우에는 spr_zombie_chunk 라고 지었으며 프레임의 수는 다양성을 위한 것이니 반드시 위의 그림처럼

9조각으로 나누지 않아도 상관 없습니다. 이제 앞으로 많은 몬스터의 조각들을 재활용 해야 하기에

부모 오브젝트를 만듭니다. (chunk는 그냥 덩어리라는 영어)

 

몬스터 분리연출 시스템을 만들자

 

[obj_monster_chunk – 생성 코드]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//create code
image_speed = 0;
image_index = irandom(image_number  1);
// 사방으로 튀어 오를 초기 무작위 속도와 방향
var _dir = random_range(45135); // 주로 위쪽 대각선 방향으로 솟구치게 설정
var _spd = random_range(510);
hsp = lengthdir_x(_spd, _dir);
vsp = lengthdir_y(_spd, _dir);
grav = 0.3// 중력
bounce_count = 2// 바닥에 총 몇 번 팅길 것인가?
// 회전 효과: 날아가면서 대굴대굴 구르게 만듦
rot_speed = random_range(1515);
cs

 

부모 오브젝트가 될 오브젝트를 생성 후 생성 이벤트에 선언을 해줍니다.

속도와 방향, 중력, 튕김, 회전같은 것들을 만들고 원한다면 다른 연출들도 선언을 합니다.

 

[obj_monster_chunk – 스텝 코드]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// 중력 적용 및 회전
vsp += grav;
image_angle += rot_speed;
// ── X축 충돌 및 벽 밀어내기 ──
if (place_meeting(x + hsp, y, obj_solid)) {
    while (!place_meeting(x + sign(hsp), y, obj_solid)) x += sign(hsp);
    hsp = hsp * 0.5// 벽에 부딪히면 반대 방향으로 살짝 팅김
    rot_speed *= 0.5;
}
x += hsp;
// ── Y축 충돌 (바닥 팅기기 및 최종 정착) ──
if (place_meeting(xy + vsp, obj_solid)) {
    while (!place_meeting(xy + sign(vsp), obj_solid)) y += sign(vsp);
    if (bounce_count > 0) {
        // 팅김 횟수가 남았다면 통통 튐
        vsp = vsp * 0.4// 팅길 때 힘이 반으로 줄어듦
        hsp *= 0.6;       // 바닥 마찰로 가로 속도도 줄어듦
        bounce_count;
    } else {
        // 🔥 [최종 정착] 더 이상 튕기지 않으면 물리 연산 정지
        vsp = 0;
        hsp = 0;
        grav = 0;
        rot_speed = 0;
        // Bloody Trapland 스타일 완성: 바닥에 안착하는 순간 서피스 도화지에 구워버리기!
        if (surface_exists(global.blood_surface)) {
            surface_set_target(global.blood_surface);
            draw_sprite_ext(sprite_index, image_index, xy, image_xscale, image_yscale, image_angle, image_blend, image_alpha);
            surface_reset_target();
        }
        // 서피스에 박제했으니 오브젝트 본체는 즉시 소멸(렉 방지)
        instance_destroy();
        exit;
    }
}
y += vsp;
cs

 

이제 자동으로 실행되는 스텝 코드에 위와 같은 코드를 작성해주고 각각의 해당하는 변수의 계산으로

연출을 시켜주는 것으로 끝이납니다.

 

이제 자식 오브젝트로 재활용하기

 

자식 오브젝트에서 스프라이트를 설정
자식 오브젝트에서 스프라이트를 설정

 

이제 몬스터가 실제로 사망시 불러낼 연출용 오브젝트를 만들고 이 오브젝트에서 아까 제작했던

조각난 스프라이트를 설정해줍니다. 그 다음은 이미지 부분은 상속을 받고 재설정 해야 하기에,

// Inherit the parent event
event_inherited();

// 부모의 물리 설정을 다 받아온 뒤, 나만의 스프라이트 속성을 지정합니다.
sprite_index = spr_zombie_chunk; // 준비하신 좀비견 전용 사체 스프라이트
image_speed = 0;
image_index = irandom(image_number – 1); // 내 스프라이트 프레임 중 랜덤 선택

생성 이벤트에 마우스 오른쪽 클릭을 하면 상속이 있고 event_inherited()라는 함수가 자동 생성됩니다.

이후 위의 코드로 스프라이트 설정만 바꾸면 재활용 하게 되는 연출이 완성됩니다.

 

당연히 사망시에 instance_create_layer(x,y, “Instances”, obj_zombiedog_chunk) //각자 만든 사망용 자식 오브젝트를

불러오기만 하면 완성!

 

이야기를 마치며

 

우선 현업에 있거나 경력이 많은 프로그래머들이 본다면 왜 그걸 오브젝트로 하고 앉아있음? 스크립트로 더 편리하게 짜서 코드 한줄만

쓰면 되는데?라던지 그런 의견도 좋고 더 최적화 할 수 있는 것이 있다면 비난하지 말고 좋은 아이디어를

공유해주셨으면 합니다. 당연히 이 코드도 어려운 코드가 아니지만 초보자 분들에게는 이 정도 수준도 어렵게 느껴질 수 있고

저도 많은 시행착오 끝에 제작한 것이기에 완벽하지 않다는 것을 알고 있습니다.

그 외에도 각자 프로젝트의 상황이나 구조를 제가 다 알지 못하기에 에러가 나거나 오류가 생기는 부분까지

모두 케어해드리거나 설명하여 버그를 잡는데 함께 시간을 소모해드릴 수 없는 점은 양해 부탁드립니다.

📢 텔레그램 새 글 알림 👉 https://t.me/acequest
후원하기

댓글 남기기