首页 > 代码库 > Quick Cocos2dx 场景对象基类实现

Quick Cocos2dx 场景对象基类实现

使用Quick-Cocos2d-x搭建一个横版过关游戏(四)拷来个进度条类,

但是由于那个类有个bug,在setProgress里面self.fill是找不到的,所以我改进了一下,代码如下:

 1 local Progress = class("Progress", function() 2     -- body 3     return display.newNode() 4 end) 5  6 function Progress:ctor(background, fill) 7     local progress = display.newSprite(background) 8     local fill = display.newProgressTimer(fill, display.PROGRESS_TIMER_BAR) 9     fill:setMidpoint(CCPoint(0,0.5))10     fill:setBarChangeRate(CCPoint(1.0,0))11     fill:setPosition(progress:getContentSize().width*0.5, progress:getContentSize().height*0.5)12     progress:addChild(fill)13     progress:scale(0.5)14     fill:setPercentage(100)15     self.fill = fill16     self:addChild(progress)17 end18 19 function Progress:setProgress(progress)20     -- body21     self.fill:setPercentage(progress)22 end23 24 return Progress

 

PS:其实还有一种解决办法,如下:

 1 local Progress = class("Progress", function( background, fill ) 2     -- body 3     local progress = display.newSprite(background) 4     local fill = display.newProgressTimer(fill, display.PROGRESS_TIMER_BAR) 5     fill:setMidpoint(CCPoint(0,0.5)) 6     fill:setBarChangeRate(CCPoint(1.0,0)) 7     fill:setPosition(progress:getContentSize().width*0.5, progress:getContentSize().height*0.5) 8     progress:addChild(fill) 9     progress:scale(0.5)10     fill:setPercentage(100)11     progress.fill = fill12     return progress13 end)

 

然后就是新增了一个角色的场景显示类GameUnit,暂时只用作角色显示,后续有功能再加,代码如下:

 1 local GameUnit = class("GameUnit", function() 2     -- body 3     return display.newNode() 4 end) 5  6 local Progress = import("app.views.Progress") 7  8 function GameUnit:ctor(hero) 9     -- body10     local clas = hero.class11     cc.EventProxy.new(hero, self)12         :addEventListener(clas.CHANGE_STATE_EVENT, handler(self, self.onStateChange))13         :addEventListener(clas.KILL_EVENT, handler(self, self.onKilled))14         :addEventListener(clas.HP_CHANGED_EVENT, handler(self, self.onHpChanged))15         :addEventListener(clas.EXP_CHANGED_EVENT, handler(self, self.onExpChanged))16 17     self.player = hero18     self:initDisplay()19 end20 21 function GameUnit:onStateChange( event )22     -- body23 end24 25 function GameUnit:onKilled( event)26     -- body27 end28 29 function GameUnit:onHpChanged( event )30     -- body31 end32 33 function GameUnit:onExpChanged( event )34     -- body35 end36 37 --初始化显示38 function GameUnit:initDisplay()39     -- 角色外观40     local shape41     if self.player ~= nil then42         --todo43         shape = CCArmature:create(self.player:getRes())44         local animation = shape:getAnimation()45         animation:setSpeedScale(0.4)46         animation:play("anim_idle")47         self:setPosition(self.player:getX(), self.player:getY())48         self:setScaleX(self.player:getDirection())49     else50         shape = display.newSprite("defaultimage.png")51     end52     self:addChild(shape)53     self.shape = shape54 55     --角色血条56     self.hpbar = Progress.new("progres_bg.png","progress.png")57     self:addChild(self.hpbar)58     self.hpbar:setProgress(50)59 end60 --传入|更新数据61 function GameUnit:setData()62     -- body63 end64 --取得数据65 function GameUnit:getData()66     return self.hero67 end68 --添加事件:重复利用这个对象的时候会用到69 function GameUnit:addEvents()70     -- body71 end72 --移除事件:重复利用这个对象的时候会用到73 function GameUnit:removeEvents()74     -- body75 end76 77 return GameUnit

GameUnit里面包含了一个显示游戏角色形象的Sprite和一个显示血条的Progress,我们可以根据情况选择是否对外公开更新显示的接口。

现在,我们游戏角色的状态变更相关逻辑都在这里处理就行了。

所以,我们可以这样子初始化角色显示对象:

1     local attacker = app:getObject("me")2     local attackerSp = GameUnit.new(attacker)3     self.layer:addChild(attackerSp)4     5 6     local enemy = app:getObject("enemy")7     local attackerSp1 = GameUnit.new(enemy)8     self.layer:addChild(attackerSp1)

 

以下是现在的效果图:

 

 

下一步需要完善的是游戏角色类根据起对应的行为改变更新显示。