【问题标题】:Handle mouse events SFML处理鼠标事件 SFML
【发布时间】:2017-05-03 02:36:01
【问题描述】:

我在处理 SFML 中的事件时遇到了一些问题。我正在制作一个回合制游戏,当鼠标移动或单击鼠标左键时,我检查是谁在转弯,然后在该对象位置产生一个射弹,当射弹与地形或对手相撞时,它会被摧毁并转弯被改变。

这种行为不是我所期望的。当点击射击时,弹丸有时根本不会产生(它会立即改变转弯)。我已经禁用了所有碰撞,所以不能这样。我 90% 确定问题出在我如何处理事件上,所以我真的很感谢关于如何让它变得更好的意见。

我学到的是,你不应该执行 while poll 事件中的函数,它只是为了记录最近发生的事情,所以我把它们放在外面。但这并不能解决我的问题...

    sf::Event event;
    sf::Vector2i mousePos;
    while (_window.pollEvent(event)) {
        if (event.type == sf::Event::Closed) {
            _window.close();
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)) {
            _window.close();
        }
        if(event.type == sf::Event::MouseMoved) { // <- this is how you check to see if an event
            mousePos = sf::Mouse::getPosition();
            moved = true;
        }
        if(event.type == sf::Event::MouseButtonPressed) { // <- this is how you check to see if an event
            mousePressed = true;
        }
    }

    if (mousePressed && tank1Turn)
    {
        sf::Vector2f spawnPos = _t1->getPos() + sf::Vector2f(0, -150);
        sf::Vector2f initVel = _t1->getInitVel();
        cout << endl;
        _p = new Projectile(spawnPos, initVel);
        tank1Turn = false;
        tank1Firing = true;
        mousePressed = false;
    }
    if (mousePressed && tank2Turn) {
        sf::Vector2f spawnPos = _t2->getPos()+sf::Vector2f(0,-150);
        sf::Vector2f initVel = _t2->getInitVel();
        _p = new Projectile(spawnPos, initVel);
        tank2Turn = false;
        tank2Firing = true;
        mousePressed = false;
    }
    if (tank1Turn && moved) {
        _t1->aim(mousePos);
        moved = false;
        mousePressed = false;
    }
    if (tank2Turn && moved) {
        _t2->aim(mousePos);
         moved = false;
        mousePressed = false;
    }
}

【问题讨论】:

    标签: c++ events sfml


    【解决方案1】:

    将此视为评论。这不是一个答案(我没有足够的声誉来发表评论,所以我必须把它作为一个答案)但这里有一些我注意到的事情:

    • 您应该将事件循环中的 ifs 替换为 if-elses,或者使用开关

    • sf::Keyboard::isKeyPressed 用于实时输入(将其放入游戏更新循环中)。在您的事件循环中,它应该是 sf::Event::KeyPressed 并检查它与 evt.key.code 是哪个键

    • 您没有检查按下的是哪个鼠标按钮。使用evt.mouseButton.button(鼠标左键为sf::Mouse::Button::Left

    • 我学到的是,你不应该在 while poll 事件中执行函数,它只是为了记录最近发生的事情,所以我把它们放在外面。

    你在哪里读到的?我不认为这是真的

    • 事件循环下面不应该只有ifs 的数组。代码结构应该更好

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-15
      • 1970-01-01
      • 2023-01-22
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      • 1970-01-01
      相关资源
      最近更新 更多