Quick-Cocos2d-x初学者游戏教程(十三) ---------- 完善游戏功能
2015-09-14 16:35
357 查看
Quick-Cocos2d-x初学者游戏教程(十三)
本章将是本教程的最后一章,在这章我们将完善游戏功能,即给游戏添加粒子特效,音乐音效,和玩家的受伤动画等等。添加受伤动画
首先,我们来添加玩家受伤动画。玩家受伤动画是 Player 与障碍物或地面碰撞的时候播放的一个动画效果,它是一个独立的帧动画,帧序列图片如下:
PS:该动画添加到玩家上是非常丑的,所以如果各位有更好地资源可以不用它。我的美术御用妹子前两周出车祸把手伤了,没人给我画,所以才迫不得已找了这个丑图来替代,看不下去的见谅!
我们把受伤动画的各帧都加入到打包文件中(所以你要重新下载最新的资源),然后在 Player 文件中加入如下的一段代码:
function Player:hit() local hit = display.newSprite() hit:setPosition(self:getContentSize().width / 2, self:getContentSize().height / 2) self:addChild(hit) local frames = display.newFrames("attack%d.png", 1, 6) local animation = display.newAnimation(frames, 0.3 / 6) local animate = cc.Animate:create(animation) local sequence = transition.sequence({ animate, cc.CallFunc:create(function() hit:removeSelf() end) }) hit:runAction(sequence) hit:setScale(0.6) end
hit 方法的主要目的是创建一个帧动画,并且在播放完整个帧动画时移除自身。该方法中涉及到的知识点前面基本都有讲解,所以这里我们就不挨个细说了。
添加粒子特效
游戏中,我们需要在消除星星的时候给它一个消除特效,这个特效由粒子系统来实现。在 Quick 中创建一个粒子系统是非常简单地,一般创建粒子系统我们可通过 plist 文件来创建,这样不仅简单,而且还更方便。这里 plist 文件与之前的打包文件不一样的是:这里它是由粒子编辑器创建而来的,在第五章中我们也有提起过。
回到我们的项目中,我们只需要添加如下的一段代码就可以在场景中添加一个粒子系统:
local emitter = cc.ParticleSystemQuad:create("particles/dirt.plist") emitter:setPosition(display.cx, display.top) self:addChild(emitter, -3)
这里的代码会创建是一个飘落的飞尘效果效果,dirt.plist 就是这样的一个飘落的粒子效果。我们把该段代码加入背景层的近景背景下层,就会有下面的效果。
在 Quick 中,粒子系统用 cc.ParticleSystem 表示,它是所有粒子系统的基类,定义了粒子系统的各种基本属性。cc.ParticleSystemQuad 是从它派生而来的一个子类,也是引擎中最常用的一种的粒子系统,通常我们都是通过它来创建粒子系统的。
用同样的方式,我们就可以在消除星星的时候给它添加一个粒子效果了。
音乐音效
接下来,我们来给游戏添加背景音乐和音效。首先我们要知道的是,Quick 引擎封装了一套与声音相关的 audio 模块,我们可以通过它方便的调用声音相关的 API 来控制声音。audio 模块提供了众多的方法和属性,比如预加载、播放、暂停、停止、恢复声音等等。
我们还需知道,游戏中的声音背引擎分为了两种:一种是Music(指背景音乐),另一种则是Sound(指游戏音效,也就是除了背景音乐以外的声音)。
下面是一些控制背景音乐相关的常用 API:
预载入一个音乐文件:audio.preloadMusic(filename)
它在播放音乐前预先载入,可以在需要播放音乐时无延迟立即播放。不过限于硬件设备和操作系统的限制,通常只能预载入一个音乐文件,参数为音乐文件名。
播放音乐:audio.playMusic(filename, isLoop),参数分别表示音乐文件名,以及是否循环播放音乐,默认情况下为 true。
如果音乐文件尚未载入,则会首先载入音乐文件,然后开始播放。
注意:即便音乐音量为 0.0,audio.playMusic() 仍然会进行播放操作。
如果希望停止音乐来降低 CPU 占用,应该使用 audio.stopMusic() 接口完全停止音乐播放。
暂停音乐的播放:audio.pauseMusic()
恢复暂停的音乐:audio.resumeMusic()
停止播放音乐:audio.stopMusic(isReleaseData),参数 isReleaseData 表示是否释放音乐数据,默认为 true。
设置音乐的音量:audio.setMusicVolume(volume)
volume 音量在 0.0 到 1.0 之间, 0.0 表示完全静音,1.0 表示 100% 音量。
返回音乐的音量值:audio.getMusicVolume()
返回值在 0.0 到 1.0 之间,0.0 表示完全静音,1.0 表示 100% 音量
控制音效相关的 API 与控制背景音乐的类似,如audio.playSound(filename, isLoop),audio.setSoundsVolume(volume)等,所以这里我们就不再列举了。
回到我们的游戏,因为它的音乐音效不需要过多的设置和变化,所以,我们用不超过二十行的代码就可以实现整个声音系统的制作。如下:
首先,在 res 文件夹下新建一个 sound 文件夹,把需要的声音文件都放到这个文件夹中。然后在 MyApp.lua 文件中,我们先预加载需要的音乐音效。
audio.preloadMusic("sound/background.mp3") audio.preloadSound("sound/button.wav") audio.preloadSound("sound/ground.mp3") audio.preloadSound("sound/heart.mp3") audio.preloadSound("sound/hit.mp3")
接着,我们就可以在 MainScene 场景中播放背景音乐了。
audio.playMusic("sound/background.mp3", true)
另外,在需要播放音效的地方添加类似下面的函数就可以播放音效。
audio.playSound("sound/button.wav")
完善碰撞检测
根据十一章的碰撞描述,以及目前游戏的需求,现在我们来把碰撞检测的所有逻辑都补全。于是便得到了如下的 addCollision 方法:
function GameScene:addCollision() local function contactLogic(node) if node:getTag() == HEART_TAG then local emitter = cc.ParticleSystemQuad:create("particles/stars.plist") emitter:setBlendAdditive(false) emitter:setPosition(node:getPosition()) self.backgroundLayer.map:addChild(emitter) if self.player.blood < 100 then self.player.blood = self.player.blood + 2 self.player:setProPercentage(self.player.blood) end audio.playSound("sound/heart.mp3") node:removeFromParent() elseif node:getTag() == GROUND_TAG then self.player:hit() self.player.blood = self.player.blood - 20 self.player:setProPercentage(self.player.blood) audio.playSound("sound/ground.mp3") elseif node:getTag() == AIRSHIP_TAG then self.player:hit() self.player.blood = self.player.blood - 10 self.player:setProPercentage(self.player.blood) audio.playSound("sound/hit.mp3") elseif node:getTag() == BIRD_TAG then self.player:hit() self.player.blood = self.player.blood - 5 self.player:setProPercentage(self.player.blood) audio.playSound("sound/hit.mp3") end end local function onContactBegin(contact) local a = contact:getShapeA():getBody():getNode() local b = contact:getShapeB():getBody():getNode() contactLogic(a) contactLogic(b) return true end local function onContactSeperate(contact) if self.player.blood <= 0 then self.backgroundLayer:unscheduleUpdate() self.player:die() local over = display.newSprite("image/over.png") :pos(display.cx, display.cy) :addTo(self) cc.Director:getInstance():getEventDispatcher():removeAllEventListeners() end end local contactListener = cc.EventListenerPhysicsContact:create() contactListener:registerScriptHandler(onContactBegin, cc.Handler.EVENT_PHYSICS_CONTACT_BEGIN) contactListener:registerScriptHandler(onContactSeperate, cc.Handler.EVENT_PHYSICS_CONTACT_SEPERATE) local eventDispatcher = cc.Director:getInstance():getEventDispatcher() eventDispatcher:addEventListenerWithFixedPriority(contactListener, 1) end
好了,现在运行游戏,一个如下图所示的初级游戏就算凑合着成型了。
源码代码我已放到 Github 仓库,欢迎大家下载、克隆,提交pr。
转载请注明出自:http://shannn.com/archives/488
文章索引
Quick-Cocos2d-x初学者游戏教程(一)
Quick-Cocos2d-x初学者游戏教程(二)
Quick-Cocos2d-x初学者游戏教程(三)
Quick-Cocos2d-x初学者游戏教程(四)
Quick-Cocos2d-x初学者游戏教程(五)
Quick-Cocos2d-x初学者游戏教程(六)
Quick-Cocos2d-x初学者游戏教程(七)
Quick-Cocos2d-x初学者游戏教程(八)
Quick-Cocos2d-x初学者游戏教程(九)
Quick-Cocos2d-x初学者游戏教程(十)
Quick-Cocos2d-x初学者游戏教程(十一)
Quick-Cocos2d-x初学者游戏教程(十二)
Quick-Cocos2d-x初学者游戏教程(十三)
相关文章推荐
- Quick-Cocos2d-x初学者游戏教程(十二) ------------ 触摸事件
- Quick-Cocos2d-x初学者游戏教程(十一) ------------------ 物体碰撞检测
- Quick-Cocos2d-x初学者游戏教程(十) ---------------- 添加游戏障碍物
- Quick-Cocos2d-x初学者游戏教程(九) ------------------- 障碍物和奖励品
- Quick-Cocos2d-x初学者游戏教程(八)----------------- 物理引擎和角色
- Quick-Cocos2d-x初学者游戏教程 (七) ----------------------- 制作地图
- quick-lua 3.5 工程 cocos code ide 1.2.0 断点调试
- cocos2dx 对全部动作或单个动作速度的改变
- cocos2dx 举例说明 convertToNodeSpace 与 convertToWorldSpace 的使用
- cocos2d-x 集成社交分享平台shareSDK
- Cocos2d-x3.0模版容器详解之一:cocos2d::Vector<T>
- cocos2d-x 打开url 和 截屏功能
- cocos基础教程(2)Window环境下搭建(补充)
- cocos基础教程(2)Window环境下搭建
- cocos2dx 利用schedule实现长按触发事件功能
- cocos2dx 利用CCLabelTTF设置字的水平间距与垂直间距
- 在Xcode下编译cocos2d-x语言为lua时出错的解决方案
- cocos2d-x 利用CCLabelTTF制作文字描边与阴影效果的实现方法
- cocos2D(五岁以下儿童)---- CCNode
- cocos基础教程(1)Mac环境下搭建