写在前面
本专栏内容均为学堂在线慕课《3D游戏引擎架构设计基础》中的内容。个人将其转化成文字和图片的版本(个人更加喜欢文字版本的教程,阅读速度更快很多),方便查阅。
原课程链接:3D游戏引擎架构设计基础。
事件处理与脚本语言
事件处理与脚本语言概述
事件处理
事件驱动的游戏交互控制:
游戏引擎的事件处理方式影响着整个引擎架构的设计与风格。事件处理是引擎架构的底层设计,是引擎的两大主线内容之一(另一个是场景管理和渲染渲染)。其中游戏引擎循环架构风格包括三种:
- 回调驱动框架的交互控制方式
其中事件处理是通过回调函数执行的,示例如下:
事件处理机制框架示意:
- 基于事件更新的交互控制方式
- 视窗消息泵的交互控制方式
上述的事件处理机制中,回调驱动方式主要适用于窗口或外部输入的设备事件,采用的是事件处理机制;基于事件更新的方式主要适用于场景渲染的帧时间更新,可以用回调函数实现更新;视窗消息泵的方式主要适用于在已有的GUI框架中集成交互控制。
事件处理中的设计思想,观察者模式:
应用观察者模式使得事件与事件处理方法在定义时耦合度较小。
脚本语言
指为了缩短传统的编写-编译-链接-运行过程而创建的计算机编程语言,也是一种编译语言的扩展语言。其语法比较简单,与应用程序密切相关,可以直接调用应用程序函数,一般不具备通用性。其特性包括:直译性、轻量、支持快速迭代、方便易用。常见的脚本语言包括:Python、Lua、JavaScript等。
游戏引擎与脚本的关系示意如下:
其组合方式包括:
脚本语言的接口定义:
事件处理实现实例
OGRE事件处理
OGRE的事件:
所以OGRE的事件处理中核心是处理渲染事件,主要类FrameListener如下:
进一步地讨论frameRenderingQueued帧渲染排队事件:
OGRE的渲染事件监听相关类:
OGRE中外部事件在OGREBites模块中实现;OGREBites模块的ApplicationContext类是FrameListener类的子类,提供有方便的事件监听接口;OGREBites模块的InputListener结构定义了键盘、鼠标、触摸等输入事件的回调函数;OGREBites模块的其他外部类包括:窗口事件类、GUI的控件事件类等。
ApplicationContext类与事件处理相关的部分:
Panda3D事件处理
Panda3D事件处理机制中任务的概念:
Panda3D事件的核心类类图:
任务类之间的关系:
AsyncTask类接口:
事件处理机制和相关类:
事件处理器的详细解析:
事件对象定义和处理的一个示例:
GUI类: