2017-02-12 51 views
0

Я пытаюсь сделать увеличение var, когда я нажимаю клавишу, , но есть одна проблема. Как я держу этот ключ, он продолжает двигаться, увеличивая число (пока я не отпущу ключ, конечно). Я не хочу добавлять его только для каждого нажатия, даже когда я его удерживаю.sfml - дождитесь, пока ключ больше не будет нажат

Вот мой код:

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

Вся помощь ценится.

+0

* edit Я пробовал использовать циклы и циклы –

ответ

0

Сделать переменную, которая будет выполняться, если пользователь нажимает кнопку или отпустить клавишу

bool onKeyHold = false; 

Так алгоритм будет:

  • Detect, если он нажал клавишу.
  • если да, то проверьте, если onKeyHold ложно (вы не хотите, чтобы увеличить, если ГЭС держит ключ)
  • если да, то приращение Selected затем сделать onKeyHold верно

  • Detect, если он выпустил ключ. если да, сделайте onKeyHold ложным.

, если вы поместите их в коде, это было бы:

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

Edit:

не забудьте проверить, если ключ sf::Keyboard::Up или иначе это будет работать на каждый ключ доступный в SFML.

логика:

вы увеличиваете только если пользователь нажал клавишу, которая является то, что вы хотите. , если пользователь нажал клавишу, которую вы проверили, если onKeyHold является ложным (пользователь не держит клавишу), если это ложь, это означает, что вы просто нажали клавишу, и вы ее не удерживаете, потому что если вы держите клавишу, она срабатывает ключевое событие для прессы. поэтому, если вы не проверяли, является ли onKeyHold ложным, это будет увеличивать Selected каждый раз, когда вы вызываете нажатие клавиши.