不知道参数 1 从 sf::Vector2i 到 const sf::Vector2i<float>& 的转换

No know conversion for argument 1 from sf::Vector2i to const sf::Vector2i<float>&

我正在尝试使用 SFML 库制作简单的按钮。当我将鼠标放在按钮上时,该按钮应该会更改其文本颜色。

void Button::updateColor(sf::Vector2i MousePos)
{
    if(sprite.getGlobalBounds().contains(MousePos)) //here is the problem
        text.setColor(color_covered);
    else
        text.setColor(color_uncovered);
}

.contains() 函数需要

const vector2<T>&

准确的错误是:

no known conversion for argument 1 from 'sf::Vector2i {aka sf::Vector2<int>}' to 'const sf::Vector2<float>&'

我尝试过改变

void Button::updateColor(sf::Vector2i MousePos)

void Button::updateColor(const sf::Vector2i& MousePos)

这消除了常量问题,但我仍然不知道如何处理无效引用。我不知道如何正确传递鼠标位置。

感谢您的帮助。

错误消息很明确:您正在尝试传递 Vector2<int> 而不是预期的 Vector2<float>

因为 float != int,这是行不通的。修改您的输入变量。

假设变量 sprite 是一个 sf::Sprite object, the getGlobalBounds 函数 returns 一个 FloatRecttypedefsf::Rect<float>这就是 为什么 contains 函数需要一个浮点向量。

所以要解决您的问题,您需要一个浮点向量。

您可以编写一个函数将任何类型的 Vector2 转换为另一种类型(例如:Vector2f 转换为 Vector2i,或 Vector2u 转换为 Vector2f等)。

template <typename TO, typename FROM>
sf::Vector2<TO> toVector2(const sf::Vector2<FROM> &other)
{
    return sf::Vector2<TO>(
        static_cast<TO>(other.x),
        static_cast<TO>(other.y));
}

然后,您可以按如下方式重写代码:

void Button::updateColor(sf::Vector2i MousePos)
{
    if(sprite.getGlobalBounds().contains(toVector2<float>(MousePos))) // no more error
        text.setColor(color_covered);
    else
        text.setColor(color_uncovered);
}