处理鼠标事件SFML

时间:2016-12-17 13:13:24

标签: c++ events sfml

我在SFML中遇到一些问题。我正在制作一个基于转弯的游戏,当鼠标移动或点击鼠标左键时我检查它是否转动然后在该物体位置产生一个射弹,当射弹与地形或对手相撞时它会被摧毁并转弯改变了。

这种行为不是我所期待的。当点击射击时,弹丸有时根本不会产生(并且它会立即改变转弯)。我已经禁用了所有碰撞,所以它不能这样。我90%肯定问题在于我如何处理事件,所以id真的很好地投入了如何让它变得更好。

我学到的是你不应该在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;
    }
}

1 个答案:

答案 0 :(得分:1)

请考虑此评论。这不是一个答案(我没有足够的声誉来评论,所以我必须回答这个问题)但是这里有一些我注意到的事情:

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

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

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

  • 执行此操作
  •   

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

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

  • 事件循环下面不应该只有if个数组。代码应该更好地构建