2013-06-22 2 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::TextEntered (tutorial). Это обычно то, что вы хотите, и это позволяет вам делать сумасшедшие вещи, чтобы интерпретировать текст, введенный пользователем. Сохраните свой текст, добавив каждый символ в sf::String (а не std::string, он может работать лучше с типами unicode 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

Так что я прилагаю набранный 'НФ :: Text' до конца буфера? Если это правильно, как именно я должен получить конец 'sf :: String', когда' sf :: String :: end' возвращает начало строки? Посмотрите на это и посмотрите: 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'. –

Смежные вопросы