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) --产生的是1到10 的随机数,没有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
elseif nowe.type==1 then
elseif nowe.type==2 then
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
--这样我们就基本上实现了这个游戏的一个基本的流程,再需要做的就是完善游戏的各个细节部分了,游戏测试效果