#Chapter.13 - 프레임과 델타타임을 활용한 움직임
델타타임(Delta Time): 이전프레임 시작시간과 현재프레임 시작시간의 차이.
프레임(Frame): Update() 함수에 의해 연속적으로 호출되는 정지된 하나의 화면.
FPS(Frame Per Second): 1 초당 보여주는 정지된 화면의 장 수. (흔히 30 FPS, 60 FPS 등등)
만일 각각의 클라이언트에서 프레임이 다르게 나타난다면?
각각의 컴퓨터마다 서로 다른 위치값을 갖게 된다. 따라서 게임을 프레이 하는동안 오류가 발생하게 됨.
이것을 해결하기 위해 델타타임(Delta Time)을 활용한다.
오류 예시 | 각각의 클라이언트 | 함수 처리 | 5s 동안 이동 결과 값 |
컴퓨터 A ( FPS = 30 ) | 1 프레임 당 +10 이동 | 30×10×5 = 1500 | |
컴퓨터 B ( FPS = 60 ) | 60×10×5 = 3000 |
위 표에서 이동 결과값이 1500과 3000으로 엄청난 차이을 보임.
해결책 | 각각의 클라이언트 | 함수처리 | 델타타임 (Delta Time) | 5s 동안 이동 결과값 |
컴퓨터 A ( FPS = 30 ) | 1 프레임 당 +10 이동 | 1/30 = 0.0333 | 30×10×0.0333×5 = 50 | |
컴퓨터 B ( FPS = 60 ) | 1/60 = 0.0166 | 60×10×0.0166×5 = 50 |
따라서 델타타임(Delta Time)을 이용해서 문제를 해결하면 이동결과 값이 같게 나온다.
[ 델타타임(Delta Time): 1프레임을 처리하는데 걸리는 시간. ]
< 사용된 Key Word >
「 const MAX_SPEED = 100 」 - 속력의 최댓값을 상수로 고정시킴.
#현재 노드의 타입을 상속받음.
extends KinematicBody2D
#속도변수 velocity 를 기본값으로 초기화시킴.
var velocity = Vector2.ZERO
#속력의 최댓값을 상수 100으로 고정시킴.
const MAX_SPEED = 100
#상하좌우 움직일 시, 속도 3으로 움직임. 키입력 없을 시 정지상태.
func _physics_process(delta):
#새로운 속도변수 초기화.
var input_vector = Vector2.ZERO
#새로운 속도는 (오른쪽에서 왼쪽의 값을뺀 정도 / 아래에서 위를 뺀 정도) 이다.
input_vector.x = Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left")
input_vector.y = Input.get_action_strength("ui_down") - Input.get_action_strength("ui_up")
#새로운 속도가 0이 아닐때 "기존속도 = 새로운속도" / 새로운 속도가 0일때 "기존속도 = 0".
if input_vector != Vector2.ZERO:
velocity = input_vector
else:
velocity = Vector2.ZERO
#이동처리함수. 해당 파라미터의 입력값 만큼 이동시킴. 이때, 델타타임(Delta Time)과 최대 속력을 곱해준다.
move_and_collide(velocity * delta * MAX_SPEED)