按下鼠标时如何在数组中赋值 SFML C++

How do I assign a value in an array when a mouse is pressed SFML C++

我正在尝试制作一个程序,允许您在形状选项之间 select,然后绘制它。为了允许多个形状,我创建了一个 class 的向量来创建形状(形状是使用所选函数设置的)。我的问题是鼠标点击时间太长,所以它将它分配给矢量中的所有内容,因此您无法创建新形状。是我的逻辑有问题,还是代码有问题?

这是我的尝试:

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);
    }

您的源代码有点不完整(什么是 onCanvasmousepointer)。但我想问题是当你点击鼠标时这个片段被多次调用。为避免这种情况,您可以做两件事。

在第一个解决方案中,您使用 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;

我宁愿坚持第一个解决方案,因为当您的点击时间太短并且您的游戏循环处于游戏逻辑的另一部分时,您可能会错过点击。