如何让 SDL 了解在 大写锁定打开和大写锁定关闭 下敲击字母、shift + 'a' = 'A' 或 shift + '1' = '!' 之间的区别...等等?
SDL 不再支持
SDL_EnableUNICODE()
。以下是如何使用 SDL2 获取文本输入 - 来自 wiki:
#include "SDL.h"
extern char *text;
int main(int argc, char *argv[])
{
SDL_bool done = SDL_FALSE;
SDL_StartTextInput();
while (!done) {
SDL_Event event;
if (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_TEXTINPUT:
/* Add new text onto the end of our text */
strcat(text, event.text.text);
break;
}
}
}
SDL_StopTextInput();
return 0;
}
首先添加这个命令:
SDL_EnableUNICODE(SDL_ENABLE);
这基本上允许 SDL 识别大写和小写之间的区别,甚至是按住 Shift 和字符之间的区别(例如 shift + 'a' = 'A' 或 shift + '1' = '!')。 之后,假设您知道如何提取常规密钥 (
event.key.keysym.sym
),只需使用 event.key.keysym.unicode
即可。
#include <string>
#include <iostream>
using namespace std;
string stringinput()
{
string input;
SDL_EnableUNICODE( SDL_ENABLE );
SDL_Event uin;
while(!(uin.type==SDL_KEYDOWN&&uin.key.keysym.sym==SDLK_RETURN))
{
while(SDL_PollEvent(&uin))
{
if(uin.type==SDL_KEYDOWN)
{
if((uin.key.keysym.unicode>='A'&&uin.key.keysym.unicode<='Z')
||(uin.key.keysym.unicode>='a'&&uin.key.keysym.unicode<='z')
||(uin.key.keysym.unicode>='0'&&uin.key.keysym.sym<='9')
||(uin.key.keysym.unicode==SDLK_SPACE))
{
input+=((char)uin.key.keysym.unicode);
}
else
{
switch((unsigned int)uin.key.keysym.unicode)
{
case SDLK_BACKSPACE:
input.erase(input.size()-1);
break;
}
}
}
}
}
SDL_EnableUNICODE( SDL_DISABLE );
return input;
}
int main()
{
string mystring=stringinput();
cout<<mystring;
while(1);
return 0;
}