从使用Quick-Cocos2d-x搭建一个横版过关游戏(四)拷来个进度条类,
但是由于那个类有个bug,在setProgress里面self.fill是找不到的,所以我改进了一下,代码如下:
local Progress = class("Progress", function()
-- body
return display.newNode()
end) function Progress:ctor(background, fill)
local progress = display.newSprite(background)
local fill = display.newProgressTimer(fill, display.PROGRESS_TIMER_BAR)
fill:setMidpoint(CCPoint(,0.5))
fill:setBarChangeRate(CCPoint(1.0,))
fill:setPosition(progress:getContentSize().width*0.5, progress:getContentSize().height*0.5)
progress:addChild(fill)
progress:scale(0.5)
fill:setPercentage()
self.fill = fill
self:addChild(progress)
end function Progress:setProgress(progress)
-- body
self.fill:setPercentage(progress)
end return Progress
PS:其实还有一种解决办法,如下:
local Progress = class("Progress", function( background, fill )
-- body
local progress = display.newSprite(background)
local fill = display.newProgressTimer(fill, display.PROGRESS_TIMER_BAR)
fill:setMidpoint(CCPoint(,0.5))
fill:setBarChangeRate(CCPoint(1.0,))
fill:setPosition(progress:getContentSize().width*0.5, progress:getContentSize().height*0.5)
progress:addChild(fill)
progress:scale(0.5)
fill:setPercentage()
progress.fill = fill
return progress
end)
然后就是新增了一个角色的场景显示类GameUnit,暂时只用作角色显示,后续有功能再加,代码如下:
local GameUnit = class("GameUnit", function()
-- body
return display.newNode()
end) local Progress = import("app.views.Progress") function GameUnit:ctor(hero)
-- body
local clas = hero.class
cc.EventProxy.new(hero, self)
:addEventListener(clas.CHANGE_STATE_EVENT, handler(self, self.onStateChange))
:addEventListener(clas.KILL_EVENT, handler(self, self.onKilled))
:addEventListener(clas.HP_CHANGED_EVENT, handler(self, self.onHpChanged))
:addEventListener(clas.EXP_CHANGED_EVENT, handler(self, self.onExpChanged)) self.player = hero
self:initDisplay()
end function GameUnit:onStateChange( event )
-- body
end function GameUnit:onKilled( event)
-- body
end function GameUnit:onHpChanged( event )
-- body
end function GameUnit:onExpChanged( event )
-- body
end --初始化显示
function GameUnit:initDisplay()
-- 角色外观
local shape
if self.player ~= nil then
--todo
shape = CCArmature:create(self.player:getRes())
local animation = shape:getAnimation()
animation:setSpeedScale(0.4)
animation:play("anim_idle")
self:setPosition(self.player:getX(), self.player:getY())
self:setScaleX(self.player:getDirection())
else
shape = display.newSprite("defaultimage.png")
end
self:addChild(shape)
self.shape = shape --角色血条
self.hpbar = Progress.new("progres_bg.png","progress.png")
self:addChild(self.hpbar)
self.hpbar:setProgress()
end
--传入|更新数据
function GameUnit:setData()
-- body
end
--取得数据
function GameUnit:getData()
return self.hero
end
--添加事件:重复利用这个对象的时候会用到
function GameUnit:addEvents()
-- body
end
--移除事件:重复利用这个对象的时候会用到
function GameUnit:removeEvents()
-- body
end return GameUnit
GameUnit里面包含了一个显示游戏角色形象的Sprite和一个显示血条的Progress,我们可以根据情况选择是否对外公开更新显示的接口。
现在,我们游戏角色的状态变更相关逻辑都在这里处理就行了。
所以,我们可以这样子初始化角色显示对象:
local attacker = app:getObject("me")
local attackerSp = GameUnit.new(attacker)
self.layer:addChild(attackerSp) local enemy = app:getObject("enemy")
local attackerSp1 = GameUnit.new(enemy)
self.layer:addChild(attackerSp1)
以下是现在的效果图:
下一步需要完善的是游戏角色类根据起对应的行为改变更新显示。