본문 바로가기

게임개발/Defold

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

플레이어 애니메이션 만들기

1. main 폴더에 우클릭하고 New -> Atlas 를 선택한다.

생성창이 열리면 "sprites" 라고 이름을 주고 아틀라스를 생성한다.

(아틀라스는 이미지들을 모아놓은 컬렉션이다.

디폴드는 게임성능과 메모리의 이유로 낱개의 이미지 대신에 아틀라스를 사용한다.)

 

 

 

 

2. 에디터에 sprites.atlas가 열리면 Outline 뷰에서 Atlas를 우클릭 -> Add Animation Group을 클릭한다.

 

 

 

 

3. 생성된 Animation Group의 이름을 "player-down"으로 변경하고

player-down 오브젝트를 우클릭 -> Add Image를 클릭한다.

 

 

 

 

4. "down"으로 필터하여 /assets/units/infantry/down-d/1~4.png 를 선택하고, OK를 클릭한다.

 

 

 

 

5. player-down 오브젝트를 선택하고, F키를 눌러서 화면을 맞춘다.

Space 키를 누르면 애니메이션이 실행되는데,

Fps가 60이라 속도가 너무 빠르므로 Fps를 8로 변경한다.

 

 

 

6. sprites.atlas를 저장(Ctrl+S)한다.

 

플레이어 게임오브젝트 만들기

디폴드의 게임오브젝트는 id, position, rotation, scale 값을 가지며, 컴포넌트(Component)들을 소유한다.

게임오브젝트는 플레이어 캐릭터나 총알, 게임의 시스템, 게임레벨로더 같은 것들을 생성하기위해 사용된다.

그리고 컴포넌트는 게임오브젝트의 시각적(Visual), 청각적(Audible), 논리적(Logic)인 표현을 제공한다.

 

1. "main.collection"을 열어서 Outline 뷰에서 우클릭, Add Game Object 를 클릭한다.

 

 

 

 

2. 맵 오브젝트의 이름을 "map"이라고 변경하고, 새로 생성한 오브젝트의 이름을 "player"라고 변경한다.

map 오브젝트는 Position의 Z값이 0이므로, player 오브젝트를 map 오브젝트 위로 표시하기 위해서는 0보다 큰 Z값을 가져야 한다. 따라서 player 오브젝트의 Position Z값을 1로 수정한다. (디폴드에서 Position Z값은 -1에서 1사이의 값을 가진다. Z값이 1이면 가장 위에 표시되는 오브젝트가 된다.)

 

3. player 오브젝트를 우클릭, Add Component -> Sprite를 클릭하여 스프라이트 컴포넌트를 생성한다.

 

 

 

 

3. "sprite" 컴포넌트를 클릭, Image를 "/main/sprites.atlas/"로 선택하고, Default Animation로 "player-down"를 선택한다.

 

 

 

 

4. 캐릭터 이미지가 보여지므로 이제 player 오브젝트를 선택하고 캐릭터를 맵에서 원하는 위치에 배치한다. (캐릭터를 드래그하여 이동시키거나 Position 값을 변경한다.)

 

 

 

 

5. 게임을 빌드(Ctrl+B)하여 캐릭터 애니메이션이 잘 되는지 확인한다.

 

 

 

 

입력 바인딩 추가하기

기본적으로 키입력은 등록되어 있지 않기때문에

게임에서 키입력을 받으려면 입력 액션을 등록해야 한다.

 

1. input 폴더에서 "game.input_binding"을 연다. 이 파일은 키보드, 마우스, 터치 등의 입력을 받았을때 어떤 액션이랑 연결시킬 것인지를 설정한다. (액션이라고 해서 뭔가 거창한게 있는것 같지만 그냥 각 입력에 대한 이름을 붙여주는 것 뿐이다.)

 

 

 

 

2. Key Triggers에서 +버튼을 클릭하여 입력값을 추가하고, 각 방향키에 대한 액션의 이름을 설정한다.

 

 

 

 

3. 파일을 저장(Ctrl+S)한다.

 

 

플레이어 스크립트 만들기

1. main 폴더를 우클릭, New -> Script를 클릭하고, 스크립트 생성창이 뜨면

player라고 이름을 설정하고 Create Script 버튼을 클릭하여 스크립트 파일를 생성한다.

 

 

 

 

2. main 폴더에서 "main.collection" 파일을 열어서 player 오브젝트를 우클릭, Add Component File을 클릭한다.

 

 

 

 

3. "main/player.script"를 선택하고 OK 버튼을 클릭한다.

 

 

 

 

4. 이제 "player" 오브젝트는 "player.script" 에 의해 동작하게 된다.

하지만 현재 player 스크립트 파일은 비어있는 상태이므로 게임을 실행해도 아무 동작도 하지 않는다.

 

 

플레이어 이동 스크립트

 

 

 

  1. init() 함수는 스크립트 컴포넌트가 생성될때 호출된다. 이 함수는 게임오브젝트의 초기설정에 유용하다.
  2. 현재 게임 오브젝트(".")에 "acquire_input_focus" 메시지를 보낸다. 이 메시지를 받은 게임오브젝트는 입력 액션을 받게 된다. 입력 액션은 on_input() 함수에서 처리된다.
  3. self 는 현재 컴포넌트 인스턴스에 대한 참조이다. self로 인스턴스의 변수를 선언하고 데이터를 저장할 수 있다. moving 변수는 플레이어가 이동중인지 아닌지를 확인하는 플래그 값으로 쓰여진다.
  4. input 변수는 방향키 입력시 입력 방향값(vector3)을 저장한다.
  5. dir 변수는 플레이어가 바라보는 방향값(vector3)을 저장한다.
  6. speed 는 (픽셀로 표현되는) 초당 이동 속도이다.
  7. final() 은 스크립트 컴포넌트가 게임에서 삭제될때 호출된다. 플레이어 게임오브젝트가 삭제되거나  게임이 종료될때도 호출된다.
  8. input focus를 해제한다. 게임엔진한테 입력을 받지 않겠다고 명시적으로 말하는 것이다. 사실 게임오브젝트가 삭제될때 자동으로 해제되므로 굳이 스크립트를 작성할 필요는 없다.
  9. update() 는 매 프레임마다 한번씩 호출된다. 이 게임은 초당 60프레임씩 돌아가므로, 60분의 1초 간격으로 update() 가 호출된다. dt 매개변수는 지난 프레임부터 현재 프레임 사이의 경과 시간이다.
  10. moving 이 true가 되면, 현재 게임오브젝트의 position 을 dir 방향으로 speed 만큼 이동시킨다.
  11. 입력값에 대한 이동처리가 끝났으므로 moving 을 false로 만들고, input 입력방향값을 초기화한다.
  12. on_input() 함수는 설정된 입력 액션이 활성화될때마다 매 프레임 호출된다. action_id 인수는 input binding file에서 설정한 action 값이고, action 인수는 입력에 대한 세부 정보를 담고있는 Lua table이다.
  13. 방향키가 입력될때마다 selfinput 변수에 방향값(vector3)이 저장된다. 만약 left 방향키와 up 방향키가 입력되면 input 변수는 (-1, 1, 0) 값을 가지게 된다.
  14. 입력값이 있었는지 확인하고, 입력이 있었다면 moving 을 true로 만들어 update()에서 이동 동작하도록 한다. dir 변수는 input 벡터값을 정규화(normalize)하여 크기가 1인 단위벡터로 만든다.

 

스크립트를 저장하고 게임을 실행하면 캐릭터가 방향키 입력에 따라 이동하는것을 확인할 수 있다.

 

끝.