【问题标题】:SFML Button Not WorkingSFML 按钮不起作用
【发布时间】:2016-08-03 04:24:24
【问题描述】:

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

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 << "True\n";
        }
    }

但由于某种原因,什么都没有发生。而且我知道这是可行的,因为我在其他游戏中的代码完全相同,而且运行良好。

【问题讨论】:

  • 您为什么不对每个案例使用break 语句?
  • 你可能应该得到鼠标相对于窗口的位置,而不是桌面。 sf::Mouse::getPosition(window);
  • 并使用mapPixelToCoords:sfml-dev.org/tutorials/2.3/…
  • 要调试它并验证之前评论者的 cmets 是否正确,请在您的 isMouseOver 中添加所有坐标的 std::cout,这样您就可以检查实际发生的情况。

标签: c++ sfml


【解决方案1】:

题外话,你来评论

而且我知道这可以工作,因为我在 我的其他游戏之一,它运行良好。

让我想到你可能想考虑将其概括并制作类似的东西

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)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 2014-10-09
    相关资源
    最近更新 更多