Cocos2d-x游戏开发实战精解
上QQ阅读APP看书,第一时间看更新

3.5 在Cocos2d-x中播放声音

之前的内容主要都是介绍如何在屏幕上显示图像,事实上除了图像之外,音乐的播放也可以被理解为一种显示的方式,本节将学习在Cocos2d-x中播放声音的方法。

(1)在HelloWorld.h中对HelloWorld类进行如下定义:

01 class HelloWorld : public Cocos2d::Layer
02      {
03      public:
04              bool is_paused;
05          static Cocos2d::Scene* createScene();
06          virtual bool init();
07              void play(Cocos2d::Object* pSender);            //播放音乐
08              void stop(Cocos2d::Object* pSender);            //停止音乐
09              void pause(Cocos2d::Object* pSender);           //暂停
10          CREATE_FUNC(HelloWorld);
11      };

(2)在HelloWorldScene.cpp中实现这些方法,如范例3-8所示,完整代码可见源文件本章目录下的项目ChapterThree05。

【范例3-8】在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              is_paused = false;
18              //播放按钮
19              auto* label_play = Label::create("play", "Arial", 40);
20              auto* pLabel_play = MenuItemLabel::create(label_play, this, 
                menu_selector(HelloWorld::play));
21              auto* button_play = Menu::create(pLabel_play, NULL);
22              button_play->setPosition(160,180);
23              addChild(button_play);
24              //暂停按钮
25              auto* label_pause = Label::create("pause", "Arial", 40);
26              auto* pLabel_pause = MenuItemLabel::create(label_pause, this, 
                menu_selector(HelloWorld::pause));
27              auto* button_pause = Menu::create(pLabel_pause, NULL);
28              button_pause->setPosition(320,180);
29              addChild(button_pause);30
30              //停止按钮
31              auto* label_stop = Label::create("stop", "Arial", 40);
32              auto* pLabel_stop = MenuItemLabel::create(label_stop, this, 
                menu_selector(HelloWorld::stop));
33              auto* button_stop = Menu::create(pLabel_stop, NULL);
34              button_stop->setPosition(480,180);
35              addChild(button_stop);
36              return true;
37      }
38      void HelloWorld::play(Cocos2d::Object* pSender)
39      {       //如果背景音乐被暂停则继续播放
40              if (is_paused)
41              {
42                      CocosDenshion::SimpleAudioEngine::sharedEngine()->
                        resumeBackgroundMusic();
43              }
44              else
45              {       //否则重新播放
46                      CocosDenshion::SimpleAudioEngine::sharedEngine()->
                        playBackgroundMusic("music.mp3");
47              }
48              is_paused = false;
49      }
50      void HelloWorld::stop(Cocos2d::Object* pSender)
51      {       //停止音乐
52              is_paused = false;
53              CocosDenshion::SimpleAudioEngine::sharedEngine()->
                stopBackgroundMusic();
54      }
55      void HelloWorld::pause(Cocos2d::Object* pSender)
56      {       //暂停播放音乐
57              is_paused = true;
58              CocosDenshion::SimpleAudioEngine::sharedEngine()->
                pauseBackgroundMusic();
59      }

本例运行后的界面如图3-12所示,单击屏幕上的3个标签按钮则会执行音乐的播放、暂停等操作。

图3-12 可以单击按钮进行音乐的播放暂停等操作

在使用Cocos2d-x播放音乐时需要引入文件SimpleAudioEngine.h(如范例第02行所示),之后就可以使用如范例第42、46、53、58行所示的代码来对音乐进行操作了。因为代码非常简单,这里便不再做太多介绍了。

现在需要读者思考一个问题,为什么在播放音乐时使用的方法是playBackgroundMusic而不是playMusic?Background是背景的意思,是不是说这个方法只能用来播放背景音乐?那么什么音乐不是背景音乐呢?

实际上该方法是可以播放任何音乐的,但是比较适合播放大段的音乐,而在游戏中大段的音乐常常被用来作为背景音乐使用。在游戏中一些短小的音乐(如怪物的叫声、打斗声等)则是要通过其他方法来播放的,这些内容将在下一节介绍。