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

C++ 当按下鼠标时,如何在数组中赋值SFML C++;,c++,sfml,C++,Sfml,我正在尝试制作一个程序,允许您在形状选项之间进行选择,然后绘制它。为了允许多个形状,我创建了一个类的向量来创建形状(使用所选函数设置形状)。我的问题是鼠标点击太长,所以它会将其分配给向量中的所有对象,因此无法创建新形状。我的逻辑有问题吗,还是代码有问题 以下是我的尝试: for (auto& it : onCanvas) { if (Mouse::isButtonPressed(Mouse::Left)) { if (mousepointer.ge

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

以下是我的尝试:

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

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

在您使用的第一个解决方案中,因此您只能在鼠标按钮的状态更改时添加形状(您还可以收听
MouseButtonReleased
以模拟完全单击):

或者,第二个解决方案是记住按钮的最后一个状态(可能在for循环外执行鼠标检查一次):


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

第二个解决方案有效!我不知道为什么第一个没有,但这很好,因为我所做的是相当小的。我还在学习,所以我只是在做一些初学者的项目。。
if (event.type == sf::Event::MouseButtonPressed)
{
    if (event.mouseButton.button == sf::Mouse::Left)
    {
        // Hit Detection
    }
}
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;