这一篇开始,我们会用三四篇的篇幅来讲核心层,也就是战斗层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={} -- 子弹集合 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
以上就实现了我们随机添加僵尸,并且僵尸沿着指定路径行走,我们下面的思路是这样的:植物是如何添加的->植物类和植物的产物类是如何去创建->实现僵尸和植物互相攻击的逻辑。 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|