前情回顧
上一篇我簡單介紹了搭建cocos2d-x的開發(fā)環(huán)境暴浦,并演示了第一個HelloWorld程序歉秫,運(yùn)行效果如下:
這次我們就來講解下HelloWorld程序的一些具體細(xì)節(jié)柴信。
HelloWorld代碼分析
首先看一下HelloWorld的項目結(jié)構(gòu):
按照慣例操刀,對于C++程序蛾派,需要找到
main()
函數(shù), cocos2d-x也不例外愚隧,main
函數(shù)就在在 main.cpp
中。熟悉windows開發(fā)的應(yīng)該很快就找到踏揣,main函數(shù)是
_tWinMain
,其實現(xiàn)代碼也很簡單:
主要是兩行代碼
AppDelegate app;
return Application::getInstance()->run();
簡單說一下代碼的意思:
實例化一個AppDelegate
對象app
庆亡,獲取Application
單例,進(jìn)入run
函數(shù)捞稿,看樣子又谋,所有的事情,都在run
函數(shù)中了娱局,二話不說彰亥。立馬跟進(jìn)run
函數(shù)。如果VS裝有小番茄插件衰齐,鼠標(biāo)放在run
函數(shù)上任斋,按住Alt+G
就可以進(jìn)入了 :]
:( run
函數(shù)有些復(fù)雜... 如果是第一次閱讀沒有經(jīng)驗,會摸不著頭腦耻涛,你唯一的辦法只有打斷點調(diào)試仁卷。鑒于我之前有閱讀過這些代碼穴翩,我們直接進(jìn)入關(guān)鍵的部位,run
函數(shù)中的主循環(huán):
可以看到在while循環(huán)中反復(fù)地調(diào)用director
的mainLoop
方法锦积,下面我們的目標(biāo)自然要到mainLoop
中看個究竟芒帕,Alt+G
進(jìn)入!
我們現(xiàn)在著重看最后一個if
,主要做了兩件事:drawScene
和clear
到此我們大概能夠明白丰介,coco2d-x的游戲主循環(huán)中背蟆,會不停地進(jìn)行場景的渲染和資源的清理,至于渲染的細(xì)節(jié)和如何進(jìn)行資源的清理哮幢,我們后面再講带膀。代碼分析到這兒,大家心中的疑惑仍然沒有解開橙垢,HelloWorld程序中堅果小人到底是怎么來的呢垛叨?
還是回到我們的main
函數(shù)中,我們剛才只分析了一下run
函數(shù)柜某,漏了AppDelegate
實例化的過程嗽元,現(xiàn)在我們把重點放到AppDelegate
的構(gòu)造函數(shù)中吧。選中AppDelegate
, Alt+G
進(jìn)入構(gòu)造函數(shù)喂击。
進(jìn)入AppDelegate()
函數(shù)剂癌,空空如也,什么也沒有 :( 翰绊,那我們回頭只能看看AppDelegate
的基類構(gòu)造函數(shù)了吧佩谷。AppDelegate
私有繼承自Application
,進(jìn)入 Application
構(gòu)造函數(shù)(Alt+G
記得進(jìn)入對應(yīng)的平臺代碼中,cocos2d-x支持跨平臺监嗜,所以在這些基礎(chǔ)類上會做平臺相關(guān)的處理谐檀,windows這邊進(jìn)入的文件是CCApplication-win32.cpp
,千萬不要弄錯)。 進(jìn)入Applicaiton
的構(gòu)造函數(shù)裁奇,里面也很簡單啊:) 只是初始化了單例指針指向了自己桐猬。
看了這段代碼,我現(xiàn)在獲得的信息就是:Appliction是個單例框喳,它的單例指針在初始化的時候指向了自己课幕。先記住這些信息厦坛,我們的目標(biāo)還是要找到那個
堅果小人
的實現(xiàn)代碼五垮,帶著目標(biāo)繼續(xù)找下去吧 :)
下面呢,我們只能去找Application
的基類咯杜秸!Application
繼承自ApplicationProtocol
,看他的名字放仗,按照業(yè)界傳統(tǒng),應(yīng)該是個接口撬碟,在C++中呢诞挨,就叫抽象基類
莉撇,說白了就是定義了一些接口方法,讓繼承自它的類去實現(xiàn)吧惶傻。目標(biāo)鎖定ApplicationProtocol
,進(jìn)入相關(guān)的代碼文件中查看棍郎,不出所料,果然定義了一些純虛函數(shù):
如果你是個有心的人银室,有一個函數(shù)在我們前面的run
函數(shù)代碼分析中出現(xiàn)過涂佃,它就是:applicationDidFinishLauching
, 目標(biāo)回到原先的run
函數(shù),找到applicationDidFinishLaunching
, 根據(jù)我們的前面的分析蜈敢,這個函數(shù)是個接口辜荠,應(yīng)該在Application
或者AppDelegate
中實現(xiàn)。我們在AppDelegate
中找到了它的實現(xiàn)抓狭。(說實話伯病,我第一次看到這兒的時候,一下沒找到applicationDidFinishLaunching
的實現(xiàn)否过,我其實是打斷點調(diào)試找到了= =! 多虧了宇宙級IDE的幫助午笛,調(diào)試功能確實好用),我們把目標(biāo)定位到Appdelegate.cpp
中的applicationDidFinishLaunching
.
代碼實現(xiàn)比較復(fù)雜叠纹,簡單介紹一下季研,主要是先創(chuàng)建了一個 GLView,也就是顯示HelloWorld的那個窗口誉察,設(shè)置了窗口的一些參數(shù)与涡,最后幾行代碼是我著重要看的:
這段代碼創(chuàng)建了一個HelloWorld的場景(Scene),然后這個場景作為了
director
的方法runWithScene
的參數(shù)。具體看一下runWithScene
的實現(xiàn):兩句代碼:第一句將場景壓入場景棧(后續(xù)會詳細(xì)介紹場景類持偏,導(dǎo)演類驼卖,以及它們的組織方式),第二句開啟動畫鸿秆。沒有什么重要的信息酌畜,還是回到
HelloWorld
類的靜態(tài)方法createScene
方法中:
代碼也很簡單,創(chuàng)建了一個
Scene
和HelloWorld
層(Layer),然后將這個layer
加入到scene
中卿叽,并返回創(chuàng)建好的scene
桥胞。 下面我的目標(biāo),自然而然的就要定位到HelloWorld
的create
方法中了考婴,Alt+G
定位:
一個含有參數(shù)的宏贩虾,追蹤這個宏的定義:
略微有點復(fù)雜的函數(shù)宏,主要的工作是使用new
構(gòu)造了一個對象沥阱,然后調(diào)用了它的init
方法缎罢,之后將他加入自動釋放池(coco2d-x內(nèi)存管理的機(jī)制,后續(xù)會做詳細(xì)講解)〔呔看到這兒舰始,我們能大概明白了其中的原理,在coco2d-x中咽袜,推薦使用了一種構(gòu)造對象的方法:類自己提供一個靜態(tài)的create
方法丸卷,先new
出來一個對象,然后調(diào)用對象的init
方法询刹。那么及老,如果我們使用這CREATE_FUNC
宏的話,我們也必然要有一個成員函數(shù)virtual bool init()
了咯范抓!不啰嗦別的骄恶,我們就來找HelloWorld
的init
方法;找到代碼文件HelloWorldScene.cpp
,打開果然有init
方法匕垫。啊哈僧鲁!眾里尋他千百度,驀然回首象泵,原來都在init
處寞秃。在這里,創(chuàng)建了一系列的將要顯示在屏幕上的對象偶惠,看:
我們一直在尋找的那個堅果小人就在這里春寿,原來它是一張圖片!到這兒忽孽,我們終于可以長吁一口氣!
總結(jié)
我們找到了堅果小人的出處绑改,讓我們再來整理一下具體思路:
首先是main
函數(shù),從AppDelegate
構(gòu)造函數(shù)入手兄一,我們找到了它的基類Application
,找到了Application
的基類ApplicationProtocol
,找到了它提供的接口applicationDidFinishLaunching
, 然后我們回過去厘线,在AppDelegate
中找到了這個方法的實現(xiàn),在這個方法的最后幾行代碼中我們找到了關(guān)于HelloWorldScene
的創(chuàng)建出革,之后我們進(jìn)入HelloWorldScene
的createScene
方法中造壮,找到了相關(guān)的create
方法,create
方法是個宏函數(shù)骂束,它負(fù)責(zé)創(chuàng)建對象耳璧,然后調(diào)用對象的init
方法,所有的創(chuàng)建工作都在init
函數(shù)中展箱。那么是誰來調(diào)用applicationDidFinishLaunching
的呢旨枯?是main
中的run
函數(shù),在進(jìn)入游戲的主循環(huán)之前析藕,會調(diào)用applicationDidFinishLaunching
函數(shù)召廷,完成相關(guān)場景的布置,之后進(jìn)入游戲主循環(huán)账胧,在mainLoop
方法中進(jìn)行游戲場景的渲染和資源的釋放竞慢。OK题翰!一氣呵成斑举,大概摸清了整個過程,過程雖然冗長了些移迫,但是原理還是挺簡單的嘛居夹!
結(jié)尾
希望你的游戲開發(fā)之旅充滿快樂败潦,希望你和我一樣熱愛游戲,熱愛游戲開發(fā)准脂!
下回預(yù)告
在下一篇中劫扒,我們將會模仿HelloWorldScene
來自己實現(xiàn)一個簡單的,你喜歡的場景狸膏!