我使用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 :(得分: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;
}
}