程序的启动
main 函数
main 函数中,首先实例化了自动释放池,因为 iOS 和 Cocos2D-X 的内存管理方式都是引用计数,这个自动释放池贯穿着整个程序的生命周期,然后接下来给 UIApplicationMain 传入命令行参数以启动程序,注意 UIApplicationMain 的最后一个参数:
int retVal = UIApplicationMain(argc, argv, nil, @"AppController");
@"AppController" 表示要进入名为 AppController 这个类,也就是我们这个 iOS 程序的应用程序委托,
tests/cpptests/proj.ios/Classes/testsAppDelegate.h
tests/cpptests/proj.ios/Classes/testsAppDelegate.mm
这两个文件定义了 AppController 类,注意实现文件的后缀 mm ,表示这个文件是以 OC 和 C++ 混写的。这个类实现了 UIApplicationDelegate 协议,是我们整个 iOS 程序的委托(注意与 Cocos2D 程序的委托区分)。
AppController (iOSApplicationDelegate)
在 iOS 应用程序委托中,我们主要关注一下 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法。这是程序启动之后的回调方法。
这个方法大概做了这些事:
- 首先取得了 Cocos2D 的 Application ,这是一个单例;
- 实例化一个 UIWindow 并显示;
- 实例化一个 RootViewController 并赋给 UIWindow 的 rootViewController ;
- 处理 GLView 并分别绑定到 rootViewController 和 Director 上;
- 调用 cocos2d::Application 的 run 方法,表示我们的 Cocos2D 程序启动了。
在 AppController 中的回调函数中,我们可以加一些关于程序启动、进入后台等一些处理,在 RootViewController 中,我们可以做一些关于内存警告、屏幕方向的处理。
现在,Cocos2D 程序也启动了,类似于 iOS 程序,Cocos2D 程序也有自己的应用程序委托。
AppDelegate (Cocos2DApplicationDelegate)
在
tests/cpp-tests/Classes/AppDelegate.h
tests/cpp-tests/Classes/AppDelegate.cpp
中定义了 Cocos2D 应用程序委托:AppDelegate ,注意实现文件的后缀 cpp ,表示我们现在已经“离开了” iOS 的 “OC 世界”,来到了 Cococ2D-X 的 “CPP 世界”,当然,之后我们也可以定义自己的 mm 文件来调用 iOS 的 API 。
在 AppDelegate 类中,也有关于程序启动、进入后台等的相关回调方法,同时有一个私有成员变量 : _testController 。我们依然关注一下程序启动的回调方法 :bool AppDelegate::applicationDidFinishLaunching() 看看在程序启动之后都做了什么。
- 初始化 Director;
- 开启 FPS 显示模式用于调试,设置帧率;
- 获取 FileUtils 单例并加入资源搜索路径;
- 获取 testController 单例(调用 getInstance() 方法 ,其中 getInstance() 方法中调用了 TestController 的构造方法)。