2016-08-03 100 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)。

這也使得測試更容易進行正確性,並消除了複製代碼帶來的錯誤來源。