Cocos2d-x 3.2 lua飞机大战开发实例三道具的掉落,碰撞检测,声音,分数,爆炸效果,完善游戏的功能细节

Cocos2d-X 3.2 lua语言飞机大战开发实例(三)


7.添加声音,更新分数,添加爆炸效果,道具的掉落、道具的碰撞检测等完善游戏功能


爆炸的效果添加


首先需要在GameData的全局数据中定义所有道具的表

g_allTools={} --所有道具的表


接下来定义一个爆炸类

--

require "Cocos2d"

local Boom=class("Boom",function ()

return cc.Node:create()


end)


--

function Boom:create(x,y)

local bm=Boom.new()

bm:addChild(bm:init(x,y))

return bm


end


--

function Boom:ctor()

--init()

function Boom:init(x,y)

local layer=cc.Layer:create()

local boom=cc.ParticleSystemQuad:create("boom.plist")

layer:addChild(boom)

boom:setPosition(x,y)

--一秒钟之后消失

local act1=cc.DelayTime:create(1)

local function killme()

self:removeFromParent()

end

local act2=cc.CallFunc:create(killme)

--执行动作序列

layer:runAction(cc.Sequence:create({act1,act2}))

return layer

end

return Boom

--定义好了爆炸的类,我们该在GameScene中添加爆炸的效果了

--爆炸效果

local boom=require("nodes.Boom")

local bm=boom:create(nowe.ex,nowe.ey)

layer:addChild(bm)


8.道具的掉落,

--我们确定哪架敌机可以产生道具,所以我们需要产生随机数,确定哪个敌机可以产生道具

--在敌机类文件中

--确定这架飞机含有没有道具

local num=math.random(10) --产生的是110 的随机数,没有0

if num<=4 then

self.haveTools=num --这样数字是几,道具的类型就是几

else

self.haveTools=0

end

--

--定义道具的类文件

local Tools=class("Tools",function ()

return cc.Node:create()

end)


function Tools:create(t,x,y)

local tool=Tools.new()

