2017-10-14 6 views
0

SFML 게임 개발 서적. 4는 양방향 (예 : 오른쪽 및 상단)으로 속도를 높이면 움직임이 한 방향보다 빠릅니다.SFML 게임 개발 서적 (Haller 2D 대각선 운동)

연구 결과에 따르면, 관찰 된 행동은 왼쪽 또는 오른쪽 또는 위 또는 아래로 움직이는 것과 같은 기간에 대각선 거리에 도달한다는 것을 이해합니다. 대각선 거리가 길어질수록 이것은 잘못된 것입니다.

책 2의 SQRT로 분할함으로써이 문제를 해결 :

추가 리서치
sf::Vector2f velocity = mPlayerAircraft->getVelocity(); 

// If moving diagonally, reduce velocity (to have always same velocity) 
if (velocity.x != 0.f && velocity.y != 0.f) 
    mPlayerAircraft->setVelocity(velocity/std::sqrt(2.f)); 

는, I는 솔루션 속도의 법선 벡터에 의해 속도를 곱함으로써 달성 될 수 있음을 발견 하였다.

velocity = mPlayerAircraft->getVelocity(); 

if (velocity.x != 0.f && velocity.y != 0.f) { 
    float velocityxsq = velocity.x * velocity.x; 
    float velocityysq = velocity.y * velocity.y; 
    float magnitude = std::sqrt(velocityxsq + velocityysq); 
    sf::Vector2f normalizedVector = velocity/magnitude; 
    velocity.x = velocity.x * std::abs(normalizedVector.x); 
    velocity.y = velocity.y * std::abs(normalizedVector.y); 
    mPlayerAircraft->setVelocity(velocity); 
} 

두 가지 구현에서 동작이 올바르지 만 정규화 값은 항상 1/sqrt (2)가 아닙니다. 계산이 동일 할 때만 게임이 시작되고 처음에는 대각선 운동을합니다. 어떤 방향으로 움직여서 대각선 운동을하면 값이 달라집니다.

정규화가 잘못 되었습니까? 책에서 sqrt (2)를 정적으로 사용하는 이유는 무엇입니까?

답변

0

실제로 책을 소유하고있는 동안 읽을 시간이 없었기 때문에 다음은 논리적 가정입니다.

이 책에서는 속도 벡터의 방향 구성 요소가 항상 -1, 0 또는 1 인 것으로 가정합니다.

실제로 올바른 해결책은 벡터의 길이 (또는 크기)를 사용하여 두 구성 요소를 나누어 벡터를 표준화하는 것입니다.

책의 경우에는 건너 뛰었으므로 간단히하기 위해 기본적으로 컴파일 시간 상수 인 sqrt(2.f)을 사용하여 전체 계산을 제거 할 수 있습니다.

+0

굉장합니다, 감사합니다! –