上一節學習了使用Cocos2d-x播放音樂的方法,可是那種方法通常只適合於播放較大的音樂,而通常比較短小的音樂(如遊戲中的打鬥、按鍵音效等)則要經過playEffect來播放。本節使用該方法以及以前學到的菜單按鈕的用法,製做了一個簡單的「鋼琴」遊戲,其中部分代碼如範例3-8所示,完整代碼詳見源文件本章目錄下的ChapterThree06項目。 segmentfault
【範例3-8 利用Cocos2d-x實現簡單的鋼琴】學習
#include "HelloWorldScene.h" #include "SimpleAudioEngine.h" //用於播放音樂 USING_NS_CC; Scene* HelloWorld::createScene() { auto scene = Scene::create(); auto layer = HelloWorld::create(); scene->addChild(layer); return scene; } bool HelloWorld::init() { if ( !Layer::init() ) { return false; } for (int i = 1; i <= 7; i++) //預加載7個音符的mp3文件 { CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect( String::createWithFormat("%d.mp3",i)->getCString()); } //經過按鈕,建立7個琴鍵 auto* pButton1 = MenuItemImage::create("button1.png", "button2.png", this,menu_selector(HelloWorld::note1)); auto* button1 = Menu::create(pButton1, NULL); button1->setPosition(50, 180); //設置按鈕位置 addChild(button1); /**此處省略了其餘5個按鈕的建立過程**/ auto* pButton7 = MenuItemImage::create("button1.png", "button2.png", this, menu_selector(HelloWorld::note7)); auto* button7 = Menu::create(pButton7, NULL); button7->setPosition(50 + 90 * 6, 180); //按鈕x座標爲 50+90*i其中i爲按鍵編號減1 addChild(button7); return true; } //第一個按鍵的響應操做,播放第1個音符 void HelloWorld::note1(Cocos2d::Object* pSender) { CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("1.mp3"); } //此處省略了其餘5個音符的響應操做 void HelloWorld::note7(Cocos2d::Object* pSender) { CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("7.mp3"); }
運行以後的界面如圖3-13所示。當用戶點擊按鍵時按鍵將發生變化,並播放對應音符的聲音效果。
圖3-13 「鋼琴」界面
圖3-14 點擊屏幕中的按鍵將播放音樂this
播放這類較短音樂的方法與以前介紹的playBackgroundMusic方法是徹底相同的,只不過要將方法名所有改成playEffect就能夠了。spa
此外,因爲這類音樂是要反覆播放的,好比在鋼琴中某個音符是要反覆被播放的,而遊戲中某些怪物的叫聲也是要反覆出現的。若是每次要調用playEffect時都會從新對音樂文件進行加載,這就形成了資源浪費,所以能夠在場景初始化的時候對這些文件進行一個統一的預加載,如範例第17~22行所示。code
提示:實際上在使用playBackgroundMusic方法時也須要對音樂進行預加載,只不過在以前的範例中被簡化了。另外實際開發中還須要在程序退出時釋放加載了的音樂,釋放的方法爲unloadEffect。orm
《Cocos2d-x遊戲開發實戰精解》學習筆記1--在Cocos2d中顯示圖像
《Cocos2d-x遊戲開發實戰精解》學習筆記2--在Cocos2d-x中顯示一行文字
《Cocos2d-x遊戲開發實戰精解》學習筆記3--在Cocos2d-x中播放聲音遊戲