Cocos2d-x進修筆記之Hello World源碼剖析。本站提示廣大學習愛好者:(Cocos2d-x進修筆記之Hello World源碼剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是Cocos2d-x進修筆記之Hello World源碼剖析正文
起首我們來講一下流戲的道理,游戲相似於一場片子,晚期的片子不就是靠一張張的圖片放出來的嗎?把場景人物甚麼的畫在一幅幅圖片上,然後從第一張圖片開端播放便可以了。游戲更是如斯,其實我們玩的游戲看到的畫面都是美工做出來的,我們法式員要做的工作是組織這些圖片,好比先弄個配景圖片,然後在某一個坐標上放置一小我物的圖片,我們寫好法式,掌握這個圖片的挪動途徑,等機械運轉的時刻每秒都要刷新畫面,我們就看到人物動了起來。而刷新頁面的快慢就是我們所說的幀率,這個在法式中我們可以掌握。全體的意思就是游戲不外是一些圖片而已,而我們就是掌握這些圖片,讓這些圖片活動,當用戶單擊圖片的時刻我們做一些事宜呼應的處置等等,固然還有一些其他的任務。然後cocos2d-x中有一些根本的類,好比導演類,這個是用來掌握全部游戲的,正如正真的導演一樣,每一個游戲中只要一個導演,是一種單例設計形式。還有場景類,圖層類,應用最廣的就是精靈類,場景裡邊可以包括圖層,圖層上包括精靈。上面我們就經由過程這個helloworld場景來進入cocos2d-x的編程世界吧。
我們先把成果運轉出來,看著圖來講明朝碼的寄義。年夜多半代碼的寄義都有正文,年夜家可以看代碼了。
起首是main.cpp
#include "main.h" #include "AppDelegate.h" #include "CCEGLView.h" USING_NS_CC; // uncomment below line, open debug console // #define USE_WIN32_CONSOLE int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); #ifdef USE_WIN32_CONSOLE AllocConsole(); freopen("CONIN$", "r", stdin); freopen("CONOUT$", "w", stdout); freopen("CONOUT$", "w", stderr); #endif // create the application instance AppDelegate app; //CCEGLView是單例設計形式,經由過程挪用sharedOpenGLView()(今後只需是看到shared...就代表是一種單例設計形式)函數,取得全局獨一的opengl圖象引擎的實例 CCEGLView* eglView = CCEGLView::sharedOpenGLView(); //以下這句比擬主要,setFrameSize(x,y)是設置游戲窗口的年夜小,經由過程轉變傳入的值,可以轉變游戲窗口的年夜小,看到窗口頂部的那行字了嗎,就是寫的窗口的年夜小 eglView->setFrameSize(480, 320); int ret = CCApplication::sharedApplication()->run(); #ifdef USE_WIN32_CONSOLE FreeConsole(); #endif return ret; }
Appdelegate.cpp以下
#include "cocos2d.h" //想要應用cocos2d-x引擎,就要包括這個頭文件 #include "CCEGLView.h" //這個是opengl圖形引擎的頭文件 #include "AppDelegate.h" //這個是性命周期類的頭文件 #include "HelloWorldScene.h" //這個是HelloWorld場景的頭文件 #include "SimpleAudioEngine.h" //這個是聲響引擎的頭文件 //要應用聲響引擎,必需應用定名空間CocosDenshion using namespace CocosDenshion; //要應用cocos2d-x引擎,必需應用定名空間cocos2d,這個宏界說相當於using namespace cocos2d,年夜家可以選中它,按下f12,轉到它的界說 USING_NS_CC; //以下這倆個分離是性命周期類的結構函數和析構函數 AppDelegate::AppDelegate() { } AppDelegate::~AppDelegate() { //游戲性命周期停止的時刻停滯播放聲響,曉得c++基本的人必定曉得end()函數是靜態函數吧 SimpleAudioEngine::end(); } //當游戲啟動的時刻,就會挪用這個函數,所以今後我們應當從這個函數看起 bool AppDelegate::applicationDidFinishLaunching() { //導演類的初始化,又是shared...所以又是單例設計形式啊 CCDirector *pDirector = CCDirector::sharedDirector(); pDirector->setOpenGLView(CCEGLView::sharedOpenGLView()); //年夜家看到了游戲左下角的誰人數字60了嗎,這個就是幀率(就是每秒鐘游戲屏幕刷新的次數),這裡可以設置它能否顯示在左下角 pDirector->setDisplayStats(true); //固然這裡就是設置這個幀率了,在手機上的時刻幀率不克不及小於30,不然游戲玩起來就會卡,幀率越高固然越耗CPU了,也就越費電了,所以幀率應當公道的設置 pDirector->setAnimationInterval(1.0 / 60); //創立一個helloworld場景,從這裡就可以看出scene是一個靜態函數吧 CCScene *pScene = HelloWorld::scene(); //然後導演挪用runWithScene()函數來運轉helloworld場景 pDirector->runWithScene(pScene); return true; } //當我們玩游戲的時刻忽然被其他工作打斷的時刻,好比接德律風,就會挪用這個函數 void AppDelegate::applicationDidEnterBackground() { //導演挪用stopAnimation()來停滯播放畫面 CCDirector::sharedDirector()->stopAnimation(); //聲響引擎停滯播放聲響 SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic(); } //當事宜處置完成以後就會挪用這個函數,好比德律風接聽終了 void AppDelegate::applicationWillEnterForeground() { CCDirector::sharedDirector()->startAnimation(); SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic(); }
以上倆個文件中的代碼我們應用模板生成勝利今後根本不消更改,我們須要做的就是寫本身的場景類,寫之前,讓我們看看HelloWorld這個場景的完成吧。
先來看HelloWorld.h
#ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" #include "SimpleAudioEngine.h" //HelloWorld繼續自CCLayer圖層 class HelloWorld : public cocos2d::CCLayer { public: //這是HelloWorld場景類的初始化函數,是一個虛函數 virtual bool init(); //這是一個靜態函數,可以經由過程指向類名的指針->scene()直接挪用,前往一個CCScene場景的指針 static cocos2d::CCScene* scene(); //這是一個回調函數,是對單擊停止按鈕事宜的呼應函數 void menuCloseCallback(CCObject* pSender); //這個宏可以經由過程f12看看他的詳細完成,其實就是new一個對象,然後挪用它的init函數(如今曉得init函數甚麼時刻挪用了吧),然後前往該對象的指針 CREATE_FUNC(HelloWorld); }; #endif // __HELLOWORLD_SCENE_H__
然後是HelloWorld.cpp
#include "HelloWorldScene.h" using namespace cocos2d; CCScene* HelloWorld::scene() { CCScene * scene = NULL; //這個do,while輪回只會履行一次,為何如許寫,先不消管 do { //起首創立一個CCScene的場景,挪用的是create函數,其實對象的創立年夜多半都是挪用create函數 //這個create函數外部就是new一個對象,然後挪用對象的init()函數,還有關於內存治理的一些任務,先不消管,你只須要記住c++中我們創立指向對象的指針是經由過程new,如今都封裝在了create函數中了 //能夠有時刻我們須要往create()中傳入一些器械,然則它的外部完成函數我上邊說的,就是帶了幾個參數罷了 scene = CCScene::create(); //CC_BREAK_IF宏的寄義是假如沒有創立勝利對象scene,就跳出do,while語句 CC_BREAK_IF(! scene); //年夜家可以對create()f12一下,看是否是到了CREATE_FUNC(HelloWorld)這了,解釋我上邊說的就是對的。這裡發生了一個指向helloworld層的指針。 HelloWorld *layer = HelloWorld::create(); CC_BREAK_IF(! layer); //將helloworld層添加到scene場景中,往一個場景中添加層,往層中添加精靈等都是用的這個函數addChild() scene->addChild(layer); } while (0); //前往包括helloworld這個層的場景 return scene; } //有些人能夠還會問init函數是甚麼時刻挪用的,我建議你好悅目看上邊的正文 bool HelloWorld::init() { bool bRet = false; do { //起首初始化父類的init()函數 CC_BREAK_IF(! CCLayer::init()); //這是一個菜單項,對應圖中的誰人封閉按鈕,傳入倆張圖片,對應正常狀況時刻的按鈕盒按下狀況的按鈕圖片 //第四個參數中menu_selector是菜單選擇器,cocos2d-x中還有很多的選擇器,先記住,menuCloseCallback對應誰人回調函數,第三個參數this就代表是哪一個類的回調函數 CCMenuItemImage *pCloseItem = CCMenuItemImage::create( "CloseNormal.png", "CloseSelected.png", this, menu_selector(HelloWorld::menuCloseCallback)); CC_BREAK_IF(! pCloseItem); //設置這個按鈕的坐標,ccp也是一個宏,用來設置坐標的,getWinSize()取得了屏幕的尺寸,前往CCSize,width、height是它的屬性 pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20)); //創立一個菜單,在cocos2d-x中須要將菜單項添加到菜單中也就是CCMenu中才可以,NULL表現菜單項的停止。 CCMenu* pMenu = CCMenu::create(pCloseItem, NULL); //設置這個菜單的坐標CCPointZero對應(0,0) pMenu->setPosition(CCPointZero); CC_BREAK_IF(! pMenu); //將菜單添加到HelloWorld的圖層中,1表現的是深度,數字越小深度越深,只要添加到圖層中才可以顯示 this->addChild(pMenu, 1); //創立一個文字,傳入要顯示的字,字體,年夜小,對應圖片上的誰人helloworld CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", 24); CC_BREAK_IF(! pLabel); //取得屏幕的尺寸 CCSize size = CCDirector::sharedDirector()->getWinSize(); //為pLabel設置坐標 pLabel->setPosition(ccp(size.width / 2, size.height - 50)); //將這個文字天劍到圖層中能力顯示 this->addChild(pLabel, 1); //往圖層中添加一個精靈是最經常使用的,精靈初始化的時刻傳入了一張圖片,這個資本就在resource下 CCSprite* pSprite = CCSprite::create("HelloWorld.png"); CC_BREAK_IF(! pSprite); //設置這個精靈的坐標 pSprite->setPosition(ccp(size.width/2, size.height/2)); //將精靈添加到圖層中,深度是0 this->addChild(pSprite, 0); bRet = true; } while (0); return bRet; } //當用戶按下封閉按鈕的時刻挪用該回調函數,CCObject代表的是和這個函數綁定的按鈕,用的時刻強迫轉化為CCMenuItemImg* void HelloWorld::menuCloseCallback(CCObject* pSender) { //導演挪用end辦法停止游戲 CCDirector::sharedDirector()->end(); }
顯示的圖片中還有幾點要說,誰人左下角的3代表3個元素,在這個圖層中,我們添加了一個精靈,一個文字,一個菜單項,所所以3,0.000代表每幀的距離。全體的寄義就是在scene中添加了helloworld層,層中添加了三個精靈,然後導演挪用runWithScene()函數運轉scene場景。