본문 바로가기

게임개발/Defold

[Defold 튜토리얼] 4-3. War Battles

 

로켓 오브젝트 만들기

유저가 키를 누를때마다 로켓이 발사되도록 하려면, 많은 수의 로켓 오브젝트를 생성할 수 있어야 한다.

이를위해 로켓에 대한 블루프린트(blueprint) 오브젝트를 만들고,

팩토리(factory) 컴포넌트를 만들어서 게임중 바로바로 생성하도록 한다.

 

(1) "sprites.atlas" 를 열어서 새 애니메이션 그룹을 추가(Add Animation Group)하고 이름을 "rocket"이라고 한다. 

(2) "turret-rocket" 이미지들을 추가하고, rocket 애니메이션의 Fps를 20으로 설정한다.

 

 

 

 

(3) main 폴더에 우클릭, New -> Game Object 로 오브젝트를 생성하고, 이름을 "rocket"이라고 한다.

(이 오브젝트가 로켓의 블루프린트(blueprint)가 된다.

 

 

 

 

(4) "rocket.go" 파일을 열어서 Sprite 컴포넌트를 추가한다.

 

 

 

 

(5) Properties 뷰에서 Image로 "sprites.atlas"를 설정하고, Default Animation으로 "rocket"을 설정한다.

 

 

 

 

로켓 생성

 

(1) "main.collection"을 열어서 "player" 오브젝트를 우클릭, AddComponent -> Factory 를 추가한다.

 

 

 

 

(2) "rocket_factory" 라고 이름을 바꾸고, Prototype에 "rocket.go"를 설정한다.

 

 

 

 

(3) "input/game.input_binding" 파일을 열고, Key Triggers에 "Space - fire" 를 추가한다.

 

 

 

(4) "main/player.script" 파일을 열고 스크립트를 추가한다.

 

 

 

 

  1. 플레이어의 발사(fire)키 입력을 체크하기위한 fire 변수를 선언한다.
  2. update()에서 fire 입력이 있었다면 "rocket_factory"에서 오브젝트를 생성한다.
  3. fire 입력에 대한 처리를 마쳤으므로, firing 변수를 false로 설정한다.
  4. fire 키가 입력되었고, 버튼을 누르고 있다면 firing 변수를 true로 설정한다.

 

로켓의 방향 설정하기

 

게임을 실행해보면 Space 키를 누를때마다 플레이어 위치에 로켓은 생성되지만

아직 로켓의 방향 설정이나 이동이 구현되지 않은 것을 확인할 수 있다.

우리가 우선적으로 해야할 일은 로켓 생성시에 로켓의 방향을 설정하는 것이다.

 

 

 

(1) "player.script"를 열어서 코드를 추가한다.

 

 

 

  1. atan2() 아크탄젠트 함수로 플레이어의 각도(라디안)를 구한다.
  2. Z 축에 대한 회전값(quaternion)을 구한다.
  3. 추후 로켓 이동시 플레이어의 방향값(vector3)과 이동속도가 필요하므로 테이블을 만들어 저장한다.
  4. 로켓을 생성하면서 position, rotation, property 값을 넘겨준다. (position값에 nil을 입력하면 기본값으로 현재 오브젝트의 위치에 생성된다. property에는 방향값과 이동속도를 저장한 테이블을 넘겨준다.)

 

(2) "main" 폴더를 우클릭, New -> Script를 클릭하여 "rocket" 스크립트를 추가하고, 스크립트를 작성한다.

 

 

 

  1. "dir", "speed" 프라퍼티를 생성하고, 초기화한다. 이 프라퍼티는 factory.create() 로 전달되는 값에 의해 초기화될 수 있다. "player.script" 스크립트에서 로켓 생성시 플레이어의 방향값(vector3)과 이동속도를 전달하므로 "dir" 프라퍼티는 플레이어의 방향값으로 초기화되고, "speed" 프라퍼티는 전달된 속도값으로 초기화된다.
  2. 로켓의 이동을 구현한다.

 

(3) rocket.go 파일을 열어서 게임오브젝트에 rocket.script 를 추가한다.

 

 

 

 

(4) 게임을 실행해보면 로켓이 거꾸로 날라간다.

 

 

 

 

(5) "sprites.atlas" 파일을 열어서 rocket 애니메이션 그룹을 선택하고, Flip Horizontal 을 체크한다.

 

 

 

 

(6) 다시 게임을 실행해보면 잘 된다.

 

 

 

 

폭발 이펙트 만들기

로켓은 발사되고 잠시후에 폭발해야한다.

 

(1) "sprites.atlas" 를 열어서 Animation Group을 추가하고 이름을 "explosion" 으로 변경한다.

(2) "fx/explision/1~9.png" 이미지들을 추가하고, Fps를 16으로 설정한다.

(3) "explosion" 애니메이션은 한번만 플레이되어야 하므로, Playback을 "Once Forward"로 설정한다.

 

 

 

 

(4) "rocket.script" 파일을 열어서 코드를 추가한다.

 

 

 

 

  1. init() 함수를 추가하고, (로켓이 1초 후에 폭발해야 하므로) lifetime 을 1로 초기화한다.
  2. update()에서 lifetime 을 경과된 시간만큼 감소시킨다.
  3. lifetime 이 0보다 작아지면 로켓의 이동속도를 0으로 만들어 정지시킨다.
  4. 현재 로켓 오브젝트는 플레이어의 방향만큼 회전되어 있으므로, 회전값을 초기화하여 (vmath.quat()는 0 회전값이다) 폭발 이미지가 회전된 상태로 애니메이션 되지 않도록 한다.
  5. "spite" 컴포넌트에 "play_animation" 메시지를 보내서 "explision" 애니메이션이 플레이되도록 한다.
  6. 애니메이션이 종료될때 "animation_done" 메시지를 받게 된다.
  7. 애니메이션이 종료되면 현재 오브젝트를 삭제한다.

 

(5) 게임을 실행하여 로켓 발사 1초후에 폭발 이펙트가 플레이되는지 확인한다.

 

 

 

 

끝.