一般比較短小的音樂(如游戲中的打鬥、按鍵音效等)則要通過playEffect來播放。
上一節學習了使用Cocos2d-x播放音樂的方法,但是那種方法一般只適合於播放較大的音樂,而一般比較短小的音樂(如游戲中的打鬥、按鍵音效等)則要通過playEffect來播放。本節使用該方法以及之前學到的菜單按鈕的用法,製作了一個簡單的“鋼琴”游戲,其中部分代碼如範例3-8所示,完整代碼詳見源文件本章目錄下的ChapterThree06項目。
【範例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 點擊屏幕中的按鍵將播放音樂
播放這類較短音樂的方法與之前介紹的playBackgroundMusic方法是完全相同的,只不過要將方法名全部改為playEffect就可以了。
此外,由於這類音樂是要反覆播放的,比如在鋼琴中某個音符是要反覆被播放的,而游戲中某些怪物的叫聲也是要反覆出現的。如果每次要調用playEffect時都會重新對音樂文件進行載入,這就造成了資源浪費,因此可以在場景初始化的時候對這些文件進行一個統一的預載入,如範例第17~22行所示。
提示:實際上在使用playBackgroundMusic方法時也需要對音樂進行預載入,只不過在之前的範例中被簡化了。另外實際開發中還需要在程式退出時釋放載入了的音樂,釋放的方法為unloadEffect。
自學必備!!
《Cocos2d-x游戲開發實戰精解》學習筆記1--在Cocos2d中顯示圖像
《Cocos2d-x游戲開發實戰精解》學習筆記2--在Cocos2d-x中顯示一行文字
《Cocos2d-x游戲開發實戰精解》學習筆記3--在Cocos2d-x中播放聲音