Quick-Cocos2d-x初学者游戏教程(十三) ---------- 完善游戏功能

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 就是这样的一个飘落的粒子效果。我们把该段代码加入背景层的近景背景下层,就会有下面的效果。

它的制作可参考如何利用粒子编辑器创建 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

文章索引

时间: 2024-08-10 11:49:05

Quick-Cocos2d-x初学者游戏教程(十三) ---------- 完善游戏功能的相关文章

Quick-Cocos2d-x初学者游戏教程(二) -------------------- Quick内部的代码结构及相应的原理

Quick-Cocos2d-x初学者游戏教程(二) 上一章我们已经了解了Quick的一些基础知识,所以本章我们将开始深入到Quick内部,了解它内部的代码结构,同时在解析的过程中学到相应的原理,并学会如何修改.添加相应的代码文件,比如实现屏幕的分辨率适配. 前面我们创建了一个叫做parkour的游戏项目,其意思就是本人本来打算要做一个跑酷游戏的,但是因为这几天玩了一款叫做<el>的飞行游戏,非常有意境,并且几乎零差评,所以请允许我任性一下,善变的我不想做跑酷游戏了,而是想要挑战下这种类型的游戏

Quick-Cocos2d-x初学者游戏教程(三) ---------------------------- 解析quick新建项目的代码文件

Quick-Cocos2d-x初学者游戏教程(三) 2.main.lua 在src目录下,除了 config.lua 文件外,还有一个 main.lua 文件,这个 main.lua 是 Quick 项目的通用入口文件,它类似于 Cocos2d-x 中的 AppDelegate.h/cpp 文件,同时也类似于一般 Windows 工程中的 main 文件. 打开 main.lua 文件,其内容如下所示: 1 2 3 4 5 6 7 8 9 10 function __G__TRACKBACK__

Quick-Cocos2d-x初学者游戏教程(一)--------------------Quick的一些基础知识

本文转自Quick-Cocos2d-x初学者游戏教程(一) 前言 虽然之前已经写过了很多 Cocos2d-x 相关的教程和文档,但本次却是我第一次接触 Quick,第一次接触 Lua,所以此次的教程本人将站在一个初学者的角度(看到这里是不是想白眼我了,哈哈,别切啊!尽管第一次,但我身边可是有很多 Quick 大神的,廖大大也在旁边办公室,没准撒个娇大神就把他知道的全部要点倾囊相授了啦!),全方位的解析 Quick 的学习过程,并同大家一起学习如何利用 Quick-Cocos2d-x 开发一款属于

Quick-Cocos2d-x初学者游戏教程(四) --------------- 开发初探(添加背景,标题,动作,按钮)

Quick-Cocos2d-x初学者游戏教程(四) 前面我们已经大概的讲解完了Quick的框架和代码结构,接下来,本章开始我们将正式进入到游戏的开发.当然在开发的过程中,如果遇到值得一提的知识点和概念,我们还是会为大家详细讲解的. 哈哈,这章的内容我加它为——开发初探,因为我们将先来实现一些基础的内容.本章将实现的效果如下图所示: 菜单场景 从前面章节讲解的的知识点中,我们知道每个新建的 Quick 项目里都已经默认创建好了一个 mainScene 场景,所以下面我们将利用这个现成的场景,把它改

Quick-Cocos2d-x初学者游戏教程(六) --------------------- 游戏逻辑

Quick-Cocos2d-x初学者游戏教程(六) 上一章我 们介绍了开发中会用到的辅助工具,并创建了 GameScene 场景,接下来这章我们将继续 GameScene 的传(bai)奇(bi).不过在开始编写 GameScene 场景的代码之前,我们还是先来明确一下游戏的功能和实现方法.这样可以帮我们更好的理解并设计逻辑.下面是总结出的结论: 在 GameScene 场景中,我们将创建一个飞行的娃娃角色,这个角色是游戏的唯一主角.游戏初始状态下,这个角色有满满的生命值,但随着时间的推移,生命

Quick-Cocos2d-x初学者游戏教程(五) --------------------- 辅助工具和跳转场景

Quick-Cocos2d-x初学者游戏教程(五) 上一章我们创建了游戏的菜单场景,并讲解了一些基础元素的创建,接下来这章,我们会先让大家了解一些接下来游戏开发中需要用到的辅助工具,然后再教大家创建另一个游戏场景,并跳着到该场景中来. 工具介绍 在开始真真的写代码之前,其实早该讲讲以下这些辅助工具的.这些工具可以让我们更好更方便的实现程序中的某些功能,比如地图编辑工具.粒子编辑工具 等.尽管这些工具在我之前的教程中已经不厌其烦的讲了好多次了,但是为了做到真正的初学者教程,本小节还是先来简单的介绍

Quick-Cocos2d-x初学者游戏教程(十一) ------------------ 物体碰撞检测

Quick-Cocos2d-x初学者游戏教程(十一) 本章主要讲解物体碰撞检测之间的原理,以及具体的实现方法. 碰撞检测 本游戏使用物理引擎的一个重要目的是为了让碰撞检测更方便,使用物理引擎可以进行精确的碰撞检测,而且执行的效率也很高. 在 Quick 3.3final 版本中,所有事件均有事件派发器统一管理,物理引擎的碰撞事件也不例外.它由 cc.EventListenerPhysicsContact 的实例来监听. 监听事件分类 碰撞监听事件有以下几种: cc.Handler.EVENT_P

Quick-Cocos2d-x初学者游戏教程(八)----------------- 物理引擎和角色

Quick-Cocos2d-x初学者游戏教程(八) 续上章载入 TiledMap 背景后,接下来的这章我们将开始引入物理引擎相关的东西,并且会开始创建我们的游戏角色.游戏地图中各类障碍物和奖励品的创建则会留到下一章. 构建物理世界 首先,物理引擎是干什么的应该不用我说吧?好吧,还是说一下(百度的):物理引擎通过为刚性物体赋予真实的物理属性的方式来计算运动.旋转和碰撞反映.所以用它来模拟真实世界的飞行.掉落等功能是具有得天独厚的优势的,这也是为什么我们的游戏要使用它的原因. 然后,我们要怎样使用物

Quick-Cocos2d-x初学者游戏教程(十) ---------------- 添加游戏障碍物

Quick-Cocos2d-x初学者游戏教程(十) 在我们的游戏中,我们除了添加奖励品外,还需要添加一些必要的障碍物来丰富游戏逻辑,增加游戏难度,所以本章我们将继续上章的内容——添加游戏障碍物.游戏中,障碍物是不止一种,这里有飞行的鸟,有上下移动的飞艇. 创建障碍物-飞艇 其实创建飞艇的逻辑和前面创建心心的逻辑是一样的,只不过这里我想让飞艇不停的上下移动,一方面做点带感的效果出来,另一方面也可以增加游戏难度. 看过之前教程的童鞋,现在应该懂得怎样创建这样的一个飞艇了吧.所以下面我们直接给出它的定