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)를 정적으로 사용하는 이유는 무엇입니까?
굉장합니다, 감사합니다! –