如何比较sfml中的头寸?

时间:2019-12-15 11:06:33

标签: c++ sfml

我是sfml的新手,正在制作一个简单的游戏。我需要比较2个位置,但找不到方法。 我该怎么做?我虽然可以这样来做: if (somesprite.getPosition() < (some x,some y)) { some code} 所以我只需要找出如何比较两个位置即可。

提前感谢您提供的答案,这些答案将使我更容易找到正确的方法。
                                                                         -托斯梅尔

1 个答案:

答案 0 :(得分:0)

getPosition()返回一个sf::Vector2<T>,其中有用于减法的重载。 将一个sf::Vector2<T>减去另一个sf::Vector2<T>的长度就是位置之间的距离。

#include <SFML/System/Vector2.hpp>
#include <cmath>

template<typename T>
T Vector2length(const sf::Vector2<T>& v) {
    return std::sqrt(v.x * v.x + v.y * v.y);
}

void some_func() {
    auto spos = somesprite.getPosition();
    decltype(spos) xy(some_x, some_y);
    auto distance_vec = spos - xy;

    if( Vector2length(distance_vec) < max_distance ) {
        // do stuff
    }
}

由于sf::Vector2<T>缺少length()以及通常与笛卡尔向量关联的其他常用函数,因此上述方法的替代方法是继承sf::Vector2<T>并对其进行扩展:

#include <SFML/System/Vector2.hpp>
#include <cmath>

// extending sf::Vector2<T> with functions that could be nice to have
template<typename T>
struct Vector2_ext : sf::Vector2<T> {
    using sf::Vector2<T>::Vector2;
    // converting from a sf::Vector2
    Vector2_ext(const sf::Vector2<T>& o) : sf::Vector2<T>(o) {}

    // converting back to a sf::Vector2
    operator sf::Vector2<T>&() { return *this; }
    operator sf::Vector2<T> const&() const { return *this; }

    // your utility functions
    T length() const { return std::sqrt(this->x * this->x + this->y * this->y); }
};

// deduction guide
template<typename T>
Vector2_ext(T, T)->Vector2_ext<T>;

有了它,您可以在需要时在sf::Vector2<T>Vector2_ext<T>之间来回转换。

int some_func(sf::Sprite& somesprite, float some_x, float some_y, float max_distance) {
    auto distance =
        // somesprite.getPosition() - sf::Vector2(some_x, some_y) returns a sf::Vector2<T>
        // that we convert to a temporary Vector2_ext<T> and call its length() function:
        Vector2_ext(somesprite.getPosition() - sf::Vector2(some_x, some_y)).length();

    if(distance < max_distance) {
        // do stuff
    }
}