如何解决cocos2dx 在android系统的音效bug

如何解决cocos2dx 在android系统的音效bug,第1张

您好,很高兴为您解答:

SimpleAudioEngine是cocos2d-x播放声音、茄枣音效的引擎。像对于背景音乐会提供一个判断当前背景音乐是否播放完毕的接口,但是查了半天,音效并没有提供类似的接口, 大体看了下SimpleAudioEngine.cpp的实现,感觉自己写一个是可以的,所以将代码贴出来,跟大家分享下。

SimpleAudioEngine.h文件中添加以下函数定义:

//判断当前音效是否已经播放完

bool getEffectIsPlaying(unsigned int nSoundId)

SimpleAudioEngine.cpp函数实现,比较简单:

//判断当前音效是否已经播放完

bool SimpleAudioEngine::getEffectIsPlaying(unsigned int

nSoundId)

{

EffectList::iterator p =

sharedList().find(nSoundId)

bool bRet = false

if (p !=

sharedList().end())

{

bRet =

p->second->IsPlaying()

}

return bRet

}复制代码

注:修改后将libCocosDenshion类库重新编译丛族一下。只要通过我们的soundid参数渗纳弊,便可找到MciPlayer,这样就好处理了。

在这个教程里面,你将会学习到如何开发一个太空射击游戏!

你可以使用加速计(重力感应)来控制飞船的移动,并且可以点击屏幕来发射激光武器。

如果你对于如何制作基于cocos2d-x3.0的游戏完全陌生的话,这个教程可以帮助你!你将会学习到,如何从头至尾构建一个完整的游戏,不需要任何的经验!

假如你对cocos2d-x3.0编程完全陌衡迹生的话,那么你可能需要先学习一下相关的教程了。

这个教程对于中级开发者来说也非常好,因为它覆盖了一些比较高级的主题,比如视差滚动(parallax scrolling),预分配Node,加速计移动以及粒子系统的使用。

话不多说,直入主题!

添加相关资源文件

为了做这样一个手机游戏,你将需要一些跟太空主题相关的图片资源和声音颤配资源。

你可以直接下载我老婆制作的太空游戏资源。

因此,请直接下载吧,并且把它解压到你的项目的Resources目录下面去。

如果你很好奇,你可以随便看看你刚刚向工程里面添加进去了一些什么东西。下面是完整的内容列表:

Backgrounds: 一些背景图片,你等下会使用它们来制作一个滚动背景。里面包含星系,太阳,和空间异常(它移动速度比较慢),还有一组空间尘埃图片(它们会出现在背景前面,而且会移动地稍微快一点)

Fonts: 使用 Glyph Designer制作的位图字体,我们将使用这些字体来在游戏中显示文字。

Particles: 使用 Particle Designer制作的一些特殊的粒子效果。 在这里,我们用来创建星星飞动的效果。

Sounds: 一些与太空相关的背景音乐和音效。使用 Garage Band 和 cxfr制作的。

Spritesheets: 一张格式为pvr.ccz的大图片,里面包含了游戏中将要用到的许多小图片,比如陨石,太空船等。这个文件使用 Texture Packer制作的---如果你想使用pvr.ccz文件格式的话,你可能就需要使用这个工具。当然pvr.ccz格式的优点就是文件小,加载速度快。

如果你还没安装上面任何一款工具的话,也不用担心!对于这个教程来说,你完全不需要他们,你可以使用我已经制作好的这些资源就够了。以后,如果有条件,你可以再去试试上面提到的工具。

你可能会奇怪,为什么要把所有的这些图片都弄成这样一张大图呢?因为,首先,它可以帮助节省内存,同时还可以提高性能。

接下来,让我们开始coding吧!:)

添加一个太空船

首先,让我们在屏幕上添加一艘太空船吧!

让我们试试,看是否工作!打开HelloWorld.h,在HelloWorld类开头加入下面代码(在已有public:行的上面)

SpriteBatchNode *_batchNode

Sprite *_ship

上面的代码创建了两个私有实例变量 – 一个是SpriteBatchNode,一个是太空飞船精灵。

现在切换到HelloWorldScene.cpp,在init()方法里,删除从注释“2. add a menu item”到方法最后的所有代码,加入下面代码:

