cegui 5
输入输出入门
通过前面的教程,你现在可以渲染CEGUI,甚至是创建窗口,这时,你也许想给你的GUI添加用户交互了.
CEGUI输入处理简介
坏消息
令人吃惊的是 ,CEGUI不会自动捕获任何的用户输入,由程序决定CEGUI需要处理哪些输入.这意味着:
每当产生案件或者鼠标移动等消息时,你就得把它门传递给CEGUI,尽管这看起来很奇怪,这其实也给你更多
的控制权, 我们并没有把所有的输入绑定到特定的系统,你可以筛选传递CEGUI需要获得的输入.
传递你的输入
我们创建了一个接口用来向CEGUI传递输入信息.它由CEGUI::System类的一组成员函数组成--------
对于每种基本的输入类型都有一个函数与之对应
bool iniectMouseMove(float delta_x ,float delta_y);
bool injectMousePosition(float x_pos,float y_pos);
bool injectMouseLeaves(void);
bool injectMouseButtonDown(MouseButton button);
bool injectMouseButtonUp(MouseButton button);
bool injectKeyDown(unit key_code);
bool injectKeyUp(unit key_code);
bool injectChar(utf 32 code_point);
bool injectMouseWheelChange(float delta);
bool injectTimePulse(float timeElapsed);
是的,看起来很多, 你可能注意到有点重复了,比如"mouse move"和"mouse position"有点重复.
"key down"和"char"等. 其实这么做是为了方便使用,对于鼠标,你可以传递相对位移(injectMouseMove)
或绝对坐标(injectMousePosition),具体选择哪种很大程度上取决于使用的输入库支持的类型. 对于按键,
你可以传递按下.抬起(injectKeyDown/injectKeyUp)以及字符(injectChar)消息.这样做有2个原因:第一,
不是所有的按键都产生字符消息(比如shift alt)等等;第2,允许你自定义按键映射和自动重复按键(CEGUI目前不提供那些函数)
另外要说明的是函数的布尔返回值.他是用来告诉程序CEGUI是否处理了此消息.如果返回false,说明CEGUI没有处理此消息,
此时你的程序需要做另外一些处理.
那些函数是用来干什么的
下面,我们将要简要的讨论每个函数的作用,它需要的参数,它用输入做了什么。- bool injectMouseMove( float delta_x, float delta_y )
- bool injectMousePosition( float x_pos, float y_pos )
- bool injectMouseLeaves( void )
- bool injectMouseButtonDown( MouseButton button )
- enum MouseButton
- {
- LeftButton,
- RightButton,
- MiddleButton,
- X1Button,
- X2Button,
- MouseButtonCount,
- NoButton
- };
- bool injectMouseButtonUp( MouseButton button )
- bool injectKeyDown( uint key_code )
此函数用来告诉系统某个按键被按下了。它的参数“
key_code”是那个按键的扫描码(不是
ASCII码或其他的字符编码)。所有的扫描码在
CEGUI::Key::Scan枚举变量中有定义。微软的
DirectInput库输出的扫描码和我们的是一样的,如果使用其他的库,你可能需要做一些转换。目前看来,并不需要传递所有的按键按下/释放消息,一般需要这些消息的是:
backspace,
delete,回车,
shift以及方向箭头按键。
目前没有实现按键到字符的映射,也没有提供自动重复按键的函数(这些也许在以后会实现)。如果你需要自动重复按键功能,你可以使用输入库提供的函数或者自己编码实现。你肯定需要输入字符,请看下面的 injectChar函数。
目前没有实现按键到字符的映射,也没有提供自动重复按键的函数(这些也许在以后会实现)。如果你需要自动重复按键功能,你可以使用输入库提供的函数或者自己编码实现。你肯定需要输入字符,请看下面的 injectChar函数。
- bool injectKeyUp( uint key_code )
此函数用来告诉系统某个按键被释放了。和
injectKeyDown的参数一样,“
key_code”是按键的扫描码。
- bool injectChar( utf32 code_point )
此函数用来告诉系统一个字符按键被按下。在输入文本的时候,你需要用此函数。参数“
code_point”是一个字符的
Unicode UTF32编码(欲了解
Unicode请参看此
Unicode
网站)。怎样获得这个值取决于你所使用的输入库。对于
ASCII字符,你只需直接以
ASCII码的形式传递给它即可,因为
Unicode码和
ASCII码的
0到
127部分是相同的。对于其他字符,你使用的输入库应该会有相关的
API(比如:通过微软的
Windows消息泵可以获得字符的
UTF32编码),具体怎么做不属于本教程的范围。
- bool injectMouseWheelChange( float delta )
此函数用来告诉系统鼠标滚轮的使用情况。正数表示向前滚动(远离用户方向),负数表示向后滚动(接近用户方向)。
- bool injectTimePulse( float timeElapsed )
此函数用来告诉系统相关时间信息。参数“
timeElapsed”表示自上次调用此函数或运行
CEGUI以来所经过的秒数。此函数越来越重要了,它被用来控制控件的消失,为工具提示、菜单以及鼠标按键的自动重复提供计时等。
总结
目前,我们学习了CEGUI获取输入的函数,以及那些函数的作用、参数等。与前面几篇教程不同,此篇并未提供具体的示例代码。主要是想使教程适当的简短,以防因对特定的输入库编码而杂乱无章。将特定输入库的使用放在单独的文章中讲述更合理。
如果想看一些具体的例子,这里提供两个:
* 我们在wiki上有一些很牛的例子 o Using CEGUI with SDL and OpenGL o Using CEGUI with Producer and OpenGL * 使用示例框架代码写成的例子被保存在cegui_mk2/Samples/common/src: o Win32AppHelper.cpp - contains a windows message procedure injecting mouse and character inputs into CEGUI, and using DirectInput for keyboard up and down messages. o CEGuiOgreBaseApplication.cpp - contains an example Ogre::FrameListener class which takes inputs generated by the OIS Library and injects these into CEGUI. o CEGuiOpenGLBaseApplication.cpp - registers callback functions with glut to process inputs, and also shows the use of a key translation table.
此外,使用Irrlicht的同学可以使用Irrlicht自带的event pusher ---- 每当一个输入产生的时候你可以使用Irrlicht Renderer的OnEvent函数处理它(你只需用injectTimePulse处理时间)。