cocos-2dx流程
AppController.mm
application函数
添加了
// cocos2d application instance static AppDelegate s_sharedApplication;
调用了cocos instance启动游戏
cocos2d::Application::getInstance()->run();
其它函数
applicationWillResignActive
instance->pause
applicationDidBecomeActive
instance->resume
applicationDidEnterBackground
instance->applicationDidEnterBackground
applicationWillEnterForeground
applicationWillEnterForeground
AppDelegate.cpp
applicationDidFinishLaunching
初始化导演类
auto director = Director::getInstance();
初始化EGLview
auto eglView = EGLView::getInstance();
设置导演类的opengiview
director->setOpenGLView(eglView);
在游戏右下角显示FPS的刷帧状态(true)
director->setDisplayStats(true);
设置刷帧频率(如果不设置默认每秒60帧)
director->setAnimationInterval(1.0 / 60);
设置游戏启动的第一个场景
auto scene = HelloWorld::createScene();
启动场景
HelloworldScene.h
- createScene静态方法,供其他类初始化获取(如delegate)
- init方法返回bool
- CREATE_FUNC(HelloWorld);宏自动生成create静态方法
- 定义其他回调函数
CREATE_FUNC宏创建一个自动释放的场景类,大致代码
#define CREATE_FUNC(__TYPE__) \
static __TYPE__* create() \
{ \
__TYPE__ *pRet = new __TYPE__(); \
if (pRet && pRet->init()) \
{ \
pRet->autorelease(); \
return pRet; \
} \
else \
{ \
delete pRet; \
pRet = NULL; \
return NULL; \
} \
}
这里注意到create的函数里面在初始化之后调用了CCObject的autorelease方法,使得生成的instance加入到COCOS2d的内存管理机制当中(AutoreleasePool),并且使得instance的retain和release方法生效。此时可以使用retain将对象保持,以及release将对象释放。create生成的对象,只有当调用了retain之后,才能且必须调用release方法。如果不调用在scene结束之后不能释放造成内存泄露。当instance被addChild到其他instance中是会自动调用retain方法声明被此对象所拥有直至此对象结束之后。所以只有当没有加入被addChild的成员变量才有必要被retain,所以可以再重定义虚构函数将成员变量主动release。release是将引用计数减1之后判断是否释放的功能能够。
retain声明将对象暂时保持保证不被销毁。AutoreleasePool在运行每帧是扫描被内存中被管理的对象,不被需要时调用释放内存。尽量使用create生成对象而不是构造函数生成。通过构造函数new以及init出来的对象不会自动调用autoRelease方法,所以不会被内存管理机制管理到。
- 对象的生命周期和C++中的一样。
- new之后调用autorelease后,对象的生命周期就是当前帧(在绘制下一帧的时候,就会被销毁掉)
- 用对象的create方法,其实就是new之后调用autorelease的整合,对象的生命周期也是一帧;
- 如果想自己控制对象的生命周期,直接使用new,或者create方法后调用retain;
- 销毁对象用CCObject::release(void);
(更贴切的解释参考下篇)
HelloworldScene.cpp
createScene --- create(CREATE_FUNC) --- init
createScene
- autorelease object scene
- autorelease object layer
- scene.addChild(layer)
init
alot
concept
- 坐标系,右手坐标,左下(0,0)
Anchor Point(精灵防止基准,默认中心) setAnchorPoint(ccp(0, 0)) ccp(0.5, 0.5)
Director::sharedDirector()->getWinSize(); Size visibleSize = Director::getInstance()->getVisibleSize(); Point origin = Director::getInstance()->getVisibleOrigin();