微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用Cocos2d-lua开发植物大战僵尸12-碰撞检测

TIPS:在最后我会附上游戏的源码和资源

我们在战斗层fightLayer中添加帧事件,检测僵尸和植物是否碰撞,碰撞的话则是僵尸攻击植物,同样检测子弹与僵尸是否碰撞,碰撞的话则是子弹打中僵尸。

我们先在fightLayer层的构造函数中启动帧函数

-- 帧事件
self:addNodeEventListener(cc.NODE_ENTER_FRAME_EVENT,handler(self,self.cheak))
self:scheduleUpdate()

cheak函数如下:

function fightLayer:cheak()
-- 僵尸攻击植物
-- 那每一个僵尸和所有植物去检查是否碰撞
for i,zombie in ipairs(self.zombiesList) do
local isCollision=false
for j,plant in ipairs(self.allPlants) do
-- 如果碰撞
if self:isCollision(zombie,plant,30,20) then
-- 僵尸攻击
zombie:playAttack()
-- 植物被攻击
plant:hurted(zombie:getAttackValue())
isCollision=true
break
end
end
-- 如果没有碰撞 则walk
if not isCollision then
zombie:playWalk()
end
end


-- 子弹攻击僵尸
for i,bullet in ipairs(self.bullets) do
for j,zombie in ipairs(self.zombiesList) do
if self:isCollision(bullet,zombie,20,30) then
-- 僵尸被攻击
zombie:beAttacked(bullet.attackValue)
-- 子弹消失
bullet:over()
break
end
end
end
-- 如果波数是最后一波并且僵尸全被消灭了
if self.currentWaveNum==self.totalWaveNum and #self.zombiesList==0 then
-- 停止帧事件
self:unscheduleUpdate()
app:enterScene("MenuScene",nil,"crossFade",0.5)
end

end


function fightLayer:isCollision(objA,objB,offsetX,offsetY)
local offset=20
local Ax=objA:getPositionX()
local Ay=objA:getPositionY()
local Bx=objB:getPositionX()
local By=objB:getPositionY()
if Ax<Bx+offsetX and Ax>Bx-offsetX and Ay<By+offsetY and Ay>By-offsetY then
return true
end
return false
end


最后附上源码和资源下载链接:->点击打开链接

原文地址:https://www.jb51.cc/cocos2dx/340871.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