2013-06-22 77 views
0

所以我有這個計劃,應該模仿控制檯(從this user一點編碼幫助):SFML - 當按下鍵時渲染一個字符?

#include <SFML/Graphics.hpp> 
#include <SFML/System.hpp> 
#include <SFML/Window.hpp> 

sf::Color fontColor; 
sf::Font mainFont; 
sf::Clock myClock; 

bool showCursor = true; 

void LoadFont() { 
    mainFont.loadFromFile("dos.ttf"); 
    fontColor.r = 0; 
    fontColor.g = 203; 
    fontColor.b = 0; 
} 

int main() { 
    sf::RenderWindow wnd(sf::VideoMode(1366, 768), "SFML Console"); 
    wnd.setSize(sf::Vector2u(1366, 768)); 

    LoadFont(); 

    sf::Text myTxt; 
    myTxt.setColor(fontColor); 
    myTxt.setString("System Module:"); 
    myTxt.setFont(mainFont); 
    myTxt.setCharacterSize(18); 
    myTxt.setStyle(sf::Text::Regular); 
    myTxt.setPosition(0, 0); 

    while(wnd.isOpen()) { 
     sf::Event myEvent; 

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

      if (myEvent.type == sf::Event::KeyPressed) { 
       if (myEvent.key.code == sf::Keyboard::Escape) { 
        wnd.close(); 
       } 
      } 
     } 

      wnd.clear(); 

      if (myClock.getElapsedTime() >= sf::milliseconds(500)) { 
       myClock.restart(); 
       showCursor = !showCursor; 

       if(showCursor == true) { 
        myTxt.setString("System Module:_"); 
       } else { 
        myTxt.setString("System Module:"); 
       } 
      } 

      wnd.draw(myTxt); 
      wnd.display(); 
    } 
} 

我需要能夠讓用戶在鍵盤上輸入一個密鑰,然後在屏幕上呈現該鍵。我正在考慮使用std::vectorsf::Keyboard::Key,並使用while循環來檢查密鑰是什麼(循環遍歷std::vector<sf::Keyboard::Key>),而不使用大量的if語句,但我並不完全知道如何處理它,所以我想知道是否有更簡單的方法來實現我的主要目標。建議?註釋?

謝謝您的時間, 〜麥克

回答

2

SFML有這一個很好的功能,sf::Event::TextEnteredtutorial)。這通常是你想要的,它可以避免你做出瘋狂的事情來解釋用戶輸入的文本。 股票文本中添加的每個字符爲sf::String進入(而不是std::string,它可能會SFML的統一類型的〜不知道更好地處理,但是這將需要一點點的檢查),這是則sf::Text::setString完美型!

不要猶豫,看docs,它在每類頁面更多的文件。

例子:

sf::String userInput; 
// ... 
while(wnd.pollEvent(event)) 
{ 
    if(event.type == sf::Event::TextEntered) 
    { 
     /* Choose one of the 2 following, and note that the insert method 
      may be more efficient, as it avoids creating a new string by 
      concatenating and then copying into userInput. 
     */ 
     // userInput += event.text.unicode; 
     userInput.insert(userInput.getSize(), event.text.unicode); 
    } 
    else if(event.type == sf::Event::KeyPressed) 
    { 
     if(event.key.code == sf::Keyboard::BackSpace) // delete the last character 
     { 
      userInput.erase(userInput.getSize() - 1); 
     } 
    } 
} 
+0

所以我會鍵入的'SF :: Text'追加到緩衝區的結束?如果這是正確的,當'sf :: String :: end'返回字符串的開始時,我應該如何得到'sf :: String'的結尾?看看這個,看看:http://sfml-dev.org/documentation/2.0/classsf_1_1String.php – hCon

+0

@Mike:是的,你必須追加緩衝區末尾輸入的文本。你可以簡單地使用'+'運算符連接兩個'sf :: String'(因此使用'+ =')。關於'sf :: String :: end'的文檔,它看起來像是作者的錯誤複製和粘貼,我將報告它!顯然它應該將一個迭代器返回到字符串的末尾,但迭代器意味着遍歷數據,而不是修改它。而是使用'sf :: String :: insert'和'sf :: String :: erase'。 –

相關問題