2017-02-08 74 views
0

我使用SFML在C++中創建遊戲,但遇到了使用鼠標移動形狀的問題。檢測最後繪製的形狀

我繪製了多個形狀,每個形狀都有自己的句柄輸入方法,當我處理窗口事件時,我遍歷矢量數組並調用每個形狀的句柄輸入方法。

void Plank::HandleInput(sf::Event event) 
{ 
    switch (event.type) 
    { 
    case sf::Event::MouseButtonPressed: 
    { 
     if (event.mouseButton.button == sf::Mouse::Button::Left) 
     { 
      m_MouseHold = true; 
      std::cout << "Left Press\n"; 
     } 

     if (m_Shape.getGlobalBounds().contains(sf::Vector2f(sf::Mouse::getPosition(m_Game->m_Window)))) 
     { 
      std::cout << "In Bounds\n"; 
      m_MoveShape = true; 
     } 
     break; 
    } 

    case sf::Event::MouseButtonReleased: 
    { 
     m_MouseHold = false; 
     m_MoveShape = false; 
     break; 
    } 

    case sf::Event::MouseMoved: 
    { 
     if (m_MoveShape) 
     { 
      std::cout << "Move Shape\n"; 
      m_Shape.setPosition(sf::Vector2f(sf::Mouse::getPosition(m_Game->m_Window))); 
     } 
     break; 
    } 

    default: break; 
    } 
} 

問題是,如果兩個形狀重疊,並且您點擊形狀相交的位置,則可以移動這兩個形狀。

我想只能移動頂部的形狀,但我無法弄清楚如何經過一些思考和研究。

+0

我不知道要通過SFML獲取此信息,因此您必須自行跟蹤它。如果你已經定義了一個繪製形狀的標準順序,那麼相反,它會告訴你最近繪製的是什麼。例如,如果您存儲一個形狀矢量,並通過遍歷該矢量進行繪製,則可以反向迭代以確定要抓取的形狀。 – 0x5453

回答

0

所以我做了類似的事情說給你@ 0x5453

什麼在我的窗前,調查事件中,我環繞在我的形狀陣列和存儲其中第一載我的鼠標在其全球範圍的形狀的排列位置。然後從那裏開始,我只是移動了我注意到的陣列位置的形狀。

for (size_t i = m_PlankObjects.size(); i-- > 0;) 
{ 
    if (m_PlankObjects[i].m_Shape.getGlobalBounds().contains(sf::Vector2f(sf::Mouse::getPosition(m_Game->m_Window)))) 
    { 
     selectedObject = i; 
     break; 
    } 
}