2014-07-23 5 views
0

저는 현재 중력의 형태를 얻으려고합니다. (정확히는 중력이 필요없고 사실감이 필요하지 않습니다.) 제 platformer 게임에 들어가기를 원하지만, 저는 이것에 대해 논쟁을하고 있습니다.C++/SDL Gravity in Platformer

다음 코드는 위쪽 화살표 또는 W를 누르면, (점프) 내 Player::Update() 기능에

if (grounded_) 
{ 
    velocity_.y -= JUMP_POWER; 
    grounded_ = false; 
} 

내가

velocity_.y += GRAVITY; 

이 더 그 기능에있어하지만 그건이 내가 사용하는 것입니다 상황과 무관하다. 다음과 같이

현재 두 상수는 다음과 같습니다 GRAVITY = 9.8f;JUMP_POWER = 150.0f;

내 스프라이트 사이의 적절한 균형이 자신의 점프를 할 수있는, 그리고 너무 것을 찾을 수없는 내 중력 데 주요 문제 뜨는.

필자의 의문점은 내 스프라이트의 점프뿐 아니라 한 플랫폼에서 다른 플랫폼으로 떨어지는 규칙적인 점프가 너무 뜬다는 점이다.

답변

2

실제 값으로 생각하는 대신 그 결과에 대해 생각해보십시오.

그래서 초기 속도는 -jump_power이고 가속 중력입니다. 작은 미적분은 주어진다.

y = -Height = -jump_power * t + 1/2 * gravity * t^2 

이것은 작은 시간 간격을 가정한다. 그런 다음

time_in_flight = 2 * time_to_vertex = jump_power/gravity 

와 정점은

height(time_to_vertex) = jump_power^2/(4 * gravity) 

jump_power = (4 * height/time) * timestep_in_secs_per_update 

gravity = (2 * jump_power/time) * timestep_in_secs_per_update 

, 당신이 혼란을 할 수있는 방법을 네거티브 필름이 해결하고, 시간 단계 및 고정을위한 조정이다 더 적은 직접적인 매개 변수 대신 시간과 높이. 중력에 방정식을 사용하고 처음에는 점프력을 사용하십시오.

const int time = 1.5; //seconds 
const int height = 100 //pixels 

const int jump_power = (4 * height/time) * timestep_in_secs_per_update; 
const int gravity = (2 * jump_power/time) * timestep_in_secs_per_update; 

이 기법은 '무 차원'변수로 미분 방정식 집합을 재 배열하는 데 사용되는 수학 기법입니다. 방정식 특성을 조작하려고하면 변수가 간섭하지 않습니다. 이 경우 전원을 변경하는 동안 시간을 ​​설정하고 일정하게 유지할 수 있습니다. 스프라이트는 여전히 같은 시간에 착륙합니다.

물론 '실제'중력이 최선의 해결책이 아닐 수도 있습니다. 중력을 낮게 설정하고 접지되지 않은 상태에서 캐릭터의 높이를 낮출 수 있습니다.

+0

위의 답변과 매우 유사하지만 여전히 매우 부유합니다. –

+0

@AndrewB 이것은 정말로 자신의 솔루션을 재배치 한 것입니다. 이렇게 잘 보일 수 없다면, 어떤 '포물선'궤적으로도 잘 보이게 할 수 없습니다. 개인적으로 (구문 오류를 수정 한 후), 나는 낮고 빠른 점프에 대한 결과를 얻었고, 수평 성분을 추가했을 때 더 좋게 보였다. – user3125280

0

단위 시스템을 올바르게 생각해야합니다.

  1. 단위는 초당 미터 제곱입니다. (m/(s * s))
  2. 속도 단위는 초당 미터입니다. (m/s)
  3. 힘의 단위는 뉴턴입니다. (N = kg의 *의 m/(S의 *를 S))

개념 예 : 그것은 움직임의 기본 뉴턴 방정식 오일러의 방법에 기초

float gravity = -9.8; // m/(s*s) 
float delta_time = 33.333333e-3f; // s 
float mass = 10.0f; // Kg 
float force = grounded_ ? 150.0f : gravity; // kg*m/(s*s) 
float acceleration = force/mass; // m/(s*s) 
float velocity += acceleration * delta_time; // m/s 
float position += velocity * delta; // m 

.

+0

내가이 일을 하던지 상관없이, 그것은 이전과 같이 여전히 부유하게 끝난다. –