使用Cocos2d-lua开发植物大战僵尸08-僵尸的出现

使用Cocos2d-lua开发植物大战僵尸08-僵尸的出现,第1张

概述这一篇开始,我们会用三四篇的篇幅来讲核心层,也就是战斗层FightLayer,该层的功能主要包括一波一波僵尸的出现,根据你选择的植物类型和添加的位置创建并添加植物,以及植物与僵尸之间的互相攻击逻辑,在这一篇,我们先来将其中之一,也就是僵尸的进攻。 在src/app/layers下创建一个FightLayer.lua文件,创建FightLayer类继承Layer,我们先来说说这个类有那些属性: 植物

这一篇开始,我们会用三四篇的篇幅来讲核心层,也就是战斗层fightLayer,该层的功能主要包括一波一波僵尸的出现,根据你选择的植物类型和添加的位置创建并添加植物,以及植物与僵尸之间的互相攻击逻辑,在这一篇,我们先来将其中之一,也就是僵尸的进攻。

在src/app/layers下创建一个fightLayer.lua文件,创建fightLayer类继承Layer,我们先来说说这个类有那些属性:

植物类型属性choosePlantType,默认为NOT_PLANT,这些标志性的值在配置文件config.lua中声明;

地块上是否还可以放植物的属性lawnMatrix,是一个矩阵;

当前波数currentWaveNum和总波数totalWaveNum;

各种植物,产物以及僵尸的集合等等,以下就是我们的代码,每句代码都有注释(很简单的除外)

local scheduler = require(cc.PACKAGE_name .. ".scheduler")
local normalZombIEs = require("app.zombIEs.normalZombIEs")
local fightLayer = class("fightLayer",function()
return display.newLayer()
end)

function fightLayer:ctor()
-- 不屏蔽事件的传递
self:settouchSwallowEnabled(false)
-- 被选择的植物类型默认为NOT_PLANT 无植物
self.choosePlantType=NOT_PLANT
-- 标志土地位置是否可以放植物的矩阵 默认值都为true 都可以放植物
self.lawnMatrix={}
-- 初始化
self:initMatrix()
-- 当前波数
self.currentWaveNum=0
-- 总波数
self.totalWaveNum=10
-- 进度条
self.progresTimer=nil
-- 添加进度条
self:addGameProgress()
-- 防御型植物集合
self.defensePlants={}
-- 攻击型植物集合
self.attackPlants={}
-- 所有植物集合
self.allPlants={}
-- 僵尸集合
self.zombIEsList={}
-- 子d集合
self.bullets={}
-- 添加僵尸
self:addZombIEs()


end



function fightLayer:addGameProgress()
-- 游戏进程精灵
local spr=display.newSprite("fight/FlagMeterLevelProgress.png")
:align(display.RIGHT_top,display.wIDth,display.height)
:addTo(self)
-- 进度条背景
local progressBg=display.newSprite("fight/flagmeter.png")
:align(display.top_CENTER,display.wIDth-spr:getContentSize().wIDth/2,display.height-spr:getContentSize().height)
:addTo(self)
progressBg:setScale(0.5)
-- 进度条 第一个参数是进度条图片路径 第二个参数是进度条类型 PROGRESS_TIMER_bar表示为条形进度条
self.progresTimer=display.newProgresstimer("fight/progress.png",display.PROGRESS_TIMER_bar)
:align(display.CENTER,progressBg:getContentSize().wIDth/2,progressBg:getContentSize().height/2)
:addTo(progressBg)
-- 进度变化的起始位置 左中
self.progresTimer:setMIDpoint(cc.p(0,0.5))
-- 进度变化的方向 cc.p(1.0,0)表示水平变化 cc.p(0,1.0)表示竖直变化
self.progresTimer:setbarChangeRate(cc.p(1.0,0))
-- 进度一开始为0
self.progresTimer:setPercentage(0.0)
end