tool:addChild(tool:init(t,104)"> return tool

end


function Tools:ctor()

self.type=0

self.dirW=true --水平的方向

self.dirH=true --竖直方向

self.tx=0

self.ty=0

self.btimes=0 --反弹

self.winsize=cc.Director:getInstance():getWinSize()

self.indexOfAllTools=0 --记录道具在table表中的编号

end



function Tools:init(t,y)

local layer=cc.Layer:create()

self.type=t

local sp=nil

if t==1 then

sp=cc.Sprite:create("tooljia.png")--加血

elseif t==2 then

sp=cc.Sprite:create("toolj.png")--激光

elseif t==3 then

sp=cc.Sprite:create("tools.png")--散弹

elseif t==4 then

sp=cc.Sprite:create("toob.png")--全品爆炸

end

sp:setPosition(x,y)

self.tx=x

self.ty=y

layer:addChild(sp)

--设置计划任务,让道具反弹6次后消失

local function update(t)

--改变坐标

if self.dirW==true then

self.tx=self.tx+5

else

self.tx=self.tx-5

end

if self.dirH==true then

self.ty=self.ty+5

else

self.ty=self.ty-5

end

--改变方向

if self.tx>self.winsize.width or self.tx<0 then

self.dirW=not self.dirW --打返

self.btimes=self.btimes+1

end

if self.ty>self.winsize.height or self.ty<0 then

self.dirH=not self.dirH

self.btimes=self.btimes+1

end

sp:setPosition(self.tx,self.ty)--sp重新的设置坐标、

--判断是否自动的消失

if self.btimes>5 then

--那么我们就将它从table表中删除

table.remove(g_allTools,self.indexOfAllTools)

--调整后续的编号

for i=1,#g_allTools do

if g_allTools[i].indexOfAllTools>self.indexOfAllTools then

g_allTools[i].indexOfAllTools=g_allTools[i].indexOfAllTools-1

end

end

self:unscheduleUpdate()

self:removeFromParent()

end

end

layer:scheduleUpdateWithPriorityLua(update,0)

return layer

end



return Tools


--- 在子弹和敌机产生碰撞检测处,我们添加道具的产生

--产生道具

if nowe.haveTools>0 then

local tool=require("nodes.Tools")

local too=tool:create(nowe.haveTools,nowe.ex,nowe.ey)

layer:addChild(too)

--再设置一下在table中的编号

too.indexOfAllTools=#g_allTools+1

g_allTools[#g_allTools+1]=too

--这样我们在打落敌机的时候就会随机的产生道具了,但是现在还没有做道具的碰撞检测呢,

9.接下来我们就做道具的碰撞检测。依然在碰撞逻辑的gamelogic中添加一个道具的碰撞检测,

假如我们吃到道具就要执行相应的一系列的操作,换子弹,加血,加分数,全屏爆炸等,所以我们这里用cocosui编辑器做了一个分数显示表,以及在全局的数据类中定义了相应了数据



--增加道具和我方飞机的碰撞检测

for i=1,#g_allTools do --遍历道具的table

local nowTools=g_allTools[i] --取到这个道具

local rectTools=cc.rect(nowTools.tx,nowTools.ty,30,30)

if cc.rectContainsPoint(rectTools,cc.p(g_px+15,g_py+15)) then

--飞机已经碰到道具了

if nowTools.type==1 then --加血

g_hp=g_hp+1

local textHp=top:getChildByTag(5)

textHp:setString(string.format("x%d",g_hp))

elseif nowTools.type==2 then --全屏爆炸

--让所有的敌机消失

while #g_allEnemy>0 do

--需要在敌机的位置爆炸,消失,加分

local nowe=g_allEnemy[1] --取到所有的敌机

--天机分数

if nowe.type==0 then

g_score=g_score+100

elseif nowe.type==1 then

g_score=g_score+200

elseif nowe.type==2 then

g_score=g_score+300

end

--更新ui

local textScore=top:getChildByTag(6)

textScore:setString(tostring(g_score))

--添加音乐

cc.SimpleAudioEngine:getInstance():playEffect("boom.wav")

--添加爆炸的效果

local boom=require("nodes.Boom")

local bt=boom:create(nowe.ex,nowe.ey)

layer:addChild(bt)

--添加道具

if nowe.haveTools>0 then

local tool=require("nodes.Tools")

local too=tool:create(nowe.haveTools,nowe.ey)

layer:addChild(too)

too.indexOfAllTools=#g_allTools+1

g_allTools[#g_allTools+1]=too

end

--敌机消失

table.remove(g_allEnemy,nowe.indexOfAllEnemy)

--更新后续的编号

for i=1,#g_allEnemy do

if g_allEnemy[i].indexOfAllEnemy>nowe.indexOfAllEnemy then

g_allEnemy[i].indexOfAllEnemy=g_allEnemy[i].indexOfAllEnemy-1

end

end

nowe:unscheduleUpdate()

nowe:removeFromParent()

return

end

elseif nowTools.type==3 then --激光

---在这里我们做了对飞机子弹类的一个扩展,添加了一个子弹的类型需要在GameData中添加一个 当前子弹的类型

g_bulletType=0

elseif nowTools.type==4 then --散弹

g_bulletType=1

end

--移除道具

table.remove(g_allTools,nowTools.indexOfAllTools)

--调整后续的编号

for i=1,#g_allTools do

if g_allTools[i].indexOfAllTools >nowTools.indexOfAllTools then

g_allTools[i].indexOfAllTools=g_allTools[i].indexOfAllTools-1

end

end

nowTools:unscheduleUpdate()

nowTools:removeFromParent()

break

end

end

--这样的话我们就实现了道具的碰撞检测的的效果,

10.接下来我们该让飞机和敌机做碰撞检测了,假如,飞机碰撞到敌机,敌机就爆炸,飞机的hp—

当飞机的hp<=0的时候,证明飞机死亡,就让跳转场景。游戏结束。

在碰撞检测gamelogic的逻辑中,添加飞机和敌机的碰撞检测

--增加敌机和我方飞机的碰撞检测

for i=1,#g_allEnemy do

local nowenemy=g_allEnemy[i]

local rect1=cc.rect(nowenemy.ex,nowenemy.ey,87,50)

if cc.rectContainsPoint(rect1,g_py+15)) then

g_hp=g_hp-1

local textHp=top:getChildByTag(5)

textHp:setString(string.format("x%d",g_hp))

if g_hp<=0 then

table.remove(g_allEnemy)

nowenemy:unscheduleUpdate()

nowenemy:removeFromParent()

local scene=require("GameOver")

local ms=scene:create()

local tms=cc.TransitionFade:create(0.5,ms)

cc.Director:getInstance():replaceScene(tms)

end

--爆炸效果

local boom=require("nodes.Boom")

local bm=boom:create(nowenemy.ex,nowenemy.ey)

layer:addChild(bm)

--敌机消失

table.remove(g_allEnemy,nowenemy.indexOfAllEnemy)

--后续编号--

for i=1,#g_allEnemy do

if g_allEnemy[i].indexOfAllEnemy>nowenemy.indexOfAllEnemy then

g_allEnemy[i].indexOfAllEnemy=g_allEnemy[i].indexOfAllEnemy-1

end

end

nowenemy:unscheduleUpdate()

nowenemy:removeFromParent() --将本节点删除

return

end

end



--这样我们就基本上实现了这个游戏的一个基本的流程,再需要做的就是完善游戏的各个细节部分了,游戏测试效果

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建
2019独角兽企业重金招聘Python工程师标准>>>cocos2d2.0之后加入了一种九宫格的实现,主要作用是用来拉伸图片,这样的好处在于保留图片四个角不变形的同时,对图片中间部分进行拉伸,来满足一些控件的自适应(PS: 比如包括按钮,对话框,最直观的形象就是ios里的短信气泡了),这就要求图
原文链接:http://www.cnblogs.com/linji/p/3599478.html1.环境和工具准备Win7VS2010/2012,至于2008v2版本之后似乎就不支持了。 2.安装pythonv.2.0版本之前是用vs模板创建工程的,到vs2.2之后就改用python创建了。到python官网下载版本2.7.5的,然后
环境:ubuntu14.04adt-bundle-linux-x86_64android-ndk-r9d-linux-x86_64cocos2d-x-3.0正式版apache-ant1.9.3python2.7(ubuntu自带)加入环境变量exportANDROID_SDK_ROOT=/home/yangming/adt-bundle-linux/sdkexportPATH=${PATH}:/$ANDROID_SDK_ROOTools/export
1开发背景游戏程序设计涉及了学科中的各个方面,鉴于目的在于学习与进步,本游戏《FlappyBird》采用了两个不同的开发方式来开发本款游戏,一类直接采用win32底层API来实现,另一类采用当前火热的cocos2d-x游戏引擎来开发本游戏。2需求分析2.1数据分析本项目要开发的是一款游
原文链接:http://www.cnblogs.com/linji/p/3599912.html//纯色色块控件(锚点默认左下角)CCLayerColor*ccc=CCLayerColor::create(ccc4(255,0,0,128),200,100);//渐变色块控件CCLayerGradient*ccc=CCLayerGradient::create(ccc4(255,0,0,
原文链接:http://www.cnblogs.com/linji/p/3599488.html//载入一张图片CCSprite*leftDoor=CCSprite::create("loading/door.png");leftDoor->setAnchorPoint(ccp(1,0.5));//设置锚点为右边中心点leftDoor->setPosition(ccp(240,160));/
为了答谢广大学员对智捷课堂以及关老师的支持,现购买51CTO学院关老师的Cocos2d-x课程之一可以送智捷课堂编写图书一本(专题可以送3本)。一、Cocos2d-x课程列表:1、Cocos2d-x入门与提高视频教程__Part22、Cocos2d-x数据持久化与网络通信__Part33、Cocos2d-x架构设计与性能优化内存优
Spawn让多个action同时执行。Spawn有多种不同的create方法,最终都调用了createWithTwoActions(FiniteTimeAction*action1,FiniteTimeAction*action2)方法。createWithTwoActions调用initWithTwoActions方法:对两个action变量初始化:_one=action1;_two=action2;如果两个a
需要环境:php,luajit.昨天在cygwin上安装php和luajit环境,这真特么是一个坑。建议不要用虚拟环境安装打包环境,否则可能会出现各种莫名问题。折腾了一下午,最终将环境转向linux。其中,luajit的安装脚本已经在quick-cocos2d-x-develop/bin/中,直接luajit_install.sh即可。我的lin
v3.0相对v2.2来说,最引人注意的。应该是对触摸层级的优化。和lambda回调函数的引入(嗯嗯,不枉我改了那么多类名。话说,每次cocos2dx大更新。总要改掉一堆类名函数名)。这些特性应该有不少人研究了,所以今天说点跟图片有关的东西。v3.0在载入图片方面也有了非常大改变,仅仅只是