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

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

本文关键字:Vector2i sf gt 转换 float lt 参数 不知道 const      更新时间:2023-10-16

我正在尝试使用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>&'

I have try to change

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

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

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

错误信息很清楚:您试图传递Vector2<int>而不是预期的Vector2<float>

由于float != int,这是行不通的。修改输入变量

假设变量spritesf::Sprite对象,则getGlobalBounds函数返回的FloatRectsf::Rect<float>typedef这就是为什么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);
}