上QQ阅读APP看书,第一时间看更新
3.6 实战:一个简单的钢琴
上一节学习了使用Cocos2d-x播放音乐的方法,但是该方法一般只适合于播放较大的音乐,而一般比较短小的音乐(如游戏中的打斗、按键音效等)则要通过playEffect来播放。本节使用该方法以及之前学到的菜单按钮的用法,制作了一个简单的“钢琴”游戏,其中部分代码如范例3-9所示,完整代码详见源文件本章目录下的ChapterThree06项目。
【范例3-9】利用Cocos2d-x实现简单的钢琴。
01 #include "HelloWorldScene.h" 02 #include "SimpleAudioEngine.h" //用于播放音乐 03 USING_NS_CC; 04 Scene* HelloWorld::createScene() 05 { 06 auto scene = Scene::create(); 07 auto layer = HelloWorld::create(); 08 scene->addChild(layer); 09 return scene; 10 } 11 bool HelloWorld::init() 12 { 13 if ( !Layer::init() ) 14 { 15 return false; 16 } 17 for (int i = 1; i <= 7; i++) //预加载7个音符的mp3文件 18 { 19 //分别使用SimpleAudioEngine加载每个音符的mp3文件 20 CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect( 21 String::createWithFormat("%d.mp3",i)->getCString()); 22 } 23 //通过按钮,创建7个琴键 24 auto* pButton1 = MenuItemImage::create("button1.png", 25 "button2.png", 26 this, 27 menu_selector(HelloWorld::note1)); 28 auto* button1 = Menu::create(pButton1, NULL); 29 button1->setPosition(50, 180); //设置按钮位置 30 addChild(button1); 31 /**此处省略了其他5个按钮的创建过程**/ 32 auto* pButton7 = MenuItemImage::create("button1.png", 33 "button2.png", 34 this, 35 menu_selector(HelloWorld::note7)); 36 auto* button7 = Menu::create(pButton7, NULL); 37 button7->setPosition(50 + 90 * 6, 180); //按钮x坐标为50+90*i其中i为按键编号减1 38 addChild(button7); 39 return true; 40 } 41 //第一个按键的响应操作,播放第1个音符 42 void HelloWorld::note1(Cocos2d::Object* pSender) 43 { 44 CocosDenshion::SimpleAudioEngine::sharedEngine()-> playEffect("1.mp3"); 45 } 46 //此处省略了其他5个音符的响应操作 47 void HelloWorld::note7(Cocos2d::Object* pSender) 48 { 49 CocosDenshion::SimpleAudioEngine::sharedEngine()-> playEffect("7.mp3"); 50 }
运行之后的界面如图3-13所示。当用户单击按键时按键将发生变化,并播放对应音符的声音效果,如图3-14所示。
图3-13 “钢琴”界面
图3-14 单击屏幕中的按键将播放音乐
播放这类较短音乐的方法与之前介绍的playBackgroundMusic方法是完全相同的,只不过要将方法名全部改为playEffect就可以了。
此外,由于这类音乐是要反复播放的,比如在钢琴中某个音符是要反复被播放的,而游戏中某些怪物的叫声也是要反复出现的。如果每次要调用playEffect时都会重新对音乐文件进行加载,这就造成了资源浪费,因此可以在场景初始化时对这些文件进行一个统一的预加载,如范例第17~22行所示。
注意:实际上在使用playBackgroundMusic方法时也需要对音乐进行预加载,只不过在之前的范例中被简化了。另外实际开发中还需要在程序退出时释放加载了的音乐,释放的方法为unloadEffect。