_batchNode = SpriteBatchNode::create("Sprites.pvr.ccz")// 1

this->addChild(_batchNode)// 2

SpriteFrameCache::getInstance()->addSpriteFramesWithFile("Sprites.plist")// 3

_ship = Sprite::createWithSpriteFrameName("SpaceFlier_sm_1.png")// 4

auto winSize = Director::getInstance()->getWinSize()// 5

_ship->setPosition(Point(winSize.width *0.1, winSize.height *0.5))// 6

_batchNode->addChild(_ship,1)// 7

注意这些代码与你过去使用的Objective-C版的cocos2d 非常类似。API是有很多相同的地方的,仅仅是有一些与C++的语法不同。

编译运行,你应该可以看到你的船出现在屏幕上

增加视差滚动

接下来,我们会加入宇宙背景,使它以视差滚动这种很酷的方式来滚动。咐洞并

首先,我们不得不在所有的类名前面加上cocos2d::这个名字空间,这太烦人了!所以在HelloWorld.h类声明前加入下面行:

USING_NS_CC

接着在HelloWorld的private部分加入一些新的变量(注意我们不再需要加cocos2d前缀):

ParallaxNodeExtras *_backgroundNode

Sprite *_spacedust1

Sprite *_spacedust2

Sprite *_planetsunrise

Sprite *_galaxy

Sprite *_spacialanomaly

Sprite *_spacialanomaly2

然后,在HelloWorldScene.cpp的init方法中,return语句前加入下面代码:

// 1) Create the ParallaxNodeExtras

_backgroundNode = ParallaxNodeExtras::node()

this->addChild(_backgroundNode,-1)

// 2) Create the sprites we'll add to the ParallaxNodeExtras

_spacedust1 = Sprite::create("bg_front_spacedust.png")

_spacedust2 = Sprite::create("bg_front_spacedust.png")

_planetsunrise = Sprite::create("bg_planetsunrise.png")

_galaxy = Sprite::create("bg_galaxy.png")

_spacialanomaly = Sprite::create("bg_spacialanomaly.png")

_spacialanomaly2 = Sprite::create("bg_spacialanomaly2.png")

// 3) Determine relative movement speeds for space dust and background

Point dustSpeed = Point(0.1, 0.1)

Point bgSpeed = Point(0.05, 0.05)

// 4) Add children to ParallaxNodeExtras

_backgroundNode->addChild(_spacedust1,0,dustSpeed,Point(0, winSize.height / 2))

_backgroundNode->addChild(_spacedust2,0,dustSpeed,Point(_spacedust1->getContentSize().width, winSize.height / 2))

_backgroundNode->addChild(_galaxy, -1, bgSpeed,Point(0, winSize.height *0.7))

_backgroundNode->addChild(_planetsunrise, -1, bgSpeed,Point(600, winSize.height * 0))

_backgroundNode->addChild(_spacialanomaly, -1, bgSpeed,Point(900, winSize.height *0.3))

_backgroundNode->addChild(_spacialanomaly2, -1, bgSpeed,Point(1500, winSize.height *0.9))

编译运行,你应该可以看到一个宇宙场景的启动

而,这还不是很有趣,因为还没有任何东西在动!

为了移动太空尘埃和相关背景层,你只需要移动一样东西就可以了,ParallaxNodeExtras。对于移动parallax node的每一个y值,灰尘就会移动0.1y值,同时背景会移动0.05y值。

为了移动parallax节点,你只需要飞一帧更新一下它的位置就可以了。打开HelloWorldLayer.m文件,加入下列的代码:(添加位置注意看注释)

this->scheduleUpdate()

void HelloWorld::update(float dt)

{

Point backgroundScrollVel = Point(-1000, 0)

_backgroundNode->setPosition(_backgroundNode->getPosition()+backgroundScrollVel*dt)

}

编译并运行工程,你会看到,使用parallax来做视差滚动效果真是太简洁了!

先用preloadBackgroundMusic加载一下音乐再试试看,另外背景音乐请使用mp3格式的。如果还不行的话,很小的可能是你的mp3格式不标准,可以使用转裤谨换工具重新进行下转换然后再试缺纯睁试应该伏岁就可以解决问题了。还有就是注意音乐所在的位置是否正确。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/bake/11983337.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存