检测上次绘制的形状

Detect Last Drawn Shape

本文关键字:绘制 检测      更新时间:2023-10-16

我正在使用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 Pressn";
        }
        if (m_Shape.getGlobalBounds().contains(sf::Vector2f(sf::Mouse::getPosition(m_Game->m_Window))))
        {
            std::cout << "In Boundsn";
            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 Shapen";
            m_Shape.setPosition(sf::Vector2f(sf::Mouse::getPosition(m_Game->m_Window)));
        }
        break;
    }
    default: break;
    }
}
问题是,如果两个形状

重叠,并且您单击形状相交的位置,则可以移动两个形状。

我只想移动顶部的形状,但经过一番思考和研究,我无法弄清楚如何移动。

所以我做了一些类似于你说的@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;
    }
}