我是sfml的新手,正在制作一个简单的游戏。我需要比较2个位置,但找不到方法。
我该怎么做?我虽然可以这样来做:
if (somesprite.getPosition() < (some x,some y)) { some code}
所以我只需要找出如何比较两个位置即可。
提前感谢您提供的答案,这些答案将使我更容易找到正确的方法。
-托斯梅尔
答案 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
}
}