본문 바로가기

게임개발/Defold

[Defold 튜토리얼] 3. Movement

 

 

NEW PROJECT -> From Tutorial 에서 Movement Tutorial 프로젝트를 생성한다.

 

 

 

 

먼저 게임을 실행해보면, 방향키나 마우스를 입력할때마다 콘솔(Console)창에 로그가 남는것을 확인할 수 있다.

 

 

 

 

현재 프로젝트의 부트스트랩 컬렉션인 main.collection을 열어보면,

background 오브젝트와 spaceship 오브젝트가 배치되어 있다.

어디서 로그를 남기는지 확인하기 위해 spaceship에 세팅된 spaceship.script를 연다.

 

 

 

 

spaceship 스크립트를 보면 on_input() 안에 키입력에 따라 print()로 로그를 남기고 있다.

 

 

 

 

이제 방향키로 우준선을 이동시키기 위해 기존 print() 코드들은 지우고,

spaceship 오브젝트의 좌표를 5만큼씩 이동시킨다.

마지막에 이동한 좌표값을 확인하기위해 print()로 로그를 남긴다.

 

 

 

 

Console 창의 Clear 버튼을 클릭하여 로그를 다 지우고 게임을 빌드하여 테스트해보면

방향키 입력에 따라 우주선의 좌표가 5씩 이동하는 것을 확인할 수 있다.

 

 

 

 

디폴드 엔진은 2D 게임에 맞춰진 툴이긴 하지만, 실제로는 (내부적으로) 3D 엔진이다.

따라서 모든 게임오브젝트들과 컴포넌트들은 Vector3(x, y, z)로 표현되는 3D 공간 상에 위치한다.

즉, X, Y 값은 오브젝트의 가로, 세로 위치를 결정하고, Z 값은 Depth(깊이)를 결정한다.

Z값은 -1에서 1 사이의 값만을 가지는데, 이 Z 값을 사용하여 어떤 오브젝트를 위로 보여지게 할 것인지 조정한다.

 

 

 

 

vector3 객체는 디폴드의 라이브러리인 vmath에서 생성한다.

 

 

이제 코드를 다음과 같이 수정한다.

(이전 튜토리얼에서 다뤘던 코드이므로 구체적인 설명은 하지 않는다.)

 

 

 

 

  • (1) 디폴드 엔진은 매 프레임마다 각 스크립트의 update()를 호출한다. 디폴드 게임은 보통 초당 60프레임으로 돌아가므로, 각 프레임의 길이는 0.016666초 정도이다. 이는 dt(deltaTime)의 값이며, update() 호출 사이의 경과된 시간이다. 게임오브젝트를 매 프레임당 5좌표씩 이동시키고자 할 경우 1초(대략 60프레임)에 5 X 60 = 300만큼의 좌표를 이동하게 된다. 따라서 update()에서 입력 방향에 300을 곱한 것이고, 이는 오브젝트를 초당 300 좌표씩 이동시키겠다는 의미이다. 하지만 이것은 대략적인 값이며, 어떠한 이유에서든 프레임 속도에 변동이 있을 수 있기때문에 매 프레임당 오브젝트의 이동거리는 그때그때 약간씩 달라질 수 있다.

 

지금까지의 코드는 오브젝트의 속도 변화가 없는 등속운동을 구현한 것이다.

등속운동은 그냥 단순하게 이동속도에 이동시간을 곱하여 이동거리를 구한다.

 

 

 

 

반면 가속도운동은 매 프레임마다 속도가 가속 혹은 감속되어 속도의 변화가 있는 운동을 말한다.

가속도운동을 구현하기 위해서는 먼저 가속도에 시간을 곱해 속도변화량을 구하고,

이전 속도에 속도변화량을 더하여 현재 속도를 구한다.

그리고 이전속도에 현재속도를 합친 값에 시간을 곱한 후 1/2를 하여 이동거리를 구한다.

(이렇게 복잡해지는 이유는 프레임과 프레임 사이에 속도가 계속 변하고 있다고 가정하기 때문이다.)

 

 

 

 

가속도를 적용하여 코드를 작성하면 다음과 같다.

 

 

 

 

  • (1) 인스턴스(self)에 이전속도를 저장하기 위한 velocity 변수를 선언하고 초기화한다.
  • (2) 가속도는 키가 입력된 방향으로 설정된 값(500)만큼의 크기를 가지며, 가속도로 현재 속도를 구한 후, 이전속도와 현재속도로 이동거리를 구한다.

 

스크립트를 저장하고 게임을 실행해보면 방향키를 일정방향으로 누르고 있을때

우주선의 속도가 점차 증가되는 것을 확인할 수 있다.

 

끝!