Laya:多元血条(BOSS的多管血)

必备资源:

必备资源.png

调用步骤:

1、定义类
private var _mutipleBossHpBar:BattlerMultipleHpBar = new BattlerMultipleHpBar();
2、初始化
if(_mutipleBossHpBar){
    _mutipleBossHpBar.x = posx;  //设置位置
    _mutipleBossHpBar.y = posy;
    _mutipleBossHpBar.initSkin("ui/battle/mutiple_waikuang.png","0,15,0,15",270,38,264,31,3,3,"0,12,0,12");
    parent.addChild(_mutipleBossHpBar); //添加到舞台/父节点
}
3、初始化数据
if(_mutipleBossHpBar){
    _mutipleBossHpBar.initData(curhp,maxhp,);
}
4、刷新血量
if(_mutipleBossHpBar)
    _mutipleBossHpBar.setHp(curhp,maxhp);

组件代码:

package Application.Logic.Battle.ui
{
    import Application.Logic.Battle.BattleManager;
    import Application.Logic.Battle.BattleSceneManager;
    
    import laya.events.Event;
    import laya.maths.Rectangle;
    import laya.ui.FontClip;
    import laya.ui.Image;
    import laya.ui.Label;
    import laya.utils.Ease;
    import laya.utils.Handler;
    import laya.utils.TimeLine;
    import laya.utils.Tween;

    public class BattlerMultipleHpBar extends Image
    {
        private var _barbg:Image = new Image();//最下层的底
        private var _barBottom:Image = new Image();//用来显示下一管血的颜色
        private var _barMiddle:Image = new Image();//做扣血效果的条
        private var _barTop:Image = new Image();//当前管的颜色
        
        //追加
        private var _barTopClipRect:Rectangle = new Rectangle();
        private var _barMiddleClipRect:Rectangle = new Rectangle();
        
        private var _barnumclip:FontClip = new FontClip();
        private var _barnumLabel:Label = new Label();
        private static var _maxbarnum:int=40;//最多20管血
        private static var _oncetime:int = 500;//一次扣血 不管多长 500ms播完
        
        private static var _colorSkins:Array=[
            "ui/battle/1mutiple_zise.png",
            "ui/battle/1mutiple_blue.png",
            "ui/battle/1mutiple_green.png",
            "ui/battle/1mutiple_chengse.png",
            "ui/battle/1mutiple_red.png"
        ];
        
        private var _barwidth:int=390;
        private var _curbarnum:int = 40;//当前多少管血
        private var _hpmax:int=100;//总血量
        private var _curhp:int=100;//当前还剩多少血量
        
        private var _curhpshow:int=100;//最上层血条显示的血量
        private var _oneBarHp:int = 5;//一管多少血
        
        private var _greyTween:Tween;
        private var _topTween:Tween;
        public function BattlerMultipleHpBar()
        {
            super();
        }
        
        //{width:100,time:10,barnum:20,issamebar:1}
        private var _tweenDatas:Array=[];
        private var _isplay:Boolean=false;
        
        public override function destroy(destroyChild:Boolean=true):void
        {
            
            if(_greyTween)
            {
                _greyTween.recover();
                _greyTween=null;
            }
            
            if(_topTween)
            {
                _topTween.recover();
                _topTween=null;
            }
            
            super.destroy(destroyChild);
        }
        
        public function initSkin(bgskin:String,bgSizeGrid:String,bgwidth:int,bgheight:int,barwidth:int,barheight:int,barxoffset:int,baryoffset:int,barSizeGrid:String):void
        {
            _barbg.skin = bgskin;
            _barbg.sizeGrid = bgSizeGrid;
            _barbg.width = bgwidth;
            _barbg.height = bgheight;
            if(!_barbg.parent)
                this.addChild(_barbg);
            
            _barBottom.width = barwidth;
            _barBottom.height = barheight;
            _barBottom.sizeGrid = barSizeGrid;
            _barBottom.x = barxoffset;
            _barBottom.y = baryoffset;
            if(!_barBottom.parent)
                this.addChild(_barBottom);
            
            _barMiddle.skin = "ui/battle/1mutiple_grey.png";
            _barMiddle.width = barwidth;
            _barMiddle.height = barheight;
            _barMiddle.sizeGrid = barSizeGrid;
            _barMiddle.x = barxoffset;
            _barMiddle.y = baryoffset;
            if(!_barMiddle.parent)
                this.addChild(_barMiddle);
            _barMiddleClipRect.x = _barMiddle.x-3;
            _barMiddleClipRect.y = _barMiddle.y-3;
            _barMiddleClipRect.height = barheight;
            _barMiddle.scrollRect = _barMiddleClipRect;

            
            _barTop.width = barwidth;
            _barTop.height = barheight;
            _barTop.sizeGrid = barSizeGrid;
            _barTop.x = barxoffset;
            _barTop.y = baryoffset;
            if(!_barTop.parent)
                this.addChild(_barTop);
            _barTopClipRect.x = _barTop.x-3;
            _barTopClipRect.y = _barTop.y-3;
            _barTopClipRect.height = barheight;
            _barTop.scrollRect = _barTopClipRect;

            
            _barnumclip.width = 100;
            _barnumclip.height = 60;
            _barnumclip.skin = "ui/mainInterface/number_vip.png";
            _barnumclip.sheet = "0123456789";
            _barnumclip.value = "20";
            _barnumclip.spaceX = 0;
            _barnumclip.align = "right";
            _barnumclip.scale(0.6,0.6);
            _barnumclip.x = bgwidth - 120;
            _barnumclip.y = bgheight/2-12;
            if(!_barnumclip.parent)
                this.addChild(_barnumclip);
            _barnumclip.visible=false;
            
            _barnumLabel.width = 100;
            _barnumLabel.height = 60;
            _barnumLabel.align= "right";
            _barnumLabel.color = "#ffffff";
            _barnumLabel.fontSize = 20;
            _barnumLabel.text = "x20"
            _barnumLabel.x = bgwidth - 115;
            _barnumLabel.y = bgheight/2-10;
            if(!_barnumLabel.parent)
                this.addChild(_barnumLabel);
            
            _barwidth = barwidth;
            
        }
        
        public function initData(curhp:int,maxhp:int,bossmaxhpmun:int=40):void
        {
            _maxbarnum = bossmaxhpmun;
            
            _hpmax = maxhp;
            _curhp = curhp;
            
            _oneBarHp = (_hpmax/_maxbarnum);
            
            _curbarnum = Math.ceil(_curhp/(_oneBarHp));
            if(_curbarnum>_maxbarnum)
                _curbarnum = _maxbarnum;

            _curhpshow = _computeCurHpShow(_curhp);
            
            
            
            _initBarSkinAndWidth();
        }
        
        //第一次初始化
        private function _initBarSkinAndWidth():void
        {
            //底
            if(_curbarnum==1)
            {
                _barBottom.skin="";
                _barBottom.width=0;
            }
            else
            {
                _barBottom.skin=_colorSkins[Math.ceil((_curbarnum-1-1)%5)];
                _barBottom.width = _barwidth;
            }
            
            //灰色bar
            //_barMiddle.width = _barwidth*(_curhpshow/Math.ceil(_oneBarHp));
            _barMiddleClipRect.width = _barwidth*(_curhpshow/Math.ceil(_oneBarHp));
            _barMiddle.visible=false;//默认灰色条是看不见的
            //topbar
            _barTop.skin = _colorSkins[Math.ceil((_curbarnum-1)%5)];
            //_barTop.width = Math.ceil(_barwidth*(_curhpshow/_oneBarHp));
            _barTopClipRect.width = Math.ceil(_barwidth*(_curhpshow/_oneBarHp));
            
            if(_barnumLabel)
            {
                if(_curhp == _hpmax)
                    _barnumLabel.text = "x"+_maxbarnum;
                else
                    _barnumLabel.text = "x"+(_curbarnum-1);
                
                if(_curbarnum == 1)
                {
                    _barnumLabel.visible=false;
                }else
                {
                    _barnumLabel.visible=true;
                }
            }
            
        }
        
        //计算出topbar显示的血量数量
        private function _computeCurHpShow(curhp:int):int
        {
            if(curhp==0)
                return 0;
            else
            {
                var tmp:int = Math.floor(curhp%(_oneBarHp));
                if(tmp==0)
                    return Math.floor(_oneBarHp);
                else
                    return tmp;
            }
            
        }
        
        public function setHp(curhp:int,maxhp:int):void
        {
            if(curhp<=0)
            {
                curhp = 0;
            }
            
            _hpmax = maxhp;
            
            var targetbarnum:int = Math.ceil(curhp/_oneBarHp);//目标管数
            if(targetbarnum>_maxbarnum)
                targetbarnum = _maxbarnum;
            
            if(targetbarnum<=0) targetbarnum=1;
            var targethpshow:int = _computeCurHpShow(curhp);//目标topbar血量
            
            //插入timeline数据
            var timecount:int=0;
            for(var i:int=_curbarnum;i>=targetbarnum;i--)
            {

                if(i==_curbarnum)//第一管
                {
                    if(i!=targetbarnum)//扣光
                    {
                        timecount = _curhpshow*(_oncetime/(_curhp-curhp));
                        //_topTimeLine.addLabel("costto0",0).to(_barTop,{width:0},timecount,Ease.linearNone,0);
                        _tweenDatas.push({"width":0,"time":timecount,"issamebar":0,"barnum":i,"greywidth":Math.floor(_curhpshow/_oneBarHp*_barwidth)});
                    }
                    else//还在同一管
                    {
                        
                        //_topTimeLine.addLabel("insamebar",0).to(_barTop,{width:Math.floor((_curhpshow-targethpshow)/_oneBarHp*_barwidth)},_oncetime,Ease.linearNone,0);
                        _tweenDatas.push({"width":Math.floor(targethpshow/_oneBarHp*_barwidth),"time":_oncetime,"issamebar":1,"barnum":i,"greywidth":Math.floor(_curhpshow/_oneBarHp*_barwidth)});
                        
                    }
                
                }
                else if(i!=_curbarnum&&i!=targetbarnum)//中间的管  有可能一次性扣几管血
                {
                    //从头扣到尾
                    timecount = _oneBarHp*(_oncetime/(_curhp-curhp));
                    //_topTimeLine.addLabel("costto0",0).to(_barTop,{width:0},timecount,Ease.linearNone,0);
                    _tweenDatas.push({"width":0,"time":timecount,"issamebar":0,"barnum":i,"greywidth":_barwidth});
                }
                else if(i!=_curbarnum&&i==targetbarnum)//最后一管血
                {
                    timecount = (_oneBarHp-targethpshow)*(_oncetime/(_curhp-curhp));
                    //_topTimeLine.addLabel("inotherbar",0).to(_barTop,{width:Math.floor(_barwidth*(targethpshow/_oneBarHp))},timecount,Ease.linearNone,0);
                    _tweenDatas.push({"width":Math.floor(_barwidth*(targethpshow/_oneBarHp)),"time":timecount,"issamebar":1,"barnum":i,"greywidth":_barwidth});
                }
                
            }
        
            _curhp = curhp;
            _curhpshow = targethpshow;
            _curbarnum = targetbarnum;
            
        
            _PlayHPBarEffect();
        }
    
        private function _PlayHPBarEffect():void
        {   
            
            //判断grey是否已经播完
            if(_greyTween)
            {
                _greyTween.complete();
                _barMiddle.visible=false;
            }
            
            if(_isplay)
                return;
            
            //开始播了
            _isplay=true;
            
            if(_tweenDatas.length>0)
            {
                //判断grey是否已经播完
//              if(_greyTween)
//              {
//                  _greyTween.complete();
//                  _barMiddle.visible=false;
//              }
                
                var data:Object = _tweenDatas[0];
                if(_topTween)
                {
                    //_topTween.to(_barTop,{width:data["width"]},data["time"]/2,Ease.linearNone,Handler.create(this,_onOneBarEffectFinished),0,false);
                    _topTween.to(_barTopClipRect,{width:data["width"]},data["time"]/2,Ease.linearNone,Handler.create(this,_onOneBarEffectFinished),0,false);
                }
                else
                {
                    //_topTween = Tween.to(_barTop,{width:data["width"]},data["time"]/2,Ease.linearNone,Handler.create(this,_onOneBarEffectFinished),0,false,false);
                    _topTween = Tween.to(_barTopClipRect,{width:data["width"]},data["time"]/2,Ease.linearNone,Handler.create(this,_onOneBarEffectFinished),0,false,false);
                }
                
                //如果就一个数据 要把灰条显示出来
                if(_tweenDatas.length==1)
                {
                    _barMiddle.visible=true;
                    //_barMiddle.width = data["greywidth"];
                    _barMiddleClipRect.width = data["greywidth"];
                    
                    if(_greyTween)
                    {
                        //_greyTween.to(_barMiddle,{width:data["width"]},data["time"],Ease.linearNone,Handler.create(this,_onGreyBarEffectFinished),data["time"]/2);
                        _greyTween.to(_barMiddleClipRect,{width:data["width"]},data["time"],Ease.linearNone,Handler.create(this,_onGreyBarEffectFinished),data["time"]/2);
                    }
                    else
                    {
                        //_greyTween = Tween.to(_barMiddle,{width:data["width"]},data["time"],Ease.linearNone,Handler.create(this,_onGreyBarEffectFinished),data["time"]/2,false,false);
                        _greyTween = Tween.to(_barMiddleClipRect,{width:data["width"]},data["time"],Ease.linearNone,Handler.create(this,_onGreyBarEffectFinished),data["time"]/2,false,false);
                    }
                }
                
            }
            else
            {
                _isplay=false;
                return;
            }
            
        }
        
        private function _onOneBarEffectFinished():void
        {
            if(_tweenDatas&&_tweenDatas[0])
            {
                var data:Object;
                if(_tweenDatas.length==1)//结束了 
                {
                    _isplay=false;
                    
                    data = _tweenDatas.shift();
                    
//                  if(_greyTween)
//                  {
//                      _greyTween.to(_barMiddle,{width:data["width"]},data["time"],Ease.linearNone,Handler.create(this,_onGreyBarEffectFinished));
//                  }
//                  else
//                  {
//                      _greyTween = Tween.to(_barMiddle,{width:data["width"]},data["time"],Ease.linearNone,Handler.create(this,_onGreyBarEffectFinished),0,false,false);
//                  }
                    
                    //判断血量是否为0 
                    if(BattleManager.instance.battleDatas.bossHp<=0)
                    {
                        BattleSceneManager.instance.doBossDeath();
                    }
                        
                    
                }
                else//后面还有 
                {
                    data = _tweenDatas[0];
                    if(data["issamebar"]==0)//设置颜色
                    {
                        _refreshBarSkin(parseInt(data["barnum"])-1);
                    }
                    
                    _tweenDatas.shift();//去掉头
                    data = _tweenDatas[0];
                    if(_topTween)
                    {
                        //_topTween.to(_barTop,{width:data["width"]},data["time"]/2,Ease.linearNone,Handler.create(this,_onOneBarEffectFinished),0,false);
                        _topTween.to(_barTopClipRect,{width:data["width"]},data["time"]/2,Ease.linearNone,Handler.create(this,_onOneBarEffectFinished),0,false);
                    }
                    else
                    {
                        //_topTween = Tween.to(_barTop,{width:data["width"]},data["time"]/2,Ease.linearNone,Handler.create(this,_onOneBarEffectFinished),0,false,false);
                        _topTween = Tween.to(_barTopClipRect,{width:data["width"]},data["time"]/2,Ease.linearNone,Handler.create(this,_onOneBarEffectFinished),0,false,false);
                    }
                    
                    if(_tweenDatas.length==1)//显示grey
                    {
                        _barMiddle.visible = true;
                        //_barMiddle.width = data["greywidth"];
                        _barMiddleClipRect.width = data["greywidth"];
                        
                        if(_greyTween)
                        {
                            //_greyTween.to(_barMiddle,{width:data["width"]},data["time"],Ease.linearNone,Handler.create(this,_onGreyBarEffectFinished),data["time"]/2);
                            _greyTween.to(_barMiddleClipRect,{width:data["width"]},data["time"],Ease.linearNone,Handler.create(this,_onGreyBarEffectFinished),data["time"]/2);
                            
                        }
                        else
                        {
                            //_greyTween = Tween.to(_barMiddle,{width:data["width"]},data["time"],Ease.linearNone,Handler.create(this,_onGreyBarEffectFinished),data["time"]/2,false,false);
                            _greyTween = Tween.to(_barMiddleClipRect,{width:data["width"]},data["time"],Ease.linearNone,Handler.create(this,_onGreyBarEffectFinished),data["time"]/2,false,false);
                        }
                    }
                    
                }
                

                
                //设置管数
//              if(_barnumclip)
//              {
//                  if(_curhp == _hpmax)
//                  {
//                      _barnumclip.value = "x"+_maxbarnum;
//                  }else
//                  {
//                      _barnumclip.value = "x"+(parseInt(data["barnum"])-1);
//                  }
//                  
//                  //_barnumclip.value = ""+(parseInt(data["barnum"]));
//                  
//                  if(parseInt(data["barnum"]) == 1)
//                  {
//                      _barnumclip.visible=false;
//                  }else
//                  {
//                      _barnumclip.visible=true;
//                  }
//              }
                
                if(_barnumLabel)
                {
                    if(_curhp == _hpmax)
                    {
                        _barnumLabel.text = "x"+_maxbarnum;
                    }else
                    {
                        _barnumLabel.text = "x"+(parseInt(data["barnum"])-1);
                    }
                    
                    //_barnumclip.value = ""+(parseInt(data["barnum"]));
                    
                    if(parseInt(data["barnum"]) == 1)
                    {
                        _barnumLabel.visible=false;
                    }else
                    {
                        _barnumLabel.visible=true;
                    }
                }
                
                
            }
            else
            {
                //发生错误
            }
        }
        
        
        private function _onGreyBarEffectFinished():void
        {
            _barMiddle.visible=false;
        }
        
        private function _refreshBarSkin(barnum:int):void
        {
            if(barnum==1)
            {
                _barBottom.skin="";
            }
            else
            {
                _barBottom.skin=_colorSkins[Math.floor((barnum-1-1)%5)];
            }
            
            _barTop.skin = _colorSkins[Math.floor((barnum-1)%5)];
            //_barTop.width = _barwidth;
            _barTopClipRect.width = _barwidth;
        }
        
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 207,113评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,644评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,340评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,449评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,445评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,166评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,442评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,105评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,601评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,066评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,161评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,792评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,351评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,352评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,584评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,618评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,916评论 2 344