function fightLayer:addZombIEs()
-- 第一波是游戏开始5秒后出现,之后每20秒出现一波
scheduler.performWithDelayGlobal(function()
self:aWaveOfZombIEs()
self.addHandler=scheduler.scheduleGlobal(handler(self,self.aWaveOfZombIEs),20.0)
end,5.0)


end


function fightLayer:aWaveOfZombIEs()
-- 该函数的功能就是根据当前僵尸的波数创建僵尸,在僵尸出现完之后更新进度条
local fun=function()
-- 获取当前波僵尸数量
local zombIEsNum=self:getZombIEsNum()
for i=1,zombIEsNum do
-- 每隔两秒创建一只僵尸
scheduler.performWithDelayGlobal(function()
-- 获取僵尸的起始位置、终点位置和所在道路的行
local startPos,endPos,row=self:getStartAndEndPos()
-- 创建僵尸
local normalZombIEs=normalZombIEs.new()
:addTo(self)
normalZombIEs:setposition(startPos)
normalZombIEs.endPos=endPos
normalZombIEs.row=row
normalZombIEs:playWalk()
table.insert(self.zombIEsList,normalZombIEs)
end,2*i)
end
-- 当一波僵尸出完之后,更新进度条
scheduler.performWithDelayGlobal(function()
self.currentWaveNum=self.currentWaveNum+1
self.progresTimer:setPercentage(self.currentWaveNum/self.totalWaveNum*100)
end,2*zombIEsNum)
end
-- 如果是最后一波
if self.currentWaveNum==self.totalWaveNum-1 then
-- 显示最后一波字体
local finalWave=display.newSprite("fight/FinalWave.png")
:pos(display.cx,display.cy)
:addTo(self)
finalWave:runAction(cc.Sequence:create(cc.DelayTime:create(2.0),cc.CallFunc:create(function()
finalWave:removeFromParent()
fun()
-- 停止添加僵尸的调度器
scheduler.unscheduleGlobal(self.addHandler)
end)))
else
fun()
end
end

--根据当前波数返回当前波数僵尸的数量 越到后面一波僵尸的数量越多
function fightLayer:getZombIEsNum()
if self.currentWaveNum==9 then
return 15
elseif self.currentWaveNum>=6 then
return math.random(7,9)
elseif self.currentWaveNum>=3 then
return math.random(4,6)
else
return math.random(1,3)
end
end


function fightLayer:getStartAndEndPos()
-- 随机道路
local rode=math.random(1,5)
-- getobjectGroup 通过瓦片地图获取对象组 getobjects获取对象组中的对象,返回对象集合
local objects=self:getParent().map:getobjectGroup(string.format("rode%d",rode)):getobjects()
-- 这里的对象实质上是一个HashMap 键值对的集合体 属性名和属性的集合体
-- 第一个对象
local startObjA=objects[1]
-- 第二个对象
local startObjB=objects[2]
return cc.p(startObjA["x"],startObjA["y"]),cc.p(startObjB["x"],startObjB["y"]),rode
end
-- 初始化矩阵 有5条道路,每条道路上可以放置9个植物 默认这5*9个位置都是可以放植物的
function fightLayer:initMatrix()
for row=1,5 do
local colData={}
for col=1,9 do
table.insert(colData,true)
end
table.insert(self.lawnMatrix,colData)
end
end

以上就实现了我们随机添加僵尸,并且僵尸沿着指定路径行走,我们下面的思路是这样的:植物是如何添加的->植物类和植物的产物类是如何去创建->实现僵尸和植物互相攻击的逻辑。

总结

以上是内存溢出为你收集整理的使用Cocos2d-lua开发植物大战僵尸08-僵尸的出现全部内容,希望文章能够帮你解决使用Cocos2d-lua开发植物大战僵尸08-僵尸的出现所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

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

原文地址: http://outofmemory.cn/web/1074097.html

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

发表评论

登录后才能评论

评论列表(0条)

保存