我正在用c ++实现我自己的文本编辑器。它会......好吧。 ; P
我需要一种方法将键码(特别是Allegro,他们称之为扫描码)转换成ASCII-char。我可以轻松地做A-Z,并且将它们转换为a-z也很容易。我目前所做的是使用Allegro中的一个函数,该函数从扫描码(al_keycode_to_name)返回一个名称,这意味着如果按下的键是A-Z,它将“A”返回到“Z”。这很容易,但我不能简单地阅读像“,”,“;”这样的特殊字符。这就是我遇到困难的地方。
有没有办法自动执行此操作?也许是一个这样做的图书馆?真正的诀窍是考虑不同的布局。
这是我到目前为止所有人感兴趣的内容。 InputState类基本上是Allegro输入状态的副本,具有附加功能(例如keyDown,keyUp,keyPress):
void AllegroInput::TextInput(const InputState &inputState, int ¤tCharacter, int ¤tRow, std::string &textString)
{
static int keyTimer = 0;
static const int KEY_TIMER_LIMIT = 15;
for (int i = 0; i < 255; i++)
{
if (inputState.key[i].keyDown)
{
keyTimer++;
}
if (inputState.key[i].keyPress)
{
keyTimer = 0;
}
if ((inputState.key[i].keyPress) || ((inputState.key[i].keyDown) && (keyTimer >= KEY_TIMER_LIMIT)))
{
std::string ASCII = al_keycode_to_name(i);
if ((ASCII.c_str()[0] >= 32) && (ASCII.c_str()[0] <= 126) && (ASCII.length() == 1))
{
textString = textString.substr(0, currentCharacter) + ASCII + textString.substr(currentCharacter, textString.length());
currentCharacter++;
}
else
{
switch(i)
{
case ALLEGRO_KEY_DELETE:
if (currentCharacter >= 0)
{
textString.erase(currentCharacter, 1);
}
break;
case ALLEGRO_KEY_BACKSPACE:
if (currentCharacter > 0)
{
currentCharacter--;
textString.erase(currentCharacter, 1);
}
break;
case ALLEGRO_KEY_RIGHT:
if (currentCharacter < textString.length())
{
currentCharacter++;
}
break;
case ALLEGRO_KEY_LEFT:
if (currentCharacter > 0)
{
currentCharacter--;
}
break;
case ALLEGRO_KEY_SPACE:
if (currentCharacter > 0)
{
textString = textString.substr(0, currentCharacter) + " " + textString.substr(currentCharacter, textString.length());
currentCharacter++;
}
break;
}
}
}
}
}
答案 0 :(得分:1)
您应该使用ALLEGRO_EVENT_KEY_CHAR
值event.keyboard.unichar
的事件来读取文本输入。 ALLEGRO_EVENT_KEY_DOWN
和ALLEGRO_EVENT_KEY_UP
对应于被按下的物理键。它们与可打印字符之间没有1:1的对应关系。
假设使用死锁将两个密钥e'
转换为é
。您将获得e
和'
的两个关键事件(并且两者都不能用于捕获正确的输入),但是有é
的一个关键字符事件。或者相反,也许有人将F4
映射到一个释放整段文本的宏。在这种情况下,你只需要一个键就可以有多个字符。
或者是一个简单的测试:如果你按住一个键五秒钟,你将获得一个ALLEGRO_EVENT_KEY_DOWN
但是多个ALLEGRO_EVENT_KEY_CHAR
,因为操作系统的键盘驱动程序会发送重复事件。
您可以使用ALLEGRO_USTR
轻松存储这些unicode字符串。
ALLEGRO_USTR *input = al_ustr_new("");
// in the event loop
al_ustr_append_chr(input, event.keyboard.unichar);
如果按下退格键等,还有删除字符的方法等。您可以直接通过al_draw_ustr(font, color, x, y, flags, input)
将ustr数据类型与字体插件一起使用,或者您可以使用al_cstr(input)
来读取 - 仅指向UTF-8字符串的指针。