看代码发现一个BUG,记录一下,并告知作者 :) 为Torque做点贡献
目前的版本,对于IME的支持显然没有进行过测试,是直接搬代码过来的,这也能理解,人家都不用这玩意,各种开源的好东西多了去了,而国内要想用,大家都知道,第一件事不是考虑如何Hello World,而是是不是支持中文输出/输入,悲剧啊!
Torque2D MIT作为成熟引擎 Torque2D和iTorque2D的结合,IME相关代码在发布的时候就支持,但是看情况是没有进行过测试的.
具体情况如下:
// IME输入处理函数
static void processCharMessage( WPARAM wParam, LPARAM lParam )
{
....
InputEvent event;
event.deviceInst = 0;
event.deviceType = KeyboardDeviceType;
event.objType = SI_KEY;
event.action = SI_MAKE;
event.ascii = charCode;
// Deal with some silly cases like <BS>. This might be indicative of a
// missing MapVirtualKey step, not quite sure how to deal with this.
if(event.ascii == 0x8)
event.objInst = KEY_BACKSPACE; // Note we abuse objInst.
Game->postEvent(event);
....
}
....
// 文本输入框键处理
bool GuiTextEditCtrl::onKeyDown(const GuiEvent &event)
{
.....
else if (event.modifier & SI_CTRL)
{
.....; 所有的IME事件必将到这里
}
.....
if ( mFont->isValidChar( event.ascii ) )
{
....; 这里才是IME的判断,但是永远到不了这里
}
}
因为初始化的问题,我们看看EventInput结构体的构造函数:
InputEvent() { type = InputEventType; size = sizeof(InputEvent); dMemset(touchesX, 0, sizeof(touchesX));
dMemset(touchesY, 0, sizeof(touchesY));
dMemset(touchIDs, 0, sizeof(touchIDs));}
从代码里看出,它只初始化了部分变量,非常注重触摸,而对于:
U16 objType; ///< One of SI_XAXIS, SI_BUTTON, SI_KEY ...
U16 ascii; ///< ASCII character code if this is a keyboard event.
U16 objInst; ///< Which type instance or a KeyCode
U8 action; ///< What was the action? (MAKE/BREAK/MOVE)
U8 modifier; ///< Modifier to action: SI_LSHIFT, SI_LCTRL, etc.
并没有初始化,这就导致这些变量在结构体实例化后,全是未初始化的废料!比如modifer这个重要的判定变量可能是0xCC,但绝不会是我们要的0.
如果在发送消息的时候增加一行代码:event.modifier = 0,那么就会输入汉字了,但是还是有问题,哎,不继续了,改代码不好,特别是Torque2D这种直接生成Exe的这种.. 反馈问题,等待处理吧!
后续问题有: IME顺序反的,"文本"会显示"本文",而且wenben 也会显示... 郁闷的天朝..
留个记号,等Bug修复后再来..