sfml - 等到按键不再按下

时间:2017-02-12 13:38:08

标签: c++ sfml keypress

当我按一个键时,我试图增加var, 但是有一个问题。 当我握住那把钥匙时,它继续前进,增加我的号码(直到我释放钥匙当然)。 我想要只为每次按下添加一个,即使我拿着它也是如此。

这是我的代码:

#include <SFML/Graphics.hpp>
#include <string>
#include <unistd.h>
#include <iostream>

using namespace std;
int main()
{
    sf::RenderWindow window(sf::VideoMode(800, 600), "-\\\\-(Game)-//-");
    sf::Style::Resize;

    int Selected = 1; 
    std::string s = std::to_string(Selected);

    window.setSize(sf::Vector2u(800, 600));
    sf::Font font;
    font.loadFromFile("DIMITRI_.TTF");

    sf::Event event;
    sf::Text Bplay("Play", font);
    Bplay.setCharacterSize(60);
    Bplay.setStyle(sf::Text::Underlined);
    Bplay.setPosition(50, 300);


    sf::Text Boption("Settings", font);
    Boption.setCharacterSize(60);
    Boption.setPosition(50, 400);

    sf::Text Ttitle1(s, font);
    Ttitle1.setCharacterSize(150);
    Ttitle1.setPosition(250, 50);
    sf::Text Ttitle2("Vault", font);
    Ttitle2.setCharacterSize(160);
    Ttitle2.setPosition(250, 200);

    while (window.isOpen())
    {

        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
            {
                    Selected++;
                    std::string s = std::to_string(Selected);
                    Ttitle1.setString(s);

            }
        while (window.pollEvent(event))
        {   
            if (event.type == sf::Event::Closed)
                window.close();


        }

        window.clear(sf::Color::Black);
        window.draw(Bplay);
        window.draw(Boption);
        window.draw(Ttitle1);
        window.draw(Ttitle2);
        window.display();
    }

    return 0;
}

感谢所有帮助。

1 个答案:

答案 0 :(得分:0)

如果用户按下或释放键,则创建一个变量

bool onKeyHold = false; 

所以算法是:

  • 检测他是否按了一个键。
  • 如果是的话,检查onKeyHold是否为假(如果他拿着钥匙,你不想增加)
  • 如果是,请增加Selected,然后将onKeyHold设为真

  • 检测他是否释放了一把钥匙。如果是,请将onKeyHold设为false。

如果你把它们放在代码中,它将是:

bool onKeyHold = false; //create a variable that will hold if user press or release a key

while (window.pollEvent(event))
{   
    if ( event.type == sf::Event::KeyPressed ) check if user pressed a key
    { //if so
       if ( !onKeyHold ) // check if onKeyHold is false
       { //if so
           Selected++; // increment
       }
       onKeyHold = true; // make onKeyHold true
    }
    else if ( event.type == sf::Event::KeyReleased ) // check if user released a key
    { // if so
       onKeyHold = false; // make onKeyHold false
    } 
}

修改:

不要忘记检查密钥是否为sf::Keyboard::Up,否则这将适用于SFML中的每个密钥。

逻辑是:

只有当用户按下您想要的键时,您才会增加。 如果用户按下你检查onKeyHold是否为假(用户没有按任何键)的键,如果这是假的,这意味着你只是按了一个键,而你没有拿着它,因为如果你拿着一把钥匙它将触发一个关键的新闻事件。因此,如果您没有检查onKeyHold是否为假,那么每次触发按键时都会增加Selected