日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cocos2d-x游戏开发(十)执行单元场景CCScene

發布時間:2024/4/11 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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?
  • void?CCDisplayLinkDirector::mainLoop(void)??
  • {??
  • ????if?(m_bPurgeDirecotorInNextLoop)??
  • ????{??
  • ????????m_bPurgeDirecotorInNextLoop?=?false;??
  • ????????purgeDirector();??
  • ????}??
  • ????else?if?(!?m_bInvalid)??
  • ?????{??
  • ?????????drawScene();//?注意這里就是畫場景了??
  • ???????
  • ?????????//?release?the?objects??
  • ?????????CCPoolManager::sharedPoolManager()->pop();??????????
  • ?????}??
  • }??

  • 跟進drawScene()看看怎么畫的

    [cpp]?view plaincopyprint?
  • void?CCDirector::drawScene(void)??
  • {??
  • ????//?calculate?"global"?dt??
  • ????calculateDeltaTime();??
  • ??
  • ????//tick?before?glClear:?issue?#533??
  • ????if?(!?m_bPaused)??
  • ????{??
  • ????????m_pScheduler->update(m_fDeltaTime);//按照優先級調度update函數(每個節點都有這么個函數)??
  • ????}??
  • ??
  • ????glClear(GL_COLOR_BUFFER_BIT?|?GL_DEPTH_BUFFER_BIT);??
  • ??
  • ????/*?to?avoid?flickr,?nextScene?MUST?be?here:?after?tick?and?before?draw.?
  • ?????XXX:?Which?bug?is?this?one.?It?seems?that?it?can't?be?reproduced?with?v0.9?*/??
  • ????if?(m_pNextScene)?//?這個變量存下次繪制的場景,本次繪制則是上一次設置的場景??
  • ????{??
  • ????????setNextScene();//?注意這個,不要被名字誤導,其實就是設置下一次要運行的場景??
  • ????}??
  • ??
  • ????kmGLPushMatrix();??
  • ??
  • ????//?draw?the?scene??
  • ????if?(m_pRunningScene)??
  • ????{??
  • ????????m_pRunningScene->visit();//?注意看這里,這個visit函數就是遞歸繪制子節點??
  • ????}??
  • ??
  • ????//?draw?the?notifications?node??
  • ????if?(m_pNotificationNode)??
  • ????{??
  • ????????m_pNotificationNode->visit();??
  • ????}??
  • ??????
  • ????if?(m_bDisplayStats)??
  • ????{??
  • ????????showStats();??
  • ????}??
  • ??
  • ????kmGLPopMatrix();??
  • ??
  • ????m_uTotalFrames++;??
  • ??
  • ????//?swap?buffers??
  • ????if?(m_pobOpenGLView)??
  • ????{??
  • ????????m_pobOpenGLView->swapBuffers();??
  • ????}??
  • ??????
  • ????if?(m_bDisplayStats)??
  • ????{??
  • ????????calculateMPF();??
  • ????}??
  • }??

  • 好,看注釋,有個visit函數,這個就是遞歸繪制子節點的

    [cpp]?view plaincopyprint?
  • void?CCNode::visit()??
  • {??
  • ????//?quick?return?if?not?visible.?children?won't?be?drawn.??
  • ????if?(!m_bVisible)??
  • ????{??
  • ????????return;??
  • ????}??
  • ????kmGLPushMatrix();??
  • ??
  • ?????if?(m_pGrid?&&?m_pGrid->isActive())??
  • ?????{??
  • ?????????m_pGrid->beforeDraw();??
  • ?????}??
  • ??
  • ????this->transform();??
  • ??
  • ????CCNode*?pNode?=?NULL;??
  • ????unsigned?int?i?=?0;??
  • ??
  • ????if(m_pChildren?&&?m_pChildren->count()?>?0)//這里開始,如果有子節點就進入??
  • ????{??
  • ????????sortAllChildren();//?按z坐標排序,就是z序排列子節點??
  • ????????//?draw?children?zOrder?<?0??
  • ????????ccArray?*arrayData?=?m_pChildren->data;??
  • ????????for(?;?i?<?arrayData->num;?i++?)//畫z序<0的子節點??
  • ????????{??
  • ????????????pNode?=?(CCNode*)?arrayData->arr[i];??
  • ??
  • ????????????if?(?pNode?&&?pNode->m_nZOrder?<?0?)???
  • ????????????{??
  • ????????????????pNode->visit();??
  • ????????????}??
  • ????????????else??
  • ????????????{??
  • ????????????????break;??
  • ????????????}??
  • ????????}??
  • ????????//?self?draw??
  • ????????this->draw();?//?畫自己??
  • ??
  • ????????for(?;?i?<?arrayData->num;?i++?)??
  • ????????{??
  • ????????????pNode?=?(CCNode*)?arrayData->arr[i];??
  • ????????????if?(pNode)??
  • ????????????{??
  • ????????????????pNode->visit();??
  • ????????????}??
  • ????????}??????????
  • ????}??
  • ????else??
  • ????{??
  • ????????this->draw();?//?沒有子節點就畫自己??
  • ????}??
  • ??
  • ????//?reset?for?next?frame??
  • ????m_uOrderOfArrival?=?0;??
  • ??
  • ?????if?(m_pGrid?&&?m_pGrid->isActive())??
  • ?????{??
  • ?????????m_pGrid->afterDraw(this);??
  • ????}??
  • ???
  • ????kmGLPopMatrix();??
  • }??

  • 這個是主循環的,但是要運行一個場景是從哪開始的呢,比如

    [cpp]?view plaincopyprint?
  • CCScene?*pScene?=?HelloWorld::scene();??
  • ??
  • ????//?run??
  • ????pDirector->runWithScene(pScene);??

  • 看,第一個場景從這里開始的,跟進

    [cpp]?view plaincopyprint?
  • void?CCDirector::runWithScene(CCScene?*pScene)??
  • {??
  • ????CCAssert(pScene?!=?NULL,?"This?command?can?only?be?used?to?start?the?CCDirector.?There?is?already?a?scene?present.");??
  • ????CCAssert(m_pRunningScene?==?NULL,?"m_pRunningScene?should?be?null");//?當前運行為NULL(第一次)??
  • ??
  • ????pushScene(pScene);//?push是什么呢??
  • ????startAnimation();?//?這里控制幀率,同時又進入主循環??
  • }??

  • 看這個pushScene函數,是干什么的

    [cpp]?view plaincopyprint?
  • void?CCDirector::pushScene(CCScene?*pScene)??
  • {??
  • ????CCAssert(pScene,?"the?scene?should?not?null");??
  • ??
  • ????m_bSendCleanupToScene?=?false;??
  • ??
  • ????m_pobScenesStack->addObject(pScene);//?當前scene入棧??
  • ????m_pNextScene?=?pScene;?//?next?Scene,就是下一次繪制當前scene??
  • }??


  • 好了,這個pushScene干了兩件事,將要繪制的scene入棧,將下次要繪制的場景設為pScene。這個函數返回后接著是

    startAnimation(),這個函數調整幀率然后再次進入主循環。

    再回頭看看主循環的drawScene()函數(上面有),其中有段:

    [cpp]?view plaincopyprint?
  • if?(m_pNextScene)//?剛才的pushScene函數設置了這個值??
  • {??
  • ????setNextScene();?//?將下個要運行的Scene給m_pRunningScene??
  • }??
  • ??
  • kmGLPushMatrix();??
  • ??
  • //?draw?the?scene??
  • if?(m_pRunningScene)?//?這里開始渲染當前要運行的Scene??
  • {??
  • ????m_pRunningScene->visit();??
  • }??

  • 看代碼有點繞,其實就是一個迭代過程。最開始第一次m_pRunningScene是NULL,然后 runWithScene后就有了,m_pRunningScene就是你傳進去的Scene,不過是在下次循環繪制運行。這里有兩個過程,一個就是runWithScene函數和replaceScene函數,這兩個函數都會設置下個Scene,同時將要運行的Scene入棧。然后進入主循環,在主循環中每次都會檢測當前要運行的Scene,如果有就渲染執行。就是這么一個過程。

    導演每次只能執行一個場景,執行并不僅僅是繪制,還包括其動作,回調,過渡等。每個場景實質上是一個CCNode,

    前面講過,CCNode有個很重要的成員變量m_pChildren,這是一個CCArray,用來存放添加到該節點的子節點。Scene在渲染的時候會遞歸渲染其子節點,這就組成一個渲染鏈,保證整個場景的所有元素都會被渲染。

    總結

    以上是生活随笔為你收集整理的cocos2d-x游戏开发(十)执行单元场景CCScene的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 不卡一二三| 肉色丝袜脚交一区二区 | 欧美一线高本道 | 久久国产主播 | 奇米影视第四色888 免费观看a毛片 | 欧美专区在线 | 久久久九九 | 99热在 | 日韩美一区二区 | 日韩黄色精品视频 | 国产免费视频一区二区三区 | 久久久亚洲一区 | 亚洲s码欧洲m码国产av | 天堂аⅴ在线最新版在线 | 久久精品成人一区二区三区蜜臀 | 中文字幕人妻一区二区三区视频 | 亚洲电影影音先锋 | 国产精品久久久久久亚洲色 | 一级黄色片免费看 | 黄色一级小说 | 欧美伦理片 | 亚洲天堂性| 奇米影视第四色777 波多野结衣一区二区三区免费视频 | 日韩专区视频 | 午夜色播| 99re视频在线播放 | 久热99| 久久网国产| 国产免费自拍 | 国偷自产av一区二区三区 | 欧美日韩在线播放三区四区 | 无码人妻一区二区三区在线 | 无码免费一区二区三区免费播放 | 舐め犯し波多野结衣在线观看 | 国产成人精品亚洲 | 日日狠狠久久偷偷四色综合免费 | 国产精品女人久久久 | av在线天堂网 | 中文在线字幕免费观看电 | 国产精品人人妻人人爽人人牛 | 亚洲色图校园春色 | 欧美性猛交xxxx乱大交3 | 精品人妻伦一区二区三区久久 | 9·1·黄·色·视·频 | 韩国一级片在线观看 | 国产乱真实合集 | av在线免费网站 | 高清免费毛片 | 亚洲 日本 欧美 中文幕 | 日本xxxxxxxxx69 | 日韩18p| 无码国模国产在线观看 | 天堂中文视频在线 | 人日人视频| 亚洲国产精品久久 | 久久无吗视频 | 一区视频在线免费观看 | eeuss鲁片一区二区三区在线观看 | 日韩一区不卡视频 | 国产黄片一区二区三区 | 国产无码精品合集 | 2018国产大陆天天弄 | 欧美国产精品一区二区三区 | 国产成人短视频在线观看 | 手机在线观看免费av | 瑟瑟视频在线观看 | 亚洲色婷婷久久精品av蜜桃 | 成人女同在线观看 | 国产一区二区在线播放视频 | 激情国产精品 | 日韩精品一区二区三区中文字幕 | 黄色小视频网 | 欧美性猛交ⅹxx乱大交 | 国产精品欧美性爱 | 人妻91麻豆一区二区三区 | 香蕉国产片 | 久久综合伊人77777蜜臀 | 污污污污污污www网站免费 | 日本欧美激情 | 亚洲三级久久 | 99在线成人精品视频 | 法国极品成人h版 | 91免费短视频 | 午夜寂寞影院在线观看 | 亚洲成人免费在线视频 | 91精品视频一区 | 国产二区av | brazzers欧美极品少妇 | 天天av天天干 | 人人妻人人澡人人爽欧美一区双 | 日韩亚洲影院 | 国产精品9191| 国产福利一区在线 | 欧美三极片 | 午夜精品一区二区三区在线 | 国产无遮挡一区二区三区毛片日本 | 欧美亚洲另类图片 | 欧美综合激情网 | 91蝌蚪视频在线 |