pokemonlei

陈磊的博客 | pokemonlei

Scaleform中的IME适配win10

The Scaleform IME solution allows game players to easily switch input languages and type in Asian characters allowing them to chat in a multi-lingual way while playing games.

官方文档地址:http://help.autodesk.com/view/SCLFRM/ENU/?guid=__scaleform_help_ime_html

近期端游中用到了scaleform的IME,但在win7系统上正常的功能在win10上就有问题。

问题1:显示不出候选框列表 candidate list以及reading window,并且对win10自带的输入法不生效

win7上有候选框而win10没有,是因为win7和win10的读取路径不一样,以Cry为例:

如图,win7中,如果在第三个参数传入的是imeXmlFile,则win7上是好用的,而win10不好用,因为win10默认已经在Libs/UI文件夹下了。

而至于微软默认输入法无法适配,是因为在scaleform4.5中,认为windows中默认的微软输入法名字都是英文,而win10则很良心的把输入法名字都改为了中文,这时候就读取不到了,所以组件中的ime.xml里需要添加对中文名字的解析,这里对于win10中的默认输入法我给设置成了Microsoft Pinyin IME 2010一样的配置,如下图:

设置完ime.xml后,还需要更改GFx_IMEIdMap.cpp中的读取支持:

添加如图中的两行解析,这个文件里是不支持中文的,所以都是把中文字符串转换为了16进制,也就是所看到的的 \xE5\xBE 等。

问题2:输入了一些文字后,在 reading window状态下按回退键,会导致 reading window所有的字母都消失掉,但candidate list确是正常的

原因:光标问题

如上面两张图,在Text_EditorKit中响应了KeyAct_Backspace消息后,由于是不选中文字状态,所以beginSel==endSel,这时候会通过Cmd_BackspaceChar走到Text_DocView里,而传进来的参数newPos就是光标所在位置,在Text_DocView里会通过RemoveText(开始位置,结束位置)来删除传进来光标位置的前一个字符,res返回值表示新光标移动的位置。
这时候传入的newPos其实是没有加上reading window中的字符的,所以会导致按一下回退,所有reading window中的字符全部消失并且已经输入好的一个字符也消失掉。

改动方法为我们这里手动更改光标的位置,即:

这里将newPos加上了一个reading window的长度,之后的SetCursorPos(newPos)会将光标设置到一个正确的位置。而SetCursorPos中有做判断不会将设置的位置超过已经输入的文本长度,所以这里也要在给它加上一个reading window的长度。

另外有时候会遇到崩溃问题,这里需要做一个判空:

问题3:candidate list为空白,什么都看不到,但是可以通过数字键来选择不同的候选词

原因:可以通过鼠标来选择,并且显示空白,说明其实是有出现candidate list的,只是颜色设置不对。
这里不知道是使用不正确还是确实有这个问题,反正我这里是遇到了。
大概就是其他地方调用了InitCandidateListDefaults传入了一个styles,但是这个传入的值还不是undefined,是全部颜色都是白色,大概是默认的?
修改如下:这里比较暴力,直接修改为了自己需要的颜色,有需要的话可以通过调用SetCandidateListProps再修改或者直接调用InitCandidateListDefaults的时候传入一个自己设置的对的