上一节学习了使用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中播放声音游戏