목차

만들 수 있는 방법

튜토리얼에 따르면

  1. 내장파티클을 조합해서 쓰는 방법 : 쉽지만 밋밋한 효과
  2. 파티클 액션을 조합해서 쓰는 방법 : 단계가 많다. 괜찮은듯
  3. 코드를 사용해서 파티클을 만드는 방법 : 좀 더 나이스
  4. 코드와 이미터를 사용해서 파티클을 만들도 터뜨리는 방법 : 더 더 나이스. 이미터를 사용해서 ,
    • 한번에 터뜨리거나
    • 분사형식으로 만들 수 있다.

내장 파티클 : 폭죽 효과

내장 파티클을 사용해서 폭죽 효과를 만듭니다.

  1. 시작 : 초기 움직임 설정과 알람 0번 1번 추가
  2. 알람 0번 이벤트 : 불꽃 꼬리 효과 추가
  3. 알람 1번 이벤트 : 폭죽 효과, 알람 2번 추가
  4. 알람 2번 이벤트 : 모두 삭제.

1 오브젝트와 초기 설정

오브젝트를 만들고 Create Event에 위치와 움직임을 적절히 설정

direction = point_direction( x, y, room_width/2, 100);
speed = 15 + random(5);
gravity = 0.5;
gravity_direction = 270;
// 알람 2개를 설정했다.
alarm[0] = 1;
alarm[1] = room_speed;

2 연기 꼬리 Effect

Alerm[0] 이벤트 추가하고 여기에 액션 추가.

  1. Draw 탭 –> Other 섹션 –> Create Effect 추가.
    • type : smoke
    • x : 0
    • y : 0
    • size : small
    • color : 회색
    • where : below objects
    • relative : on
  2. Alarm[0] = 1 추가

3 불꽃 Effect 만들기

현재 효과를 정지 시키고, 다음 효과 준비를 위해 알람 설정.

Alarm[1] 이벤트를 추가하고 다음 액션을 추가

  1. Draw 탭 –> Other 섹션 –> Create Effect 추가.
    • type : firework
    • x : 0
    • y : 0
    • size : large
    • color : 노란색
    • where : below objects
    • relative : on
  2. Alarm[0] : -1
  3. Alarm[2] : room_speed * 3

4 스스로 삭제

  1. 알람2번 이벤트
    • Instance Destroy 액션 추가 ( main1번 탭의 objects 섹션 )

파티클 액션으로 만들기

억.. 이건 정리하려니 답이 안나오네. 그냥 코딩하는게….

코드로 만들어보기

만드려는 효과 : 불꽃 효과, 내장 파티클보다는 더 화려하게.

만들 이벤트

오브젝트를 만들다. 튜토리얼에서는 obj_Simple_Firework로 지었다.

0. 파티클의 코딩 순서

  1. part_system_create() 함수로 파티클 시스템을 시작한다.
    1. part_type_create() 로 파티클 종류를 설정 준비를 한다. 실제 설정은 다른 함수들을 호출해서 진행한다. 파티클 한개 만드는데 참 많은 속성 설정 함수가 들어간다.
    2. 입자 각각의 모양새 : part_type_shape()
    3. 확대나 축소 범위 : part_type_scale()
    4. 크기 : part_type_size()
    5. 색상의 변화 : part_type_color2()
    6. 투명 상태의 변화 : part_type_alpha2()
    7. 움직이는 속도 : part_type_speed()
    8. 움직이는 방향 : part_type_direction()
    9. 적용되는 중력 : part_type_gravity()
    10. ? : part_type_orientation();
    11. 색상 혼합 : part_type_blend()
    12. 입자의 수명 : part_type_life()
  2. 파티클을 포함한 오브젝의 초기 상태 설정
    1. 움직일 방향
    2. 속도
    3. 적용되는 초기 중력값. ( 보통 상태로 0.5 ? )
    4. 중력이 적용되는 방향. 아마 보통 270 (아래쪽)
  3. 파티클을 만들 이벤트를 추가한다.
    1. 알람 또는 기타 이벤트를 추가해서
    2. part_particles_create()를 사용할 수 있는 이벤트를 준비한다.
  4. 오브젝트 종료시 사용한 파티클 삭제
    1. part_type_destroy() : 파티클 타입 삭제. 한개 이상이면 해당 파티클 타입 변수 모두 삭제.
    2. part_system_destroy() : 파티클 시스템 종료.

햐 복잡하군.

1. Create Event

다음 코드를 추가. 나도 예제를 따라 간거라 상세 기능은 도움말을 봐야할 것 같다.

// 파티클 시스템을 만들고
Sname = part_system_create();
 
