2016-08-03 103 views
0

在我的按钮类,我有这个功能,它检查鼠标按钮的范围内:SFML按钮无效

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"; 
     } 
    } 

但由于某种原因,没有任何反应。而且我知道这可以起作用,因为我在其他游戏中拥有相同的代码并且工作正常。

+0

为什么你不使用每个case的'break'语句? –

+2

您应该可以获取鼠标相对于窗口的位置,而不是桌面。 'sf :: Mouse :: getPosition(window);' –

+0

并使用'mapPixelToCoords':http://www.sfml-dev.org/tutorials/2.3/graphics-view.php#coordinates-conversions – Hiura

回答

0

稍微偏离主题,你对此有何评论

而且我知道,这可以工作,因为我有我的其他游戏 一个完全相同的代码,它工作正常。

触发我想你可能要考虑在IsInside概括这一点,并做出类似

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) ; 
} 

注类型不准确,实际上可能是相同的(Vector2i)。

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