以下为cocos2d-x版本2.2.5的项目HelloWorld的代码流程走向:
一、main.cpp中的_tWinMain为程序入口,其中代码为:
AppDelegate app;
CCEGLView* eglView = CCEGLView::sharedOpenGLView();
eglView->setViewName("helloworld by xing");
eglView->setFrameSize(480,320);
return CCApplication::sharedApplication()->run();
1、AppDelegate 继承于CCApplication,CCApplication这个类主要定义消息循环体Message Loop、获取当前程序实例等功能;
2、AppDelegate 代表了cocos2d的应用程序cocos2d Application。定义了函数:applicationDidFinishLaunching(),该函数主要是负责实现控制器CCDirector和场景CCScene的初始化;applicationDidEnterBackground(),该函数在程序回到后台运行时被调用;applicationWillEnterForeground(),该函数在程序回到桌面时被调用;
3、sharedOpenGLView()是CCEGLView的一个static方法。CCEGLView是一个窗体类,负责定义、创建窗体和初始化openGL的一些信息。在方法sharedOpenGLView()中实现这些。在CCEGLView中的Create中对定义窗口类、注册和创建窗口对象,步骤跟MFC创建窗口的步骤一致;
4、eglView->setViewName("helloworld by xing") 和 eglView->setFrameSize(480,320);是窗体的标题和框架大小属性的设置;
5、方法CCApplication::sharedApplication()返回当前的程序实例指针,即为第一行的app,相当于app->run();Appdelegate类中没有实现run()方法,所以调用父类CCApplication中的run()方法。run()方法很重要,主要有以下几个重要点:
- 调用applicationDidFinishLaunching(),该函数的作用:初始化游戏引擎控制器CCDirector和窗体CCEGLView;设置FPS;创建helloworld的scene:CCScene *pScene = HelloWorld::scene(),其中helloWorld继承于CCLayer,CClayer是CCNode的子类,负责实现触摸事件控制的协议“TouchEventsDelegate protocol”。在方法HelloWorld::scene()中先创建CCScene的对象scene,其中CCScene是CCNode的子类,只是用于抽象的概念,CCScene和CCNode大部分是一样的,区别在于CCScene的锚点默认在于screen的中心,然后创建helloworld类型的layer(该layer是个autorelease的对象),并使用scene->addChild(layer)添加layer,最后返回scene。接着pDirector->runWithScene(pScene);运行返回的scene,在runWithScene中pushScene和开始启动动画startAnimation();
- 接下来获取之前已定义的窗体指针或者创建窗体sharedOpenGLView()返回窗体指针,设置窗体在屏幕中的位置和显示该窗体ShowWindow(这几个步骤有点类似MFC的窗体实现流程);
- 接下来就是一个while(1){}循环,在该循环中:PeekMessage()获取消息存放到信息体结构MSG(类似MFC),获取时间并判断是否到了获取下一帧frame的时间点,如果是就会进行绘图drawScene()和pop出对象;接下来就是TranslateMessage()和DispatchMessage()。