2017-02-12 4 views
0

私はキーを押したときにvarを増やそうとしていますが、 という問題が1つあります。 私はそのキーを保持しているので、私の数を増やしていきます(もちろん、キーを離すまで)。 私はそれを保持していても、すべてのプレスごとに1つだけ追加することはできません。すべてのヘルプは高く評価され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

*編集whileループとforループを試してみました –

答えて

0

場合、ユーザープレスを保持したり、キー

bool onKeyHold = false; 

を解放する変数を作成しますので、アルゴリズムは次のようになります。彼は、キーを押した場合

  • を検出します。
  • もしそうなら、onKeyHoldがfalseの場合はそうだとすれば(あなたはHESは、キーを押した場合にインクリメントしたくない)
  • をチェックし、彼がキーを離した場合onKeyHold

  • が検出作り、その後Selectedをインクリメントします。その場合は、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がfalse(ユーザーがキーを保持していない)である場合にチェックしたキーをユーザーが押した場合、キーが押されたばかりで保持していないことを示すfalseの場合、キープレスイベントだから、onKeyHoldが偽であるかどうかを確認しなかった場合は、キーを押すたびにSelectedが増えます。

関連する問題