Haller 2D对角线运动的SFML游戏开发书

时间:2017-10-14 15:41:26

标签: c++ game-physics sfml

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)?

1 个答案:

答案 0 :(得分:0)

虽然我实际拥有这本书,但我没有时间阅读它,所以以下只是一个逻辑假设。

本书简单地假设速度矢量的方向分量总是-1,0或1.这就是它。

你确实是正确的,正确的解决方案是通过使用向量的长度(或幅度)划分两个组件来规范化向量。

如果本书被跳过,为简化起见,可以通过基本上使用编译时常量sqrt(2.f)来删除整个计算。