gpt4 book ai didi

c++ - 如何比较 sfml 中的位置?

转载 作者:太空宇宙 更新时间:2023-11-04 12:29:10 25 4
gpt4 key购买 nike

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

提前感谢您的回答,这将使我更接近于找到正确的方法。
- 托斯梅尔

最佳答案

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()和其他通常与笛卡尔 vector 相关的常用函数,上述的替代方法是继承 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
}
}

关于c++ - 如何比较 sfml 中的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59343269/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com