cSparrowApp类以及IO事件处理
来源:互联网 发布:剑三正太帅气捏脸数据 编辑:程序博客网 时间:2024/05/25 23:58
1、cSparrowApp类的设计
cSparrowApp类是所有SPE应用程序的抽象基类,应用程序继承它之后可以重写它感兴趣的虚函数。cSparrowApp类定义了下面这些虚函数,
virtual void OnInit(){}virtual void OnExit(){}virtual bool OnKeyDown(Key key){return false;}virtual bool OnMouse(MouseState mstate,int x,int y) {return false;}virtual bool OnMouseMove(MouseState mstate,int x,int y){return false;}virtual void OnResize(int width,int height){}virtual void OnFrameMove(float appTime,float elapsedTime){};virtual void OnFrameRender() = 0;
里面除了惟一的一个纯虚函数OnFrameRender()必须重新实现外,其他都可以有选择地实现。
应用程序端的所有初始化操作可以放到OnInit()中,所有的收尾操作如释放资源等可以放到OnExit()中,它们分别会在窗口创建以及窗口销毁时被调用一次。
应用程序可以通过上面第3、4和5个函数来处理键盘和鼠标事件,当某个键被按下时,OnKeyDown()会被调用,当鼠标被按下或放开时OnMouse()会被调用,当鼠标滚轮滚动或按住某个键移动时,OnMouseMove()会被调用;其中Key,MouseState是引擎定义的枚举类型,应用程序可以通过它们获得具体的事件信息。这三个函数都返回一个布尔类型的变量,用来指示应用程序是否处理了该事件。
应用程序端的逻辑控制以及计算如物理运算可以放到OnFrameMove()函数当中,它有两个参数,appTime表示自应用程序启动至现在经历的时间,elapsedTime表示自上一帧开始经历的时间,都以毫秒为单位,OnFrameMove会在OnFrameRender()调用之前被调用一次。
几何信息的绘制,以及一些渲染效果的实现可以放到OnFrameRender()中。
OnResize()在窗口大小被改变时会被调用,在函数中可以更新投影矩阵或控件的大小位置等。
一个完整的应用程序框架代码看起来像下面这样子:
class cMyApplication : public cSparrowApp{public:cMyApplication(int argc,char *argv[]) : cSparrowApp(argc,argv){}void OnInit(){// init code here}void OnExit(){// uninit code here}bool OnKeyDown(Key key){if (key == KEY_0){// key handling codereturn true;}return false;}bool OnMouse(MouseState mstate,int x,int y) {if (mstate == MOUSE_LEFT_UP){// handle left mouse upreturn true;}return false;}bool OnMouseMove(MouseState mstate,int x,int y){if (mstate == MOUSE_ROLL_FORWARD){// handle mouse rolling forwardreturn true;}return false;}void OnResize(int width,int height){// handling window resizing}void OnFrameMove(float appTime,float elapsedTime){// computing&updating code here}void OnFrameRender(){// rendering code here}};int main(int argc, char* argv[]){cMyApplication app(argc,argv);cSparrowApp::GetAppRef().CreateRenderWindow("SparrowEngine Demo",0,0,600,600);cSparrowApp::GetAppRef().Run();return 0;}
2、查询键盘状态
为了考虑效率,当一个键被一直按着时,键被按下事件不会频繁产生,也就是OnKeyDown()并不会被重复调用;但有的时候需要查询某个键是否处于按下状态,如第一人称摄像机用键盘控制的时候就需要,为此,SPE提供了一个KeyHandler类,里面有一个IsKeyDown()函数可用于查询某个常规键是否处于按下状态,若要查询控制键(如Ctrl,Shift,Alt)的状态可以使用IsCtrlActive(),IsShiftActive()以及IsAltActive()这三个函数;这几个函数原型为:
static bool IsCtrlActive()static bool IsAltActive()static bool IsShiftActive()static bool IsKeyDown(Key key)
它们都是KeyHandler类中的静态函数。
- cSparrowApp类以及IO事件处理
- 自定义view以及事件处理
- DOM事件流、事件处理程序以及事件对象
- .Net中的委托以及事件处理
- .Net中的委托以及事件处理
- View以及ViewGroup的事件处理流程
- 动态获取权限, 以及事件处理
- Java IO:操作系统的IO处理过程以及5种网络IO模型
- 关于委托、事件、处理事件的方法以及.NET
- Touch事件处理 以及 Touch事件传递机制
- muduo中TcpConnection里IO事件的处理
- Netty源码分析(九)—IO事件处理流程
- 事件Io
- Java的对象序列化以及文件IO处理
- Java的对象序列化以及文件IO处理
- cocos2dx EventListenerCustom类控制事件的分发 处理不同层之间的事件传递以及自定义用户数据
- 事件处理类
- IO处理
- 自动化测试工具selenium 之Selenium-IDE
- VB之旅-调用Excel导出控件MSHFlexGrid的数据
- cf 342C - Cupboard and Balloons(计算几何)
- poj3041 Asteroids 二分图最小点集覆盖
- 在MFC中使Edit Control自动滚动到最底端
- cSparrowApp类以及IO事件处理
- myeclipse不编译解决方法
- 关于QT的pro文件编写及英文文档
- Struts中the request was rejected because its size (***) exceeds the configured ma
- 统计一串字符串中出现次数最多和次多的单词(华为上机考试题)
- 我看易信
- sftp报Received message too long 1114795883
- 8583报文详细分析
- 统计一个字符串中各个英文单词的出现的频数