SFML - Рендеринг символа при нажатии клавиши?

Итак, у меня есть эта программа, которая должна имитировать консоль (с небольшой помощью кодирования от teh internets is made of catz):

#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::vector из sf::Keyboard::Keyи используйте цикл while, чтобы проверить, что это за ключ (проходя через std::vector<sf::Keyboard::Key>) без использования целой связки if заявления, но я точно не знаю, как с этим справиться, поэтому я хотел бы знать, есть ли более простой способ для достижения моей главной цели. Предложения? Комментарии?

Спасибо за ваше время, ~ Майк

1 ответ

SFML имеет хорошую функцию для этого, sf::Event::TextEntered ( учебник). Как правило, это то, что вы хотите, и вам не нужно делать сумасшедшие вещи, чтобы интерпретировать текст, введенный пользователем. Заполните свой текст, введенный путем добавления каждого символа в sf::String (скорее, чем std::string, он может лучше работать с юникодными типами sfml ~ не уверен, но для этого потребуется небольшая проверка), что тогда является идеальным типом для sf::Text::setString!

Не стесняйтесь просматривать документы, у них есть дополнительная документация на странице каждого класса.

Пример:

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);
        }
    }
}
Другие вопросы по тегам