本文接上一篇cocos2dx架构一瞥——Node类、坐标系及UI树。
本文是阅读《我所理解的cocos2d-x》第二章——Cocos2dx架构一瞥的2.4、2.5、2.6小章节后的总结。
(参考书籍《我所理解的cocos2d-x》,秦春林著)
(文中cocos2d-x版本为3.17)
六、应用程序架构
1、游戏生命周期
在cocos2dx中,一个游戏对应的是一个Application对象。但是我们通常不直接创建Application对象,而是通过实现一个Application的子类,来自定义我们游戏生命周期各个阶段的处理,这个子类叫AppDelegate。
int WINAPI _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// create the application instance
AppDelegate app;
return Application::getInstance()->run();
}
AppDelegate类
class AppDelegate : private cocos2d::Application
{
public:
AppDelegate();
virtual ~AppDelegate();
virtual void initGLContextAttrs();
virtual bool applicationDidFinishLaunching();
virtual void applicationDidEnterBackground();
virtual void applicationWillEnterForeground();
};
Application类中的调用
int Application::run()
{
// Initialize instance and cocos2d.
if (!applicationDidFinishLaunching())//此处调用的就是AppDelegate类中的方法
{
return 1;
}
}
我们细说一下AppDelegate类中的方法,因为这是我们主要的逻辑。
bool AppDelegate::applicationDidFinishLaunching() {
// initialize director
//首先我们初始化并获取Director单例,(单例模式)
auto director = Director::getInstance();
//然后我们获取OpenGLES的对象,并判断一下是否存在
auto glview = director->getOpenGLView();
if(!glview) {
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) || (CC_TARGET_PLATFORM == CC_PLATFORM_LINUX)
glview = GLViewImpl::createWithRect("MindOfMnemonist", cocos2d::Rect(0, 0, designResolutionSize.width, designResolutionSize.height));
#else
glview = GLViewImpl::create("MindOfMnemonist");
#endif
director->setOpenGLView(glview);
glview->setDesignResolutionSize(800, 480, kResolutionExactFit);
}
// turn on display FPS
director->setDisplayStats(true);
// set FPS. the default value is 1.0/60 if you don't call this
director->setAnimationInterval(1.0f / 60);
// create a scene. it's an autorelease object
auto scene = Scene::scene();
// run
//Director对象进行绘制场景
//在多屏幕设备上,我们可以创建多个Director(去掉单例),每一个Director对应渲染一个屏幕。
director->runWithScene(scene);
}
//除了以上的设置,我们还可以设置分辨率,帧率,资源搜索目录。
在应用程序启动之后,我们可能会需要相应切换事件(手机切换软件,程序就到了后台),程序前后台切换的时候,切到后台我们应该暂停游戏,切回之后再继续
我们可以在下面两个函数设置
class AppDelegate : private cocos2d::Application
{
public:
AppDelegate();
virtual ~AppDelegate();
virtual void initGLContextAttrs();
//程序正常运行
virtual bool applicationDidFinishLaunching();
//程序被切到后台
virtual void applicationDidEnterBackground();
//切回前台
virtual void applicationWillEnterForeground();
};
// This function will be called when the app is inactive. Note, when receiving a phone call it is invoked.
void AppDelegate::applicationDidEnterBackground() {
Director::getInstance()->stopAnimation();
}
void AppDelegate::applicationWillEnterForeground() {
Director::getInstance()->startAnimation();
}
2、窗口尺寸
在cocos2dx中Director控制着场景的一切,包括OpenGLES的初始化、窗口管理、场景管理以及切换、游戏循环等等。
在刚刚的源码中我们可以看到,Director控制着一个GLView的对象,它表示一个OpenGLES窗口。GLView会初始化OpenGLES相关的工作,在游戏的每一帧,Director都会通过GLView对象来绘制。
class CC_DLL Director : public Ref
{
GLView *_openGLView;
};
在概念上,WinSize表示实际的画布大小,VisibleSize表示屏幕上可见区域的大小,所以VisibleSize总是小于等于WinSize。
WinSize和VisibleSize都表示设计分辨率,设计分辨率又被称虚拟分辨率,它通常根据美术资源的分辨率来设置。
winSizeInPixels可以获取屏幕的实际分辨率。
3、场景管理
class CC_DLL Director : public Ref
{
/** Gets current running Scene. Director can onl