程序的啟動
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 的構造方法)。