CHML中的SFML游戏开发书。 4给出了指导,当你通过两个方向(例如右和上)增加速度时,移动将比在一个方向上更快。
通过研究,我了解观察到的行为是,您将在同一时间内达到对角线距离,就像您向左或向右或向上或向下移动一样。这是错误的,因为对角线距离更长。
本书通过除以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));
通过另外的研究,我发现可以通过将速度乘以速度的归一化矢量来实现解决方案。
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 :(得分:0)
虽然我实际拥有这本书,但我没有时间阅读它,所以以下只是一个逻辑假设。
本书简单地假设速度矢量的方向分量总是-1,0或1.这就是它。
你确实是正确的,正确的解决方案是通过使用向量的长度(或幅度)划分两个组件来规范化向量。
如果本书被跳过,为简化起见,可以通过基本上使用编译时常量sqrt(2.f)
来删除整个计算。