[Cocos2d-x For WP8]Hello world
Cocos2d-x For WP8使用C++開發,使用cocos2d-xv0.13同樣的接口,Cocos2d-x For WP8的相關項目代碼可以從下面的網址下載到:
https://github.com/cocos2d-x/cocos2dx-win8/tree/wp8
http://cocos2d-x.googlecode.com/files/cocos2dx-0.13.0-wp8-0.8.zip
打開了項目中的Hello World項目我們可以看到下面的項目結構,這里我把多余的東西刪除掉了。
圖片:
那么在WP8里面的Cocos2d-x框架其實還是要基於WP8的DirectX進行封裝而成的,然后映射到了Cocos2d-x框架相關的接口。
(1)程序的入口
在這個項目里面我們先來關注下cocos2dorig.cpp文件,這里封裝了程序的入口相關的信息,main方法就是程序的入口。在這個程序入口里面把原來的WP8的DirectX的初始化方法注釋掉了,換成了Cocos2d-x所封裝的程序實例AppDelegate類。
//游戲的入口 [Platform::MTAThread] int main(Platform::Array<Platform::String^>^) { //auto direct3DApplicationSource = ref new Direct3DApplicationSource(); //CoreApplication::Run(direct3DApplicationSource); //創建程序的實例 AppDelegate App; auto frameworkViewSource = ref new CCApplicationFrameworkViewSource(); Windows::ApplicationModel::Core::CoreApplication::Run(frameworkViewSource); return 0; } ref class CCApplicationFrameworkViewSource sealed : Windows::ApplicationModel::Core::IFrameworkViewSource { public: virtual Windows::ApplicationModel::Core::IFrameworkView^ CreateView() { //cocos2d::getSharedCCApplicationFrameworkView()封裝了WP8 DirectX游戲的初始化邏輯 return cocos2d::getSharedCCApplicationFrameworkView(); } };
(2)程序的實例
那么我們可以把AppDelegate類看作是程序的實例,因為程序的實例初始化,完成加載,程序進入休眠狀態和程序回到前台的相關處理方法,類似於WP8應用程序App類的功能。
//程序初始化實例 bool AppDelegate::initInstance() { bool bRet = false; do { #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN8_METRO) // fix bug: 16bit aligned void* buff=_aligned_malloc(sizeof(CCEGLView),16); CCEGLView* mainView = new (buff) CCEGLView(); mainView->Create(); //mainView->setDesignResolution(480, 320); //mainView->setDesignResolution(640, 1066); CCLOG("Device Res:%d", m_deviceResolutionInPixels); //根據三種分辨率創建主視圖 switch (m_deviceResolutionInPixels) { case DeviceResolutionInPixels_WVGA: { mainView->setDesignResolution(480, 800); break; } case DeviceResolutionInPixels_720p: { mainView->setDesignResolution(720, 1280); break; } case DeviceResolutionInPixels_WXGA: { mainView->setDesignResolution(768, 1280); break; } } #endif // CC_PLATFORM_WIN8_METRO bRet = true; } while (0); return bRet; } //程序啟動 bool AppDelegate::applicationDidFinishLaunching() { // 初始化導演對象 CCDirector *pDirector = CCDirector::sharedDirector(); //設置主視圖 pDirector->setOpenGLView(CCEGLView::sharedOpenGLView()); // turn on display FPS //pDirector->setDisplayFPS(false); //設置屏幕方向 pDirector->setDeviceOrientation(CCDeviceOrientationLandscapeLeft); // set FPS. the default value is 1.0/60 if you don't call this //pDirector->setAnimationInterval(1.0 / 60); // 創建scene CCScene *pScene = HelloWorld::scene(); // 用導演對象運行scene run pDirector->runWithScene(pScene); return true; } //進入休眠 void AppDelegate::applicationDidEnterBackground() { CCDirector::sharedDirector()->pause(); } //從休眠回到程序 void AppDelegate::applicationWillEnterForeground() { CCDirector::sharedDirector()->resume(); }
(3)游戲的界面和邏輯
那么HelloWorld類就是處理我們游戲的界面和邏輯的類了,話說你可以把它當做成是MainPage類。在這里定義了默認的游戲場景。Cocos2d的游戲結構可以簡單地概括為場景、層、精靈,而這兩個文件就是Hello World場景的實現文件。每個游戲組件都可以添加到另一個組件中,形成層次關系,例如場景中可以包含多個層,層中可以包含多個精靈。
HelloWorldScene中定義了一個HelloWorld類,該類繼承自CCLayerColor,CCLayerColor也就是繼承自 CCLayer,因此HelloWorld本身是一個層。
在AppDelegate::applicationDidFinishLaunching()方法里面我們看到了調用了HelloWorld::scene()的方法,那么這個就是創建游戲的場景。
CCScene* HelloWorld::scene() { CCScene * scene = NULL; do { // 'scene'是一個可以自動釋放的對象 scene = CCScene::create(); //創建失敗跳出循環 CC_BREAK_IF(! scene); // 'layer'是一個可以自動釋放的對象 HelloWorld *layer = HelloWorld::create(); //創建失敗跳出循環 CC_BREAK_IF(! layer); // 添加layer到scene上面 scene->addChild(layer); } while (0); // 返回scene return scene; }
在上面的代碼中我們看到了調用了HelloWorld::create()的方法,那么在HelloWorldScene.h頭文件里面我們找到了該方法的定義,實際上就是調用了init()方法。
// implement the "static create()" method manually CREATE_FUNC(HelloWorld); /** * define a create function for a specific type, such as CCLayer * @__TYPE__ class type to add create(), such as CCLayer */ #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; \ } \ }
下面我們再來看看init()方法是怎么對游戲進行初始化的。
//在init方法里面初始化當前的實例 bool HelloWorld::init() { bool bRet = false; do { //CCLayer進行初始化,初始化失敗跳出循環 if ( !CCLayer::init() ) { break; } //獲取手機屏幕的大小 CCSize size = CCDirector::sharedDirector()->getWinSize(); //創建文字Label CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Times New Roman", 24); //設置文字Label的位置 pLabel->setPosition( ccp(size.width * 0.5, size.height * 0.5) ); //設置文字Label的顏色 pLabel->setColor(ccc3(160, 80, 5)); //添加到當前的界面上 this->addChild(pLabel, 1); bRet = true; } while (0); //返回成功 return bRet; }
游戲的運行如下圖所示: