2017-02-08 4 views
0

Я создаю игру на C++, используя SFML, но у меня возникла проблема с перемещением фигур с помощью мыши.Обнаружение последней рисованной формы

Я рисую несколько фигур, каждая форма имеет свой собственный метод ввода рукописного ввода, и когда я обрабатываю событие окна, я петлю над векторным массивом и вызываю метод ввода дескриптора каждой фигуры.

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; 
    } 
} 
Смежные вопросы