使用3.0实现微信打飞机——13.添加声音
2014-08-21 15:37
471 查看
一款好的游戏没有声音怎么可以呢,所以一定要为我们的飞机添加上声音,这样玩起来才有玩头嘛!今天试一下3.0的声音引擎,发现播放声音的时候总是有延迟的现象发生,但是在初始化的时候是预先加载了声音的,跟进预先加载背景音乐的函数一看是空的实现,但是音效的预先加载并不是空的实现,在win32上测试的时候虽然预先加载了声音但是播放延迟的问题是没法解决的,最后游戏添加了声音在win32下变的有点卡(在游戏主场景中有点卡)。但是移植到android平台的时候一切正常,背景音乐和音效的播放没有出现延迟的问题,游戏也很流畅,所以,我觉得引擎在win32平台下对声音的处理不是很好,或许是我的方法有错,大家看看代码吧,如果你有什么发现就留言吧。
上边就是声音处理的类,在构造函数中先预先加载一些声音文件,通过getEffect和getMusic函数获取不同平台下的声音文件,我都是使用的mp3格式的文件就没有写相关的代码了,获取不同平台下的文件可以参考我getMusic的前几行代码。接下来就是调用了,大家在用到的地方去调用播放声音的函数吧,这里我把暂停处对声音的处理拿出来做一个范例。
版权声明:本文由(
小塔 )原创,转载请保留文章出处!
本文链接:http://www.zaojiahua.com/adding-sound.html
1 | #ifndef _SOUND_H_ |
2 | #define _SOUND_H_ |
3 | #include "cocos2d.h" |
4 | //声音引擎 |
5 | #include "SimpleAudioEngine.h" |
6 |
7 | USING_NS_CC; |
8 | using namespace CocosDenshion; |
9 |
10 | //把用到的音乐做为枚举类型 |
11 | enum MUSIC_TYPE |
12 | { |
13 | //游戏的背景音乐 game_music.mp3 |
14 | MUSIC_TYPE_BACKGROUND, |
15 | //最大的敌机飞行时候的背景音乐 big_spaceship_flying.mp3 |
16 | MUSIC_TYPE_BIG_SPACESHIP_FLYING, |
17 | }; |
18 |
19 | //把用到的音乐做为枚举类型 |
20 | enum EFFECT_TYPE |
21 | { |
22 | //单击菜单按钮时候的音效 button.mp3 |
23 | EFFECT_TYPE_BUTTON, |
24 | //发射子弹时候的音效 bullet.mp3 |
25 | EFFECT_TYPE_BULLET, |
26 | //敌机炸毁的音效 enemy1_down.mp3 enemy2_down.mp3 enemy3_down.mp3 |
27 | EFFECT_TYPE_ENEMY1_DOWN, |
28 | EFFECT_TYPE_ENEMY2_DOWN, |
29 | EFFECT_TYPE_ENEMY3_DOWN, |
30 | //游戏结束 game_over.mp3 |
31 | EFFECT_TYPE_GAME_OVER, |
32 | //获得UFO道具 get_double_laser.mp3 |
33 | EFFECT_TYPE_GET_UFO, |
34 | //道具出来时候的音效 out_porp.mp3 |
35 | EFFECT_TYPE_OUT_PORP |
36 | }; |
37 |
38 | //声音处理类 |
39 | class Sound |
40 | { |
41 | public : |
42 | static Sound * getInstance(); |
43 | static void freeInstance(); |
44 | private : |
45 | static Sound * m_sound; |
46 | Sound(); |
47 | //根据不同的音乐和音效类型获得相应平台下的文件 |
48 | char * getMusic(MUSIC_TYPE type); |
49 | char * getEffect(EFFECT_TYPE type); |
50 | public : |
51 | //声音的播放和停止 |
52 | void playEffect(EFFECT_TYPE type); |
53 | void playBgMusic(MUSIC_TYPE type); |
54 | }; |
55 |
56 | #endif |
1 | #include "Sound.h" |
2 |
3 | Sound * Sound::m_sound = NULL; |
4 |
5 | Sound * Sound::getInstance() |
6 | { |
7 | if (m_sound == NULL) |
8 | { |
9 | m_sound = new Sound(); |
10 | } |
11 |
12 | return m_sound; |
13 | } |
14 |
15 | void Sound::freeInstance() |
16 | { |
17 | if (m_sound != NULL) |
18 | { |
19 | delete m_sound; |
20 | m_sound = NULL; |
21 | } |
22 | } |
23 |
24 | Sound::Sound() |
25 | { |
26 | //预先加载声音,参数是声音文件 |
27 | auto audio = SimpleAudioEngine::getInstance(); |
28 | //预先加载音乐的函数在win32下是空的实现 播放的效果是滞后的 在android上没有问题 |
29 | audio->preloadBackgroundMusic(getMusic(MUSIC_TYPE_BACKGROUND)); |
30 | audio->preloadBackgroundMusic(getMusic(MUSIC_TYPE_BIG_SPACESHIP_FLYING)); |
31 | //加载音效 在win32下加载音效没有什么效果,播放出来是滞后的,但是在android上没有滞后的问题 |
32 | audio->preloadEffect(getEffect(EFFECT_TYPE_BULLET)); |
33 | audio->preloadEffect(getEffect(EFFECT_TYPE_BUTTON)); |
34 | audio->preloadEffect(getEffect(EFFECT_TYPE_ENEMY1_DOWN)); |
35 | audio->preloadEffect(getEffect(EFFECT_TYPE_ENEMY2_DOWN)); |
36 | audio->preloadEffect(getEffect(EFFECT_TYPE_ENEMY3_DOWN)); |
37 | audio->preloadEffect(getEffect(EFFECT_TYPE_GAME_OVER)); |
38 | audio->preloadEffect(getEffect(EFFECT_TYPE_GET_UFO)); |
39 | audio->preloadEffect(getEffect(EFFECT_TYPE_OUT_PORP)); |
40 | //设置声音的大小0.0-1.0 在win32下也是空的实现 |
41 | audio->setBackgroundMusicVolume(0.5f); |
42 | } |
43 |
44 | //获取音效和音乐的文件 |
45 | char * Sound::getMusic(MUSIC_TYPE type) |
46 | { |
47 | switch (type) |
48 | { |
49 | case MUSIC_TYPE_BACKGROUND: |
50 | //获取不同平台下的文件 |
51 | #if(CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) |
52 | return "sound/game_music.mp3" ; |
53 | #elif(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) |
54 | return "sound/game_music.mp3" ; |
55 | #endif |
56 | break ; |
57 | case MUSIC_TYPE_BIG_SPACESHIP_FLYING: |
58 | return "sound/big_spaceship_flying.mp3" ; |
59 | break ; |
60 | } |
61 | return NULL; |
62 | } |
63 |
64 | char * Sound::getEffect(EFFECT_TYPE type) |
65 | { |
66 | switch (type) |
67 | { |
68 | case EFFECT_TYPE_BUTTON: |
69 | return "sound/button.mp3" ; |
70 | break ; |
71 | case EFFECT_TYPE_BULLET: |
72 | return "sound/bullet.mp3" ; |
73 | break ; |
74 | case EFFECT_TYPE_ENEMY1_DOWN: |
75 | return "sound/enemy1_down.mp3" ; |
76 | break ; |
77 | case EFFECT_TYPE_ENEMY2_DOWN: |
78 | return "sound/enemy2_down.mp3" ; |
79 | break ; |
80 | case EFFECT_TYPE_ENEMY3_DOWN: |
81 | return "sound/enemy3_down.mp3" ; |
82 | break ; |
83 | case EFFECT_TYPE_GAME_OVER: |
84 | return "sound/game_over.mp3" ; |
85 | break ; |
86 | case EFFECT_TYPE_GET_UFO: |
87 | return "sound/get_double_laser.mp3" ; |
88 | break ; |
89 | case EFFECT_TYPE_OUT_PORP: |
90 | return "sound/out_porp.mp3" ; |
91 | break ; |
92 | default : |
93 | return NULL; |
94 | } |
95 | } |
96 |
97 | //播放音乐和音效 |
98 | void Sound::playEffect(EFFECT_TYPE type) |
99 | { |
100 | auto audio = SimpleAudioEngine::getInstance(); |
101 | audio->playEffect( this ->getEffect(type)); |
102 | } |
103 |
104 | void Sound::playBgMusic(MUSIC_TYPE type) |
105 | { |
106 | auto audio = SimpleAudioEngine::getInstance(); |
107 | if (!audio->isBackgroundMusicPlaying()) |
108 | { |
109 | audio->playBackgroundMusic( this ->getMusic(type), true ); |
110 | } |
111 | else |
112 | { |
113 | audio->resumeBackgroundMusic(); |
114 | } |
115 | } |
1 | //对声音的处理 UILayer中暂停按钮按下的时候 |
2 | SimpleAudioEngine::getInstance()->pauseBackgroundMusic(); |
1 | auto sound = Sound::getInstance(); |
2 | auto callback = [& sound](Ref * ref) |
3 | { |
4 | sound->playEffect(EFFECT_TYPE_BUTTON); |
5 | //恢复背景音乐 Pause中恢复场景的时候调用 |
6 | sound->playBgMusic(MUSIC_TYPE_BACKGROUND); |
7 | //弹出保存的场景 |
8 | Director::getInstance()->popScene(); |
9 | }; |
版权声明:本文由(
小塔 )原创,转载请保留文章出处!
本文链接:http://www.zaojiahua.com/adding-sound.html
相关文章推荐
- 使用3.0实现微信打飞机——7.贝塞尔曲线和添加UFO
- 使用3.0实现微信打飞机——3.添加玩家飞机
- 使用3.0实现微信打飞机——5.添加子弹及管理器
- 使用3.0实现微信打飞机——4.添加敌机
- 使用3.0实现微信打飞机——9.通过截屏实现暂停功能
- 使用3.0实现微信打飞机——14.终结篇
- 使用3.0实现微信打飞机——6.碰撞检测
- 使用3.0实现微信打飞机——11.分数排行榜的实现
- 使用3.0实现微信打飞机——2.滚动地图
- 使用3.0实现微信打飞机——8.改变玩家技能
- 使用3.0实现微信打飞机——12.游戏结束场景
- 使用3.0实现微信打飞机——10.用户数据的操作
- 使用3.0实现微信打飞机——1.游戏开始场景
- 使用大数据分析+AI+图片动态处理实现“朋友圈@微信官方头像添加圣诞帽”
- Ajax 和 XML: 使用 Ajax 实现打分评级和添加评论功能
- 图形的绘制,如何使用自定义画笔(颜色,线宽,线形)。如何为程序中添加选项菜单和选项设置对话框,如何使用标准颜色对话框,如何使用字体对话框,在选项对话框中实现预览功能。实现选项对话框和窗口类中的数据交换。如何改变对话框和控件的背景色,如何改变控件的文本颜色,
- 【视频】配置信息管理 的 使用方法(六):实现添加、修改、查询
- 使用jquery实现表格的动态添加和删除
- 通过XACT添加声音——使用XACT
- 使用OpenLayers实现一个在鼠标点击处添加标记的效果