我们在主场景的触摸事件中,已经判定了玩家选择的植物类型,以及放置的位置,并把它们设置给了战斗层FightLayer,然后调用FightLayer的添加植物方法addPlant添加了植物,植物类的创建我会在后面讲到,现在我们就先当这些类是存在的就好了;我们就来看看这个函数的实现:
因为要用到植物对象,所以我们先把植物类导进来:
local Nut = require("app.plant.Nut")
local Pease = require("app.plant.Pease")
local SunFlower = require("app.plant.SunFlower")
function FightLayer:addPlant(event)
-- checkint 检查是否为数字并且转换为整形
-- 根据玩家所点的位置,计算出行数和列数
local col=checkint((event.x+LAWN_WIDTH/2-58)/LAWN_WIDTH)
local row=checkint((event.y+LAWN_HEIGHT/2)/LAWN_HEIGHT)
-- 如果越界,返回
if col<1 or col >9 or row<1 or row>5 then
return
end
-- 如果对应的位置可以放植物并且植物类型不为NOT_PLANT,即说明玩家有选择某一种类型的植物
if self.lawnMatrix[row][col] and self.choosePlantType~=NOT_PLANT then
-- 在该行该列中添加对应类型的植物
self:addPlantObj(row,col)
-- 此时该位置不能放植物了
self.lawnMatrix[row][col]=false
-- 植物添加之后,表示有没有选择植物
self.choosePlantType=NOT_PLANT
-- 被选择的卡片
local plantCard=self:getParent().myPlants[self:getParent().clickCardIndex]
-- 玩家能力值减少
self:getParent().dataLayer:loseEnergy(plantCard.energy)
self:getParent().clickCardIndex=0
-- 卡片冷却
plantCard.isCooling=true
-- 5秒后冷却结束
plantCard.plantCard:runAction(cc.Sequence:create(cc.FadeTo:create(5.0,255),cc.CallFunc:create(function()
plantCard.isCooling=false
end)))
end
end
更具植物类型创建并添加植物
function FightLayer:addPlantObj(row,col)
local plant=nil
-- 如果是坚果类型
if self.choosePlantType==NUT then
-- 创建坚果
plant = Nut.new()
:addTo(self)
-- 添加到非攻击类型植物的数组中
table.insert(self.defensePlants,plant)
elseif self.choosePlantType==SUNFLOWER then
-- print("添加向日葵")
plant = SunFlower.new()
:addTo(self)
table.insert(self.defensePlants,plant)
elseif self.choosePlantType==PEASE then
-- print("添加豌豆射手")
plant = Pease.new()
:addTo(self)
table.insert(self.attackPlants,plant)
end
-- 植物所在列和行
plant.row=row
plant.col=col
-- 将植物添加到植物table中
table.insert(self.allPlants,plant)
-- 更具行列数设置植物的位置
plant:setPosition(cc.p(col*LAWN_WIDTH+40,row*LAWN_HEIGHT-15))
end
运行效果如下: