2017-12-07 3 views
0

저는 LibGDX 게임을 만들고있어 카메라를 확대/축소해야합니다. 그러나 내가 camera.zoom = 1.2f;을 할 때, 그 값으로 '점프'합니다. 대신, 나는 부드러운 줌을 원합니다.LibGDX를 부드럽게 확대하는 방법은 무엇입니까?

내 질문 : 원활하게 확대/축소하는 가장 좋은 방법은 무엇입니까?

아래의 그래프처럼 확대하고 싶습니다. y=0은 시작 cam.zoom이고 y=100은 원하는 cam.zoom이고 x 축은 시간을 표시합니다.

cam.zoom = f(time);을 사용해야합니까? (f(x)에 약간의 수정으로)

time 줌의 시작부터 전달 된 총 시간입니다.

또는 더 나은 사용하는 것입니다

cam.zoom += (desiredZoom - cam.zoom) * delta * scalar; 

delta 두 개의 프레임과
scalar 사이의 시간입니다 속도를 설정하기 위해 조정됩니다 부동이다.

다른 방법이 있습니까? 어떻게 생각해?

고맙습니다.

+2

https://github.com/libgdx/libgdx/wiki/Interpolation – QBrute

+0

두 번째 접근 방식을 사용하면 camera.zoom이 원하는 Zoom에 도달하지 않으며 무한히 가까워집니다. @QBrute가 제안한 것처럼 첫 번째 접근법과 보간법을 사용하십시오. – Arctic45

답변

0

내가 알고있는 가장 간단한 방법은 보간 된 카운트 다운을 사용하는 것입니다.

// member variables: 
float timeToCameraZoomTarget, cameraZoomTarget, cameraZoomOrigin, cameraZoomDuration; 

private float zoomTo (float newZoom, float duration){ 
    cameraZoomOrigin = camera.zoom; 
    cameraZoomTarget = newZoom; 
    timeToCameraZoomTarget = cameraZoomDuration = duration; 
} 

// in render(): 
if (timeToCameraZoomTarget >= 0){ 
    timeToCameraZoomTarget -= deltaTime; 
    float progress = timeToCameraZoomTarget < 0 ? 1 : 1f - timeToCameraZoomTarget/cameraZoomDuration; 
    camera.zoom = Interpolation.pow3out.apply(cameraZoomOrigin, cameraZoomTarget, progress);   
} 

당신은 기능 pictured here의와 Interpolation.pow3out을 대체 할 수 있습니다.

0

MathUtils를 사용할 수 있습니다. lerp 방법.

예 :

MathUtils.lerp(currentZoom,targetZoom,progress); 

속도에게 값의 변경을 천천히 빠른 이하 변경할 진행 값을 늘립니다.

관련 문제