// 불꽃 꼬리의 파티클 타입 준비
trail = part_type_create();
// 파티클의 모양을 선택, 스파크랍니다.
part_type_shape( trail, pt_shape_spark );
// 파티클의 확대 비율 상태, 아래는 1:1(원본)
part_type_scale( trail, 1, 1 );
// 파티클의 최소, 최대 크기.
part_type_size( trail, 0.20, 0.50, 0, 0 );
part_type_color2( trail, c_white, c_gray );
part_type_alpha2( trail, 1, 0 );
part_type_speed( trail, 2, 5, -0.20, 0 );
part_type_direction( trail, 0, 359, 0, 0 );
part_type_gravity( trail, 0.5, 270 );
// 파티클의 회전 가능 범위. 이미지(여기에서는 오브젝트의 진행 방향)의 회전 각도와 같아야 하므로 360도 회전 가능하게 설정.
part_type_orientation( trail, 0, 359, 0, 0, 0 );
part_type_blend( trail, 0 );
part_type_life( trail, 8, 30 );
 
stars = part_type_create();
part_type_shape( stars, pt_shape_star );
part_type_size( stars, 0.5, 1, -0.02, 0 );
part_type_scale( stars, 1, 1 );
part_type_color3( stars, c_lime, c_fuchsia, c_blue );
part_type_alpha3( stars, 0, 1, 0 );
part_type_speed( stars, 2, 4, 0, 0 );
part_type_direction( stars, 0, 359, 0, 0 );
part_type_gravity( stars, 0.20, 270 );
part_type_orientation( stars, 0, 359, 0, 0, 0 );
part_type_blend( stars, 1 );
part_type_life( stars, 50, 70 );
 
direction = point_direction( x, y, room_width / 2, 100 );
speed = 15 + random( 5 );
gravity = 0.5;
gravity_direction = 270;
 
alarm[0] = 1;
alarm[1] = room_speed;

2. Alarm0 Event

// 불꽃 꼬리 효과 파티클을 만들고 
part_particles_create( Sname, x, y, trail, 1 );
// 알람 0번을 다시 설정한다.
alarm[0] = 1;

3. Alarm1 Event

// 알람0번을 끄고, 꼬리 파티클도 끈다.
alarm[0] = -1;
// 새로운 파티클을 만든다. 펑! 별모양의 파티클이 펑하고 터진다.
part_particles_create( Sname, x, y, stars, 200 );
// 알람 2번을 설정한다.
alarm[2] = 1;

4. Alarm2 Event

// 한 스텝 간격으로 모든 파티클이 사라졌는지 확인한다.
// 갑자기 슥 모든 불꽃이 사라지면 어색하므로
if part_particles_count(Sname) > 0
{
    alarm[2] = 1;
}
else
{
  // 모든 파티클이 사라졌다.
  // 사용한 파티클을 모두 삭제한다. 삭제하지 않는 파티클은 메모리 누수 원인이 된다고 한다.
  part_type_destroy(trail);
  part_type_destroy(stars);
  part_system_destroy(Sname);
}

코드+방사체(이미터,emitter)로 만들어보기

이미터를 사용해서 특정 위치에서 폭발하거나 분사 되도록 설정한다. 파티클이 퍼져 나가는 방식을 결정한다.

윗부분 섹션과 다른 부분만 추가.

터지는 파티클 효과

  1. 파티클 시스템을 만들고
    Sname = part_system_create();
  2. 파티클 타입을 만들고.
    변수 (인스턴스) 이름이 explode 라고 가정. 설정 코드는 제외하고 패스.
  3. 이미터를 만든다. 함수 파라미터는 파티클 시스템의 변수.
    emitter1 = part_emitter_create( Sname );
  4. 특정 이벤트에서 (원하는 시점에) 이미터를 터트린다
      var posx, posy;
      posx = choose( 194, 305, 520 );
      if posx == 194 
        posy = 264 
      else if posx == 305 
        posy = 235
      else
        posy = 292;
      // 이미터 사용 1번 순서
      part_emitter_region( 
        Sname, 
        emitter1, 
        posx - 64, 
        posx + 64, 
        posy - 32, 
        posy + 32, 
        ps_shape_ellipse, 
        ps_distr_gaussian );
      // 이미터 사용 2번 순서, 펑 터진다.
      part_emitter_burst( Sname, emitter1, explode, 100 );
  5. 삭제시, 파티클 타입 삭제 –> 이미터 삭제 –> 파티클 시스템 삭제의 순서로 삭제한다.

분사 되는 파티클 효과

윗 섹셕과 다른 부분만 추가.

분사 효과를 사용할 때는 part_emitter_burst() 대신 part_emitter_stream() 함수를 사용한다. 분사 효과는 계속 반복된다.

이벤트 발생시 아래 함수로 파티클을 내보낸다.

part_emitter_stream( 
  <파티클 시스템 인스턴스 변수>,
  <이미터 인스턴스 변수>,
  <파티클 타입 인스턴스 변수>,
  <숫자, 내보낼 파티클 입자의 개수> ); // 0이면 멈추고, 0 이상이면 숫자만큼 계속 내보낸다.

파티클 코드 생성기

게임메이커 개발자들이 추가로 만든 유틸리티. 이걸로 파티클을 직접 만들면서 확인해 보고 코드를 추가하는게 낫다. (오 살았다)

튜토리얼 번역