본문 바로가기
GameMaker강좌[GM8]/파티클강좌

[게임메이커강좌-파티클]파티클 제거하기

by 타락카얀 2014. 9. 10.
728x90



GAME MAKER 강좌



KAYAN




파티클은 생성했을 때 수명에 따라 자동으로 제거되지만, 파티클 시스템 및 파티클들은 생성되었을 때

룸을 이동해도 게임 상에 계속 남게 됩니다.

파티클 시스템이 그대로 남아 있다보니 룸을 이동해도 파티클이 계속 생성되는 것이지요.
문제는 파티클 시스템이 중복 생성될 수 있다는 것인데, 이것을 제거하지 않고 룸을 이동하면

게임 상에 계속 남게 되고, id도 변경되어 제거하기가 힘들다는 점입니다.
그래서 룸을 이동하기 이전에 반드시 모든 파티클을 제거하고 룸을 이동해야 합니다.
이번 강좌에서는 파티클을 파기하는 방법에 대해 알아보도록 합시다.







◈ 룸 이동시 파티클 시스템 제거



파티클은 파티클 시스템을 통해 생성되지요.
룸을 이동하기 전에 아래의 파티클 시스템 파기 함수를 사용하면 해당 파티클 시스템을 통해

생성되는 모든 파티클이 제거됩니다.


     part_system_destroy(ind) : 파티클 시스템을 파기.

이 함수를 사용하면 해당 파티클 시스템을 파기할 수 있습니다


예)



     // ps_system 이라는 파티클 시스템을 파기하고자 할 때
     part_system_destroy(ps_system);



간단하지요.
일반적으로 이 이벤트는 Room End 이벤트에서 파티클 제거 이벤트를 작성하면 됩니다.

파티클 시스템을 설정할 때, 전역변수(global 변수)가 아닌 지역 변수(global 을 뺀 변수)에 할당하고,

파티클을 생성하는 이 오브젝트가 게임 상에서 파기 될 수 있는 경우에는 Destroy 이벤트에도

파티클 시스템 파기하는 이벤트를 작성해주어야합니다.

전역 변수인 경우 중복 생성하지 않으면, 다른 오브젝트에서도 파기 가능하지만, 지역 변수인 경우

오브젝트에 한해서만 작동하기 때문에 별도로 이벤트를 추가 작성할 필요가 있습니다.







◈ 파티클을 일시적으로 제거하기



현재 룸에서 파티클을 일시적으로 제거할 수도 있습니다.
물론 파기 함수를 사용해 파티클을 제거할 수도 있지만, 그러면 파티클 시스템 완전히 파기되지요.

Draw 이벤트나 다른 이벤트에서 이 파티클 시스템을 호출 중이라면 오류를 띄울 수도 있을 겁니다.
파티클 시스템은 유지하고, 파티클만 제거하는 방법에 대해 알아봅시다.

먼저 파티클 시스템을 통해 파티클을 모두 클리어하는 방법이 있습니다.

     part_system_clear(ind) : 파티클 시스템를 통해 생성된 모든 파티클을 클리어하고,

                               파티클 시스템에 속한 파티클 이미터를 파기합니다.

이 함수를 사용하면 파티클 시스템을 통해 생성된 모든 파티클들이 한번에 모두 제거됩니다.



(▲ 모든 파티클을 클리어)


뭔가 갑작스럽게 없어지지요.

이것은 파티클 시스템, 파티클 타입의 설정은 유지되고, 나머지 파티클 이미터등의 설정들은

파기하는 것입니다.

파티클의 수명이 남았더라도 이전에 설정한 것은 무시하고, 함수 호출 즉시 룸에 남아 있는 파티클들을

모두 제거합니다.

한꺼번에 모든 파티클을 클리어하고 싶을 때 유용한 함수이지만, 파티클을 다시 생성하고 싶을 때는

파티클 시스템, 파티클 타입을 제외한 파티클 이미터등 생성부터 모든 설정을 다시 해야하는

번거로움이 따르지요.

두번째는 파티클 시스템 및 파티클 설정들은 유지하고, 파티클을 생성하는 파티클 이미터 파기하는

방법이 있습니다.


     part_emitter_destroy(ps,ind) : 파티클 이미터를 파기합니다.
     part_emitter_destroy_all(ps) : 파티클 시스템에 종속된 모든 파티클 이미터를 파기합니다.

파티클 이미터만 파기되어 더 이상 파티클을 생성하지 못할 뿐, 기존에 생성되어 남은 파티클들은

파티클 타입 수명 설정에 따라 유지시켜 자연스럽게 제거 시킬 수 있는 장점이 있습니다.



(▲ 자연스럽게 파티클을 파기할 수 있음)


다시 파티클을 생성하고 싶다면, 아래와 같이 파티클 이미터만 재설정하면 다시 파티클을 생성할 수

있어요.


예)



     //파티클 시스템: part_sys1  파티클 타입: part_type1 일때
     part_emitter=part_emitter_create(part_sys1);//파티클 이미터를 생성

     part_emitter_region(part_sys1,part_emitter,_x-20,_x+20,  _y-20,_y+20,

     ps_shape_rectangle,ps_distr_gaussian);


     part_emitter_stream(part_sys1,part_emitter,part_type1,5);



룸을 이동할 때는 파티클 시스템을 모두 파기하면 되고, 이펙트나 잠시동안 일부만 제거하고자 할 때는
파티클 이미터를 파기하는 것이 좋습니다.
물론 파티클을 개별적으로 파티클 시스템을 가진 여러개의 이펙트 오브젝트가 게임 상에 파기되는

경우라면 Destroy 이벤트, Room End 이벤트등에 파티클 제거 이벤트를 따로 작성해주어야 룸을

이동했을 때 문제가 생기지 않습니다.






300x250

댓글