我正在写一个SFML程序,主窗口是在Window.cpp类中处理的。我还有一个处理不同屏幕的ScreenManager类。在我的newMapScreen类中,我需要从用户那里获取文本输入,以命名他们正在创建的Map。我通过在这个newMapScreen类中传入Window来创建一个事件循环,但是它非常缓慢地记录事件。在程序注册输入的密钥之前,用户必须按住按钮1秒以上。我需要得到实时文本输入,就像做if(sf :: Keyboard :: isKeyPressed(sf :: Keyboard ::: Key))。还有什么方法我可以使用键盘而不检查键盘上的每个键?无论如何,我可以处理来自窗口类的textinput并在我的newMapScreen类中执行它吗?我很难理解对不起的家伙。 我目前得到这样的输入:
void newMapScreen::updateWithWindow(sf::RenderWindow &Window)
{
while(Window.pollEvent(event))
{
switch(event.type)
{
case sf::Event::TextEntered:
if(onEnterMap)
{
if(event.text.unicode >= 32 && event.text.unicode <= 126)
{
mapNameS += (char)event.text.unicode;
}else if(event.text.unicode == 8 && mapNameS.getSize() > 0)
{
mapNameS.erase(mapNameS.getSize() -1, mapNameS.getSize());
}
}
if(onMapSizeX)
{
}
if(onMapSizeY)
{
}
break;
}
}
}
答案 0 :(得分:0)
我把它扔在一起就是一个例子。这可能不是最好的方法,这只是一个例子。
#include <SFML/Graphics.hpp>
#include <string>
#include <iostream>
int main(){
sf::RenderWindow window(sf::VideoMode(500,500), "Text reader!");
std::string s;
while(window.isOpen()){
//Event processing.
sf::Event event;
while (window.pollEvent(event)){
if (event.type == sf::Event::Closed)
window.close();
if (event.type == sf::Event::TextEntered){
if(event.KeyPressed == sf::Keyboard::BackSpace && s.size()!=0){
s.pop_back();
std::cout << s << std::endl;
}
else if (event.text.unicode < 128) {
s.push_back((char)event.text.unicode);
std::cout << s << std::endl;
}
}
}
}
}