cocos2d-x游戏开发(十)执行单元场景CCScene
歡迎轉載:http://blog.csdn.net/fylz1125/article/details/8524081
游戲邏輯其實就像拍攝一部電影,整個過程都由導演來驅動。
游戲中的一個一個關卡,一個一個場景都跟電影中類似。每一個場景都有一些特定的元素,比如林沖風雪山神廟這個場景,大環境就是一個大風雪的夜晚,一個銀裝素裹的破敗山頭,有一個破敗的山神廟,當然還可以有一些其他的元素,比如火光,野狼,燈光, 烏鴉連聲叫、黃狗大聲吼等。這就是一個特定的場景了,呵呵。然后導演大叫一聲:“Action!”,然后所有的故事情節就在這里展開,主角和一干配角上場了...
以上所有的元素就組成了這么一個場景,那么在游戲里又如何組織這些元素呢。先來看看cocos2d-x的場景處理流程。
cocos2d-x中的導演執行單元就是場景CCScene。一個場景又有那么多元素,比如一個大的背景,然后又有一些小元素,比如星星,火堆,狗等,又是如何加到場景里的呢。
可以這么說,一個場景就是一個特別的容器(其實就是一個CCNode),它能容納各類節點(通過addChild)。那么跟電影一樣,鏡頭一出來先有一個大的環境。這個就是主背景層(CCLayer),對,就是CCLayer(怎么翻譯好一點)。然后在這個主Layer里面再添加一些其他的元素,比如人物、火堆、狂奔的大狗、清唱的小鳥等。這些元素都是獨立的對象(繼承CCSprite),他們都有各自的屬性和行為,比如人物是一個男人,他在漫無目的的行走,火堆在燃燒放出一跳一跳的火光,狗在奔跑,鳥在飛來飛去等。所有這些元素都添加到主Layer里面,然后這個主Layer又被添加都場景里面(CCScene),最后導演執行這個場景(pDirector->runWithScene(pScene)),一個畫面就出來了。
來看一看代碼級別的執行過程:
主循環(不知道的看我前面的文章)
[cpp]?view plaincopyprint?
跟進drawScene()看看怎么畫的
[cpp]?view plaincopyprint?
好,看注釋,有個visit函數,這個就是遞歸繪制子節點的
[cpp]?view plaincopyprint?
這個是主循環的,但是要運行一個場景是從哪開始的呢,比如
[cpp]?view plaincopyprint?
看,第一個場景從這里開始的,跟進
[cpp]?view plaincopyprint?
看這個pushScene函數,是干什么的
[cpp]?view plaincopyprint?
好了,這個pushScene干了兩件事,將要繪制的scene入棧,將下次要繪制的場景設為pScene。這個函數返回后接著是
startAnimation(),這個函數調整幀率然后再次進入主循環。
再回頭看看主循環的drawScene()函數(上面有),其中有段:
[cpp]?view plaincopyprint?
看代碼有點繞,其實就是一個迭代過程。最開始第一次m_pRunningScene是NULL,然后 runWithScene后就有了,m_pRunningScene就是你傳進去的Scene,不過是在下次循環繪制運行。這里有兩個過程,一個就是runWithScene函數和replaceScene函數,這兩個函數都會設置下個Scene,同時將要運行的Scene入棧。然后進入主循環,在主循環中每次都會檢測當前要運行的Scene,如果有就渲染執行。就是這么一個過程。
導演每次只能執行一個場景,執行并不僅僅是繪制,還包括其動作,回調,過渡等。每個場景實質上是一個CCNode,
前面講過,CCNode有個很重要的成員變量m_pChildren,這是一個CCArray,用來存放添加到該節點的子節點。Scene在渲染的時候會遞歸渲染其子節點,這就組成一個渲染鏈,保證整個場景的所有元素都會被渲染。
總結
以上是生活随笔為你收集整理的cocos2d-x游戏开发(十)执行单元场景CCScene的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cocos2d-x游戏开发(九)重要的基
- 下一篇: cocos2d-x游戏开发(十一)细说场