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

这一篇开始,我们会用三四篇的篇幅来讲核心层,也就是战斗层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

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

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...