SFML按钮不工作

SFML Button Not Working

本文关键字:工作 按钮 SFML      更新时间:2023-10-16

在我的按钮类下,我有一个检查鼠标是否在按钮范围内的函数:

bool Button::isMouseOver(int mousePosX, int mousePosY) {
    if (button.getPosition().x < mousePosX &&
        button.getPosition().x + button.getSize().x > mousePosX &&
        button.getPosition().y < mousePosY &&
        button.getPosition().y + button.getSize().y > mousePosY) {
        return true;
    }
    return false;
}

然后在我的主cpp文件下,我有一个用于激活函数的逻辑:

int mousePosX = sf::Mouse::getPosition().x;
int mousePosY = sf::Mouse::getPosition().y;
switch (Event.type) {
    case sf::Event::Closed:
        window.close();
    case sf::Event::MouseButtonPressed:
        if (btnPlay.isMouseOver(mousePosX, mousePosY)) {
            std::cout << "Truen";
        }
    }

但由于某种原因,什么也没发生。我知道这是可行的,因为我在其他游戏中也有同样的代码,而且效果很好。

稍微偏离主题,您评论

我知道这是可行的,因为我在我的另一个游戏,它工作得很好。

引发了我的思考,你可能想考虑将其泛化,并制作类似的东西

bool IsInside(windowPos wp, windowSize ws, someOtherPos sop) {
    if (wp.x < sop.X &&
        wp.x + ws.x > sop.X &&
        wp.y < sop.Y &&
        wp.y + ws.y > sop.Y) {
        return true;
    }
    return false;
}
bool Button::isMouseOver(Vector2i mousePos) {
    return IsInside(getPosition(), getSize(), mousePos) ;
}

IsInside中的音符类型并不精确,实际上可能是相同的(Vector2i)。

这也使正确性测试变得更容易,并消除了复制代码的错误源。