僵尸也是分类的,比如什么普通僵尸啊,铁桶僵尸啊之类的,所以我们要写一个僵尸的基类,叫做ZombIEsBase,僵尸基类包含了僵尸都共同拥有的一些属性,僵尸的属性也比较多,有类型zombIEsType,总血量totalHP,当前血量currentHP等等,僵尸也有各种动作,比如走路,吃植物,头掉下来等动画,所以基类要写一个播放动画的函数palyAnim,僵尸会随机从五条道路的其中一条出现,我们在前面的地图编辑器中以及创建了五个对象组,每个对象组中有两个对象,代表着僵尸的其实位置和终点位置,所以我们再写一个僵尸的move函数,让其从起始点走到终点,并回调结束游戏结束函数, 具体代码实现如下:
-- 僵尸基类
local scheduler = require(cc.PACKAGE_name .. ".scheduler")
local ZombIEsBase = class("ZombIEsBase",function()
return display.newNode()
end)
function ZombIEsBase:ctor(type)
-- 僵尸类型
self.zombIEsType=type
-- 总血量
self.totalHP=0
-- 当前血量
self.currentHP=0
-- 攻击力
self.attackValue=0
-- 速度
self.speed=0
-- 是否掉了头
self.isLosehead=false
-- 僵尸前进的终点
self.endPos=nil
-- 道路所在行数
self.row=-1
-- 根据类型创建僵尸图片所在路径
self.path=string.format("zombIEs/zombIEs_%d/",self.zombIEsType)
-- 创建僵尸
self.zombIEs=display.newSprite(string.format(self.path.."walk/z_%d_01.png",self.zombIEsType))
:align(display.left_BottOM,0)
:addTo(self)
self.zombIEs:setScale(0.5)
self:setContentSize(cc.size(self.zombIEs:getContentSize().wIDth*0.5,self.zombIEs:getContentSize().height*0.5))
-- 僵尸的锚点,设置在脚下
self:setAnchorPoint(cc.p(0.5,0.3))
end
-- 僵尸播放动画的函数
-- animKey 缓存动画的key imageNum 帧数 path图片路径 isRepeat 动画是否循环 callBack回调函数
function ZombIEsBase:palyAnim(animKey,imageNum,path,isRepeat,callBack)
local animation=display.getAnimationCache(animKey)
if animation==nil then
animation=cc.Animation:create()
local rect={x=0,y=0,wIDth=self.zombIEs:getContentSize().wIDth,height=self.zombIEs:getContentSize().height}
for i=1,imageNum do
animation:addSpriteFrame(cc.SpriteFrame:create(string.format(path,i),rect))
end
animation:setDelayPerUnit(0.2)
display.setAnimationCache(animKey,animation)
end
if self.animAction then
self.zombIEs:stopAction(self.animAction)
end
if isRepeat then
self.animAction=cc.RepeatForever:create(cc.Animate:create(animation))
else
self.animAction=cc.Sequence:create(cc.Animate:create(animation),cc.CallFunc:create(callBack))
end
self.zombIEs:runAction(self.animAction)
end
-- 僵尸的BoundingBox
function ZombIEsBase:getRect()
return cc.rect(self:getpositionX()-self:getContentSize().wIDth/2,self:getpositionY(),
self:getContentSize().wIDth,self:getContentSize().height)
end
-- 僵尸的移动
function ZombIEsBase:move()
-- 根据僵尸的行走距离以及移动速度获取僵尸的移动时间
local time=self:getTwoPosdistance(self:getpositionX(),self.endPos.x,self.endPos.y)/self.speed
self:runAction(cc.Sequence:create(cc.Moveto:create(time,self.endPos),cc.CallFunc:create(function()
scheduler.unscheduleGlobal(self:getParent().addHandler)
self:getParent():unscheduleUpdate()
self:removeFromParent()
app:enterScene("GameOverScene",nil,"crossFade",1.0)
end)))
end
-- 两点间的距离
function ZombIEsBase:getTwoPosdistance(x1,y1,x2,y2)
return math.sqrt(math.pow(math.abs(x1-x2),2)+math.pow(math.abs(y1-y2),2))
end
return ZombIEsBase
以上就是僵尸基类的实现
在这里我们只创建一种僵尸,就是普通僵尸,普通僵尸继承上面我们创建的僵尸基类。
所以我们在src/app/zombIEs下创建normalZombIEs.lua文件,代码如下:
local scheduler = require(cc.PACKAGE_name .. ".scheduler")
local ZombIEsBase = require("app.zombIEs.ZombIEsBase")
local normalZombIEs = class("normalZombIEs",function()
return ZombIEsBase.new(norMAL_ZOMBIES)
end)
function normalZombIEs:ctor()
-- 初始化普通僵尸的数值
self.totalHP=10
self.currentHP=self.totalHP
self.attackValue=1
self.speed=30
self.isOnceLosehead=true
self.isDIE=false
self.isAttacking=false
self.isWalking=false
self.isLosehead=false
-- 创建普通僵尸摇晃图片路径
local path=string.format(self.path.."shake/z_%d_",norMAL_ZOMBIES).."%02d.png"
-- 默认僵尸动画为摇晃动画
self:palyAnim("normal_shake",2,true)
self.canAttack=true
end
-- 僵尸的走路动画
function normalZombIEs:playWalk()
-- 如果僵尸不是走路状态
if not self.isWalking then
-- 如果僵尸没头
if self.isLosehead then
local path=string.format(self.path.."work_losthead/z_%d_losthead_",norMAL_ZOMBIES).."%02d.png"
self:palyAnim("normal_noheadWalk",9,true)
else
local path=string.format(self.path.."walk/z_%d_",norMAL_ZOMBIES).."%02d.png"
self:palyAnim("normal_walk",7,true)
end
self:move()
-- 非攻击状态
self.isAttacking=false
-- 走路状态
self.isWalking=true
end
end
-- 僵尸的攻击动画
function normalZombIEs:playAttack()
if not self.isAttacking then
self:stopAllActions()
if self.isLosehead then
local path=string.format(self.path.."attack_losthead/z_%d_attack_losthead_",norMAL_ZOMBIES).."%02d.png"
self:palyAnim("normal_noheadAttack",8,true)
else
local path=string.format(self.path.."attack/z_%d_attack_",norMAL_ZOMBIES).."%02d.png"
self:palyAnim("normal_attack",10,true)
end
self.isAttacking=true
self.isWalking=false
end
end
-- 僵尸死亡动画
function normalZombIEs:playDIE()
-- 将僵尸从僵尸表中移除
table.removebyvalue(self:getParent().zombIEsList,self)
self:stopAllActions()
-- 播放死亡动画 移除
local path=string.format(self.path.."dIE/z_%d_dIE_",norMAL_ZOMBIES).."%02d.png"
self:palyAnim("normal_dIE",6,false,function()
self:removeFromParent()
end)
end
-- 掉头动画
function normalZombIEs:playLosehead()
-- 这里僵尸并没有在攻击状态和走路状态,设置为true只是为了让这两种动画无法执行
self.isAttacking=true
self.isWalking=true
self:stopAllActions()
local path=string.format(self.path.."head/z_%d_head_",norMAL_ZOMBIES).."%02d.png"
self:palyAnim("normal_losehead",function()
self.isLosehead=true
self.isAttacking=false
self.isWalking=false
end)
end
-- 僵尸被攻击函数,参数为植物的攻击力
function normalZombIEs:beAttacked(plantAttakValue)
-- 更新血量
self.currentHP=self.currentHP-plantAttakValue
-- 如果血量小于0,僵尸死亡,播放死亡动画
if self.currentHP<=0 and not self.isDIE then
self.isDIE=true
self:playDIE()
-- 否则如果僵尸血量小于总的一般并且头颅还在,则播放掉头动画
elseif self.currentHP<=self.totalHP/2 and self.isOnceLosehead then
self.isOnceLosehead=false
self:playLosehead()
end
end
-- 获取僵尸的攻击力
function normalZombIEs:getAttackValue()
-- 僵尸每隔1秒攻击1次
if self.canAttack then
self.canAttack=false
scheduler.performWithDelayGlobal(function()
self.canAttack=true
end,1.0)
return self.attackValue
else
return 0
end
end
return normalZombIEs
这样一来,僵尸也就创建好了
总结以上是内存溢出为你收集整理的使用Cocos2d-lua开发植物大战僵尸06-僵尸类的实现全部内容,希望文章能够帮你解决使用Cocos2d-lua开发植物大战僵尸06-僵尸类的实现所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)