游戏声明周期
一个游戏对应一个Application对象。Application的职责是管理游戏生命周期并设置默认游戏窗口,获取平台及本地化信息等。在Cocos2d-x中,通常不直接创建Application对象。Cocos2d-x脚本在帮助我们创建应用程序项目时,通常会实现一个Application的子类供程序员自定义生命周期的各个阶段的处理,这个子类教AppDelegate。
在applicationDidFinishLaunching事件中,我们需要创建和初始化一个Director,并为Director创建一个OpenGL ES窗口,然后创建第一个场景,并将场景交给Director绘制出来。在多屏设备中,一个Application还可以创建多个Director,每一个Director对应于一个屏幕。此外,在程序启动事件中还可以做其他一些设置工作,例如分辨率、帧率、资源搜索目录等。
在应用程序启动后,我们需要响应应用程序的切换事件。
窗口尺寸
应用程序中关于窗口方面最常用的操作是通过Director查询当前的窗口尺寸。Director提供了几种不同概念的窗口尺寸。WinSize表示实际的画布大小,VisibleSize表示屏幕上可见区域的大小,但都表示设计分辨率。winSizeInPixel可以获取屏幕的实际分辨率。
场景管理
Director提供两种方法从一个场景切换到另一个场景:
- 使用
replaceScene()
方法直接替换。 使用场景栈来管理这些场景。
使用场景栈需要注意内存问题,因为所有场景都不会被释放,所以只有一些小型的临时场景才需要使用场景栈。
游戏循环
Application::run是整个应用程序的入口,Director::mainLoop则定义了一个游戏循环所有事件和内容。
游戏循环的步骤如下:
- 检测玩家输入事件的发生。因为玩家操作的是他看到的内容,他看到的一切元素位置都是由上一帧绘制确定的,所以这样做能保证程序处理的也是玩家期望的结果。
- 执行动画更新。同样,动画更新也应该被优先处理,因为在动画计算之后,程序逻辑可能还会对值进行修改。
- 物理模拟碰撞。注意,这里并不是绝对的,Cocos2d-x中的物理更新实现为Scene向Scheduler注册一个优先级为0的更新处理,应用程序可能注册一个优先级更高的逻辑更新,可能先于物理模拟被处理。
- 程序逻辑更新。
- UI树的遍历。
- 渲染系统开始根据元素的逻辑绘制顺序进行绘制,全部元素绘制完成之后,交换前后缓冲区,以将当前帧的内容绘制到屏幕上。
- 最后,PoolManager会释放掉当前帧的所有autorelease对象。