2011-12-12 5 views
1

나는 아주 좋은 것처럼 보이는 HTML5 3D fps와 유사한 엔진을 개발하고 있습니다. 그러나 이것은 3D를 만들기위한 최악의 언어 선택 중 하나 일 수 있으므로 때로 눈에 띄는 지연이 있습니다.게임 프로그래밍 : 움직임 지연 (점프) 제거

WASD가 렌더링 속도와 무관하게 프로그램 된 경우가 있으므로 때로는 상당히 엉망이지만 다른 시간은 허용되는 30+ fps (물론 CPU에 따라 다름)로 작업하고 있습니다.

내 마음을 감쌀 수없는 유일한 점프는 점프입니다. 현재 점프는 낙하 변수 (중력은 항상 음수이고 충돌 감지로 수정 됨)에 양수 상수를 추가 한 다음 상수를 뺍니다. 이것은 새로운 프레임이 렌더링 될 때마다 호출됩니다. fps가 낮아지면 나는 달에있는 것처럼 느낍니다. 나는 slow-mo effect에 jerkiness를 선호한다.

이동 (현재 프레임과 마지막 프레임 사이의 시간 계산)과 같은 방법을 사용하면 공제 된 변수가 너무 커지고 때때로 점프 꼭지점이 변경됩니다 (높은 fps에 비해 값의 절반까지). 점프 높이가 항상 같아야하므로 용납 될 수 없습니다.

// when clicked on spacebar: 
if(spacebar) 
{ 
    // this defines jumping apex 
    jump = 0.5 
} 

// constant added to y (vertical position) later in the code 
cy += jump; 

// terminal velocity = -2 
if(jump > -2) 
{ 
    // gravity (apex multiple to get maximum height) 
    jump -= 0.05; 
} 

if(collision_with_floor) 
{ 
    // stop falling 
    cy = 0; 

    if(jump < 0) 
    { 
     jump = 0; 
    } 
} 

player.position.y += cy; 

지금 시간에 따라 점프와 (위의 코드에서 대체) :

// terminal velocity = -2 
if(jump > -2) 
{ 
    // gravity, 0.4 is an arbitrary constant 
    jump -= (now - last_frame)*0.4; 
    last_frame = now; 
} 

여기

는 (하나의 렌더링 루틴 동안 호출) 문제를 이해하는 데 도움이되는 몇 가지 의사 코드입니다 여기에 무슨 일이 벌어지고 있는지에 대한 이미지가 있습니다.

enter image description here

파란색 점은 프레임 렌더링을 나타냅니다.

저는 이것이 점핑 루틴을 프로그래밍하는 올바른 방법인지 잘 모르겠습니다. 기본적으로 예리함과 일정한 점프 높이가 부드러움과 슬로우 모션 효과보다 낫습니다.

답변

0

프레임 업데이트가 너무 느려 정확한 물리를 얻지 못하면 점프 꼭지점을 해킹하여 플레이어가 항상 히트 할 수 있습니다. 여기에서 큐는 y 속도가 플러스에서 마이너스로 바뀔 때가 될 것입니다.

그래프의 측면에서
old_cy = cy; 
cy += jump; 
if(old_cy > 0 && cy <= 0) 
    player.position.y = jump_apex_height; 

, 아이디어는 당신이 다음, 주황색 선에 도달하는 파란색 점을 식별에 바로 돌입 할 것입니다 : 나는 당신의 의사를 잘 읽고 있어요 경우, 다음과 같이 보인다 점선.

그리고 지금은 그것에 대해 생각하고 플레이어 정말 점프의 정점 마다에 도달하는 경우, 다음이도 고속 업데이트를 도움이 될 것이다.

+0

플레이어가 꼭지점에 도달했을 때 주황색 선을 점선으로 범프하면 두 번째 작은 점프와 같이 매우 번쩍 거림이되는 것은 이상적이지 않습니다. 낮은 fps에서는 눈에 띄지 않지만 높은 경우에는 매우 짜증납니다. – Solenoid

+0

이상한 FPS가 더 나쁘다는 것이 이상합니다. 이상적인 꼭지점과 실제 꼭지점 사이의 거리가 낮은 FPS보다 작을 것이라고 생각했을 것입니다. 어쩌면 갑작스러운 충돌 대신 플레이어가 점선에 미치지 못하면 현재 'cy'를 긍정적으로 유지하여 플레이어가 도달 할 때까지 위쪽으로 계속 움직일 수 있습니다. –

+1

또한 재미있는 질문이지만, http://gamedev.stackexchange.com/에서 그 이상의 관심을 끌 수 있습니다. –