我正在尝试制作一个程序,允许您在形状选项之间进行选择,然后进行绘制。为了允许多个形状,我创建了一个创建形状的类的向量(使用所选函数设置了形状)。我的问题是鼠标单击时间过长,因此将其分配给矢量中的所有内容,因此您无法创建新形状。我的逻辑有问题吗,还是代码有问题?
这是我的尝试:
for (auto& it : onCanvas) {
if (Mouse::isButtonPressed(Mouse::Left)) {
if (mousepointer.getGlobalBounds().intersects(circleOption.getGlobalBounds())) {
it.chosen(circles);
}
if (mousepointer.getGlobalBounds().intersects(rectOption.getGlobalBounds())) {
it.chosen(rectangle);
}
if (mousepointer.getGlobalBounds().intersects(triOption.getGlobalBounds())) {
it.chosen(triangles);
}
if (mousepointer.getGlobalBounds().intersects(it.shape.getGlobalBounds()) || it.dragging) {
it.shape.setPosition(mousepointer.getPosition());
it.dragging = true;
}
}
if (!Mouse::isButtonPressed) {
it.dragging = false;
}
win.draw(it.shape);
}
答案 0 :(得分:1)
您的源代码有点不完整(onCanvas
和mousepointer
是什么)。但是我想问题是单击鼠标时此代码段被多次调用。为避免这种情况,您可以做两件事。
在第一个解决方案中,您使用events,因此仅在鼠标按钮的状态更改时才添加形状(您还可以收听MouseButtonReleased
以模拟完整点击):
if (event.type == sf::Event::MouseButtonPressed)
{
if (event.mouseButton.button == sf::Mouse::Left)
{
// Hit Detection
}
}
或第二种解决方案,您还记得按钮的最后状态(可能在for循环外,鼠标一次检查过):
bool mouse_was_up = true;
if (mouse_was_up && Mouse::isButtonPressed(Mouse::Left)) {
mouse_was_up = false;
for (auto& it : onCanvas) {
// Hit Detection
}
}
else if (!Mouse::isButtonPressed(Mouse::Left))
mouse_was_up = true;
我宁愿坚持第一个解决方案,因为当您的点击时间太短并且您的游戏循环位于游戏逻辑的另一部分时,您可能会错过点击。