生活随笔
收集整理的這篇文章主要介紹了
cocos2d-x游戏开发(二)开始菜单续
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
歡迎轉(zhuǎn)載:http://blog.csdn.net/fylz1125/article/details/8492497
上一篇文章已經(jīng)實現(xiàn)了MoonWarriors開始菜單的大部分元素,還差一個運動的飛船和一個點擊newGame的特效和音效。
1.飛船
[cpp]?view plaincopyprint?
?? ????CCTexture2D?*textCache?=?CCTextureCache::sharedTextureCache()->addImage(s_ship01);?? ????m_ship?=?CCSprite::createWithTexture(textCache,?CCRectMake(0,?45,?60,?38));?? ????this->addChild(m_ship,?0,?4);?? ????CCPoint?position?=?ccp(CCRANDOM_0_1()?*?winSize.width,?0);?? ????m_ship->setPosition(position);?? ????m_ship->runAction(CCMoveBy::create(2,?ccp(CCRANDOM_0_1()?*?winSize.width,?position.y?+?winSize.height?+?100)));??
這里的飛船就是一個sprite,后面我會建一個飛船的類,但這個只是一個Sprite。
緩存飛船圖片,create一個飛船,添加,設置位置,執(zhí)行動作。
在設置飛船位置的時候注意,每次飛船出來位置都是隨機的。引擎封裝了一個隨機函數(shù)CCRANDON_0_1(),這個是隨機一個0到1之間的float數(shù)。用一個MoveBy來實現(xiàn)飛船移動,同樣移動的目標點也有一定的隨機性。
你以為這樣就完了嗎,那你就錯了。所有的這些元素都在init()函數(shù)完成的,即使runAction了,也就只是執(zhí)行一次。
為了看到不斷有飛船在屏幕上飛,需要加點料。這里用schedule()函數(shù)來不斷更新。這個函數(shù)就是任務調(diào)度,每隔dt調(diào)用一次回調(diào)函數(shù),這里就是每0.1秒執(zhí)行update函數(shù)
[cpp]?view plaincopyprint?
this->schedule(schedule_selector(StartMenu::update),?0.1);??
然后看update的實現(xiàn)
[cpp]?view plaincopyprint?
if?(m_ship->getPosition().y?>?480)?{?? ????????CCPoint?pos?=?ccp(CCRANDOM_0_1()?*?winSize.width,?10);?? ????????m_ship->setPosition(pos);?? ????????m_ship->runAction(CCMoveBy::create(floor(5?*?CCRANDOM_0_1()),?ccp(CCRANDOM_0_1()?*?winSize.width,?pos.y?+?480)));?? ?????????? ????}??
飛船飛出屏幕后就重新設置其位置再執(zhí)行動作。
2.音效
這個很簡單,直接用了聲音引擎
[cpp]?view plaincopyprint?
SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.7);?? SimpleAudioEngine::sharedEngine()->playBackgroundMusic(s_mainMainMusic,?true);??
3.點擊特效
html5版的這個效果直接一個匿名函數(shù)搞定了,我不知道2dx怎么用一個回調(diào)搞定,就做了個特效類,專門來搞這個,嘿嘿。
記得前面有個flareEffec函數(shù),就是在這里處理的。
[cpp]?view plaincopyprint?
void?StartMenu::flareEffect(CCNode?*node)?? {?? ????onButtonEffect();?? ????Effect*?flareEffect?=?Effect::create();?? ????CCCallFunc?*callback?=??CCCallFunc::create(this,?callfunc_selector(StartMenu::newGame));?? ????flareEffect->flareEffect(this,?callback);?? }??
onButtonEffect是聲音特效,Effect就是用來做動畫特效的,關鍵就是其flareEffect函數(shù)。
[cpp]?view plaincopyprint?
void?Effect::flareEffect(CCNode?*parent,?CCCallFunc?*callback)?? {?? ?????? ????CCSprite?*flare?=?CCSprite::create(s_flare);?? ?????? ?????? ????ccBlendFunc?cbl?=?{GL_SRC_ALPHA,?GL_ONE};?? ????flare->setBlendFunc(cbl);?? ?????? ?????? ????parent->addChild(flare,?10);?? ?????? ?????? ????flare->setOpacity(0);?? ?????? ?????? ????flare->setPosition(ccp(-30,?297));?? ?????? ?????? ????flare->setRotation(-120);?? ?????? ?????? ????flare->setScale(0.2);?? ?????? ?????? ????CCActionInterval?*opacityAnim?=?CCFadeTo::create(0.5,?255);?? ????CCActionInterval?*opacDim?=?CCFadeTo::create(1,?0);?? ?????? ?????? ????CCActionInterval?*bigAnim?=?CCScaleBy::create(0.7,?1.2,?1.2);?? ?????? ?????? ????CCEaseSineOut?*biggerEase?=?CCEaseSineOut::create(bigAnim);?? ????CCActionInterval?*moveAnim?=?CCMoveBy::create(0.5,?ccp(328,?0));?? ????CCEaseSineOut?*moveEase?=?CCEaseSineOut::create(moveAnim);?? ?????? ?????? ????CCActionInterval?*roteAnim?=?CCRotateBy::create(2.5,?90);?? ?????? ?????? ????CCEaseExponentialOut?*?rotateEase?=?CCEaseExponentialOut::create(roteAnim);?? ?????? ?????? ????CCScaleTo?*bigger?=?CCScaleTo::create(0.5,?1);?? ?????? ?????? ????CCCallFuncN?*onComplete?=??CCCallFuncN::create(flare,?callfuncN_selector(Effect::killFlare));?? ?????? ?????? ????flare->runAction(CCSequence::create(opacityAnim,?biggerEase,?opacDim,?onComplete,?callback,??NULL));?? ????flare->runAction(moveEase);?? ????flare->runAction(rotateEase);?? ????flare->runAction(bigger);?? ?? }??
這個還是按照js的邏輯寫的。傳了一個parent的node和一個回調(diào)函數(shù)進來,然后一系列動作,最后執(zhí)行動作和回調(diào)。
回調(diào)函數(shù)里有個killFlare函數(shù),其實就是用來干掉這個特效精靈的,因為如果不干掉,會一直添加。
到這里,這個菜單的基本功能就做完了,還差一些回調(diào),狀態(tài)控制等沒有加,后續(xù)再來弄。
總結(jié)
以上是生活随笔為你收集整理的cocos2d-x游戏开发(二)开始菜单续的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。