[Cocos2D-x For WP8]CocosDenshion音频播放
Cocos2D-x的音频分为长时间的背景音乐和短的音效两种,我们可以通过SimpleAudioEngine::sharedEngine()方法来获取音频播放的引擎,然后调用对音频相关的操作方法就可以了,那么这个是非常简单的。
在Cocos2D-x For WP8里面的要使用音频播放的API,我们需要把CocosDenshion这个项目添加到我们的游戏项目里面去,然后添加引用。如下图所示:
需要注意的是如果发现在编译的时候会出现下面的错误,那么通常是因为没有添加CocosDenshionWindowsPhone.lib链接库。
错误 306 error LNK2019: unresolved external symbol "__declspec(dllimport) public: static class CocosDenshion::SimpleAudioEngine * __cdecl CocosDenshion::SimpleAudioEngine::sharedEngine(void)" (__imp_?sharedEngine@SimpleAudioEngine@CocosDenshion@@SAPAV12@XZ) referenced in function __unwind$26 F:\coco2d\cocos2dx-win8-wp8_v2\cocos2dx-win8-wp8_v2\HelloWorld\HelloWorldScene.obj HelloWorld
那么我们就需要在VS2012上通过这个路径( Project > Properties > Configuration Properties > Linker > Input > Additional Dependencies)来添加CocosDenshionWindowsPhone.lib链接库, 如下图所示:
示例代码:
- class TestLayer : public cocos2d::CCLayer
- {
- public:
- TestLayer(void);
- ~TestLayer(void);
- void menuCallback(cocos2d::CCObject * pSender);
- virtual void ccTouchesMoved(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
- virtual void ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
- private:
- cocos2d::CCMenu* m_pItmeMenu;
- cocos2d::CCPoint m_tBeginPos;
- int m_nTestCount;
- unsigned int m_nSoundId;
- };
- TestLayer::TestLayer()
- {
- std::string testItems[] = {
- "play background music",
- "stop background music",
- "pause background music",
- "resume background music",
- "rewind background music",
- "is background music playing",
- "play effect",
- "play effect repeatly",
- "stop effect",
- "unload effect",
- "add background music volume",
- "sub background music volume",
- "add effects volume",
- "sub effects volume",
- "pause effect",
- "resume effect",
- "pause all effects",
- "resume all effects",
- "stop all effects"
- };
- //创建菜单栏
- m_pItmeMenu = CCMenu::create();
- CCSize s = CCDirector::sharedDirector()->getWinSize();
- m_nTestCount = sizeof(testItems) / sizeof(testItems[]);
- //添加菜单栏项目和点击的回掉函数
- for (int i = ; i < m_nTestCount; ++i)
- {
- CCLabelTTF* label = CCLabelTTF::create(testItems[i].c_str(), "Arial", );
- CCMenuItemLabel* pMenuItem = CCMenuItemLabel::create(label, this, menu_selector(TestLayer::menuCallback));
- m_pItmeMenu->addChild(pMenuItem, i + );
- pMenuItem->setPosition( CCPointMake( s.width / , (s.height - (i + ) * LINE_SPACE) ));
- }
- //设置菜单栏的位置
- m_pItmeMenu->setContentSize(CCSizeMake(s.width, (m_nTestCount + ) * LINE_SPACE));
- m_pItmeMenu->setPosition(CCPointZero);
- addChild(m_pItmeMenu);
- setTouchEnabled(true);
- //预加载背景音乐和音效
- SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic( CCFileUtils::fullPathFromRelativePath(MUSIC_FILE) );
- SimpleAudioEngine::sharedEngine()->preloadEffect( CCFileUtils::fullPathFromRelativePath(EFFECT_FILE) );
- //设置默认的音量
- SimpleAudioEngine::sharedEngine()->setEffectsVolume(0.5);
- SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.5);
- }
- TestLayer::~TestLayer()
- {
- }
- void TestLayer::menuCallback(CCObject * pSender)
- {
- //获取调用回掉函数的菜单,获取它的ZOrder,用于判断是那个菜单项触发的
- CCMenuItem* pMenuItem = (CCMenuItem *)(pSender);
- int nIdx = pMenuItem->getZOrder() - ;
- switch(nIdx)
- {
- // 播放背景音乐
- case :
- SimpleAudioEngine::sharedEngine()->playBackgroundMusic(std::string(CCFileUtils::fullPathFromRelativePath(MUSIC_FILE)).c_str(), true);
- break;
- // 停止背景音乐
- case :
- SimpleAudioEngine::sharedEngine()->stopBackgroundMusic();
- break;
- // 暂停背景音乐
- case :
- SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
- break;
- // 恢复背景音乐
- case :
- SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
- break;
- // 回放背景音乐
- case :
- SimpleAudioEngine::sharedEngine()->rewindBackgroundMusic();
- break;
- // 判断背景音乐是否正在播放
- case :
- if (SimpleAudioEngine::sharedEngine()->isBackgroundMusicPlaying())
- {
- CCLOG("background music is playing");
- }
- else
- {
- CCLOG("background music is not playing");
- }
- break;
- // 播放音效
- case :
- m_nSoundId = SimpleAudioEngine::sharedEngine()->playEffect(std::string(CCFileUtils::fullPathFromRelativePath(EFFECT_FILE)).c_str());
- break;
- // 重复播放音效
- case :
- m_nSoundId = SimpleAudioEngine::sharedEngine()->playEffect(std::string(CCFileUtils::fullPathFromRelativePath(EFFECT_FILE)).c_str(), true);
- break;
- // 停止播放音效
- case :
- SimpleAudioEngine::sharedEngine()->stopEffect(m_nSoundId);
- break;
- // 移除音效
- case :
- SimpleAudioEngine::sharedEngine()->unloadEffect(std::string(CCFileUtils::fullPathFromRelativePath(EFFECT_FILE)).c_str());
- break;
- // 添加背景音乐音量
- case :
- SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(SimpleAudioEngine::sharedEngine()->getBackgroundMusicVolume() + 0.1f);
- break;
- // 减少背景音乐音量
- case :
- SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(SimpleAudioEngine::sharedEngine()->getBackgroundMusicVolume() - 0.1f);
- break;
- // 添加音效音量
- case :
- SimpleAudioEngine::sharedEngine()->setEffectsVolume(SimpleAudioEngine::sharedEngine()->getEffectsVolume() + 0.1f);
- break;
- // 减少背景音乐音量
- case :
- SimpleAudioEngine::sharedEngine()->setEffectsVolume(SimpleAudioEngine::sharedEngine()->getEffectsVolume() - 0.1f);
- break;
- //暂停音效播放
- case :
- SimpleAudioEngine::sharedEngine()->pauseEffect(m_nSoundId);
- break;
- case :
- //恢复音效播放
- SimpleAudioEngine::sharedEngine()->resumeEffect(m_nSoundId);
- break;
- //暂停所有音效播放
- case :
- SimpleAudioEngine::sharedEngine()->pauseAllEffects();
- break;
- case :
- //恢复所有音效播放
- SimpleAudioEngine::sharedEngine()->resumeAllEffects();
- break;
- case :
- //停止暂停所有音效播放
- SimpleAudioEngine::sharedEngine()->stopAllEffects();
- break;
- }
- }
- void TestLayer::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)
- {
- CCSetIterator it = pTouches->begin();
- CCTouch* touch = (CCTouch*)(*it);
- m_tBeginPos = touch->getLocationInView();
- m_tBeginPos = CCDirector::sharedDirector()->convertToGL( m_tBeginPos );
- }
- //处理菜单栏的滑动
- void TestLayer::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent)
- {
- CCSetIterator it = pTouches->begin();
- CCTouch* touch = (CCTouch*)(*it);
- CCPoint touchLocation = touch->getLocationInView();
- touchLocation = CCDirector::sharedDirector()->convertToGL( touchLocation );
- float nMoveY = touchLocation.y - m_tBeginPos.y;
- CCPoint curPos = m_pItmeMenu->getPosition();
- CCPoint nextPos = ccp(curPos.x, curPos.y + nMoveY);
- CCSize winSize = CCDirector::sharedDirector()->getWinSize();
- if (nextPos.y < 0.0f)
- {
- m_pItmeMenu->setPosition(CCPointZero);
- return;
- }
- if (nextPos.y > ((m_nTestCount + )* LINE_SPACE - winSize.height))
- {
- m_pItmeMenu->setPosition(ccp(, ((m_nTestCount + )* LINE_SPACE - winSize.height)));
- return;
- }
- m_pItmeMenu->setPosition(nextPos);
- m_tBeginPos = touchLocation;
- }
运行效果:
[Cocos2D-x For WP8]CocosDenshion音频播放的更多相关文章
- iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
--iOS多媒体 概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制, ...
- HTML5 音频播放器-Javascript代码(短小精悍)
直接上干货咯! //HTML5 音频播放器 lzpong 2015/01/19 var wavPlayer = function () { if(window.parent.wavPlayer) re ...
- IOS开发之简单音频播放器
今天第一次接触IOS开发的UI部分,之前学OC的时候一直在模拟的使用Target-Action回调模式,今天算是真正的用了一次.为了熟悉一下基本控件的使用方法,和UI部分的回调,下面开发了一个特别简易 ...
- ios原声音频播放AVAudioSession 总结
//音频播放/*英译:record:录音 */ 1 导入头文件#import<AVFoundation/AVFoundation.h>//AVAudioSession是一个单例模式.在IO ...
- 微信小程序-图片、录音、音频播放、音乐播放、视屏、文件
图片: wx.chooseImage(OBJECT) 从本地相册选择图片或使用相机拍照. OBJECT参数说明: 注:文件的临时路径,在小程序本次启动期间可以正常使用,如需持久保存,需在主动调用 wx ...
- Android音频播放之SoundPool
SoundPool 一.基本概念 在Android应用程序的开发过程中,经常需要播放多媒体文件,也许最先想到的会是MediaPlayer类了,该类提供了播放.暂停.停止及重复播放等功能性方法(该类位于 ...
- iOS开发----音频播放、录音、视频播放、拍照、视频录制
随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像头的操 ...
- 【jquery】一款不错的音频播放器——Amazing Audio Player
前段时间分享了一款视频播放器,点击这里.今天介绍一款不错的音频播放器——Amazing Audio Player. 介绍: Amazing Audio Player 是一个使用很方便的 Windows ...
- Android 学习笔记多媒体技术之 AsyncTask+实现音频播放...
PS:今天搞了一下如何实现音频播放...结果被坑了,看书上写的代码是挺简单的,但是有个函数就是死活没看懂,这真是受不了...最后才弄明白,原来是一个实现异步任务的一个类...这个类使用java.uti ...
随机推荐
- Delphi操作XML简介
参考:http://www.delphifans.com/InfoView/Article_850.html Delphi 7支持对XML文档的操作,可以通过 TXMLDocument类来实现对XML ...
- 【转载】Pyqt 编写的俄罗斯方块
#!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import print_function from __future__ ...
- Oracle【IT实验室】数据库备份与恢复之五:Flashback
Flashback在开发环境(有时生产环境的特殊情况下)是很有用的一个工具. 5.1 9i Flashback 简介 5.1.1 原理 当数据 update 或 delete ...
- js判断当前的访问是手机/电脑
<script type="text/javascript"> var commonURL = 'http://www.xxx.com/'; function mobi ...
- GitHub 使用教程图文详解(转)
大纲: 一.前言 二.GitHub简介 三.注册GitHub账号 四.配置GitHub 五.使用GitHub 六.参与GitHub中其它开源项目 七.总结 注,GitHub官网:https://git ...
- HDU 5213 Lucky 莫队+容斥
Lucky Problem Description WLD is always very lucky.His secret is a lucky number K.k is a fixed odd n ...
- 剑指offer系列——二维数组中,每行从左到右递增,每列从上到下递增,设计算法找其中的一个数
题目:二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数 分析: 二维数组这里把它看作一个矩形结构,如图所示: 1 2 8 2 4 9 12 4 7 10 13 6 8 11 ...
- HashMap合并相同key的value
Map<String, String> map1 = new HashMap<>(); map1.put("x", "y"); map1 ...
- java基本数据类型及相互间的转换
1.首先复习一下java的基本数据类型,见下图 2.比较他们的字节数 备注:1字节(Byte)=8位(Bit) 3.转换中的知识点 *java中整数类型默认的int类型:小数类型默认的double: ...
- Android自动化压力测试之Monkey Test Android常见的错误类型及黑白名单的使用方法(四)
Android常见的错误类型有两种 1.ANR类型 1)在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸) 2)BroadcastReceiver在10秒内没有执行完毕 2.Crash类型 1)异 ...