笔记五 :EgretH5通用MVC框架的入门操作:人物角色的渐动血条(UI部分)

前言:渐动血条是角色扮演游戏中一般都会使用到的表现技术,角色的健康值发生改变时,不是直接显示改变后的百分比,而是渐渐地向改变之后的数值靠近,能增强人物健康值增减的表现力,绝地求生,英雄联盟,冒险岛等等,甚至我所在的公司产品都用到了这种技术。

源代码:笔记五渐动血条

如图:

 

实现方法:在血条的背景图案之上,设置两个颜色一深一浅的血条,数值增加时,两个血条增速一致。数值减少时,浅色血条瞬间变化,而深色血条利用tween缓慢变化。

1.打开 \resource\skins\DemoSkin.exml 添加上血条的界面布局代码,如下:

	<e:Group width="481.82" height="162.12" x="268.09" y="0" anchorOffsetX="0" anchorOffsetY="0">
		<e:Image width="354.76" height="130.62" x="17.36" y="18.78" anchorOffsetX="0" anchorOffsetY="0" source="menu_bg"/>
		<e:Rect width="83.63" height="85.16" x="38.73" y="41.51" anchorOffsetX="0" anchorOffsetY="0"  scaleX="1" scaleY="1" fillColor="0xffffff"/>
		<e:Rect width="167" height="19" x="157.41" y="71.56" anchorOffsetX="0" anchorOffsetY="0" fillColor="0xffffff"/>
		<e:Rect id="lowHpRect" width="167" height="19" x="157.41" y="71.56" anchorOffsetX="0" anchorOffsetY="0" fillColor="0xff0202"/>
		<e:Rect id="fastHpRect" width="167" height="19" x="157.41" y="71.56" anchorOffsetX="0" anchorOffsetY="0" fillColor="0xff7a7a"/>
		<e:Button id="addHP" label="+" x="175.24" y="105.67" anchorOffsetX="0" width="39" anchorOffsetY="0" height="38"/>
		<e:Button id="downHP" label="-" x="240.91" y="107.67" anchorOffsetX="0" width="33" anchorOffsetY="0" height="34"/>
	</e:Group>

DemoSkin.exml 参考代码:

<?xml version="1.0" encoding="utf-8"?>
<e:Skin class="DemoSkin" width="650" height="1000" xmlns:e="http://ns.egret.com/eui" xmlns:w="http://ns.egret.com/wing" xmlns:ns1="*">
	<e:Image width="362" height="48" x="19" y="232" anchorOffsetX="0" anchorOffsetY="0" source="table_cloud_top" fillMode="repeat" visible="false"/>
	<e:Group width="450" height="108" anchorOffsetX="0" anchorOffsetY="0" horizontalCenter="0" bottom="0">
		<e:Rect width="448" height="67" x="1.3199999999999932" y="42.24000000000001" fillColor="0xebfff8" anchorOffsetX="0" anchorOffsetY="0" scaleX="1" scaleY="1"/>
		<e:Image width="449" height="41.99" x="449.20000000000005" y="50.24000000000001" anchorOffsetX="0" anchorOffsetY="0" source="table_cloud_top" fillMode="repeat" rotation="180.16" scaleX="1" scaleY="1"/>
		<e:ToggleButton id="button" label="ToggleButton" x="45" y="32" anchorOffsetX="0" width="74" anchorOffsetY="0" height="75" skinName="MenuButtonSkin" scaleX="1" scaleY="1"/>
		<e:ToggleButton id="button2" label="ToggleButton" x="140.76" y="32" anchorOffsetX="0" width="74" anchorOffsetY="0" height="75" skinName="MenuButtonSkin" scaleX="1" scaleY="1"/>
		<e:ToggleButton id="button3" label="ToggleButton" x="237" y="32" anchorOffsetX="0" width="74" anchorOffsetY="0" height="75" skinName="MenuButtonSkin" scaleX="1" scaleY="1"/>
		<e:ToggleButton id="button4" label="ToggleButton" x="335" y="32" anchorOffsetX="0" width="74" anchorOffsetY="0" height="75" skinName="MenuButtonSkin" scaleX="1" scaleY="1"/>
	</e:Group>
	<e:Group width="610.61" height="192.42" x="0" y="178.79" anchorOffsetX="0" anchorOffsetY="0">
		<ns1:Menu id="menu" x="78" y="37.21000000000001" skinName="MenuSkin" scaleX="1" scaleY="1" visible="false"/>
		<e:Rect id="maskRect" width="530.61" height="191.22" x="77.72" y="0" anchorOffsetX="0" anchorOffsetY="0" scaleX="1" scaleY="1"/>
		<e:ToggleButton id="menuBtn" label="切换按钮" skinName="MenuButtonSkin" x="14" y="58.210000000000036" scaleX="1" scaleY="1"/>
	</e:Group>
	<e:Group width="481.82" height="162.12" x="268.09" y="0" anchorOffsetX="0" anchorOffsetY="0">
		<e:Image width="354.76" height="130.62" x="17.36" y="18.78" anchorOffsetX="0" anchorOffsetY="0" source="menu_bg"/>
		<e:Rect width="83.63" height="85.16" x="38.73" y="41.51" anchorOffsetX="0" anchorOffsetY="0"  scaleX="1" scaleY="1" fillColor="0xffffff"/>
		<e:Rect width="167" height="19" x="157.41" y="71.56" anchorOffsetX="0" anchorOffsetY="0" fillColor="0xffffff"/>
		<e:Rect id="lowHpRect" width="167" height="19" x="157.41" y="71.56" anchorOffsetX="0" anchorOffsetY="0" fillColor="0xff0202"/>
		<e:Rect id="fastHpRect" width="167" height="19" x="157.41" y="71.56" anchorOffsetX="0" anchorOffsetY="0" fillColor="0xff7a7a"/>
		<e:Button id="addHP" label="+" x="175.24" y="105.67" anchorOffsetX="0" width="39" anchorOffsetY="0" height="38"/>
		<e:Button id="downHP" label="-" x="240.91" y="107.67" anchorOffsetX="0" width="33" anchorOffsetY="0" height="34"/>
	</e:Group>
</e:Skin>

 

2.打开\src\example\module\demo\DemoView.ts  添加 血条渐变的核心代码 以及 两个测试按钮的事件

血条渐变的核心代码:

    //初始化initHpBar;
    private initHpBar():void{
        this.updateHpBar(1);
    }

    private HpBarNumNow:number = 0;//HP栏目前显示的数值
    private HpBarV:number = 0.2;//Hp扣除时衰减的速度
    /**更新血条状态 */
    private updateHpBar(NumUpdate: number): void { //需要更新成的数值
        let self = this;
        if (NumUpdate > self.HpBarNumNow) {//更新的数值大于目前的数值时的逻辑
            let tween;
            //第一个条同时进行缓慢增长,实心的那条
            egret.Tween.removeTweens(self.fastHpRect);//播放前先清除之前的动画
            let tempHpNum:number = self.fastHpRect.scaleX;//动画是从目前的长度开始进行
            tween = egret.Tween.get(self.fastHpRect).to({ scaleX: tempHpNum }, 0).to({ scaleX: NumUpdate }, 1200).call(function () { 
             });
            //第二个条同时进行缓慢增长
            egret.Tween.removeTweens(self.lowHpRect);//播放前先清除之前的动画
            tempHpNum = self.fastHpRect.scaleX;//动画是从目前的长度开始进行
            tween = egret.Tween.get(self.lowHpRect).to({ scaleX: tempHpNum }, 0).to({ scaleX: NumUpdate }, 1200).call(function () { 
             });
            self.HpBarNumNow = NumUpdate; //HP栏目前的数值进行更新
            console.log("这是之前的HpBarNumNow,NumUpdate",self.HpBarNumNow,NumUpdate);
        } else if(NumUpdate < self.HpBarNumNow){//更新的数值小于目前的数值时的逻辑
            let tween;
            let tempHpNum:number = self.lowHpRect.scaleX;//动画是从目前的长度开始进行
            egret.Tween.removeTweens(self.lowHpRect);播放动画前先清除之前的动画
            let t:number = (NumUpdate - tempHpNum)/this.HpBarV * 1000;//根据衰减时间计算衰减速度
            if(t < 0) t=-t;   //取绝对值
            tween = egret.Tween.get(self.lowHpRect).to({ scaleX: tempHpNum }, 0).to({ scaleX: NumUpdate }, t);
            egret.Tween.removeTweens(self.fastHpRect);瞬变前先清除之前的动画
            self.fastHpRect.scaleX = NumUpdate;   //血条减血时瞬变
            self.HpBarNumNow = NumUpdate;
        }
    }

主要是分为两个部分,一个是血条增加,一深一浅同时缓慢增加。一个是血条减少,深的慢慢减少,浅的直接设定值瞬变。

在 public initUI(): void函数中初始化 血条渐变:

 this.initHpBar();

设定测试按钮:

    addHP: eui.Button;
    downHP: eui.Button;

在 public initUI(): void函数中配置测试按钮的监听:

        this.addHP.addEventListener(egret.TouchEvent.TOUCH_TAP, this.addbuttonClickHandler, this);
        this.downHP.addEventListener(egret.TouchEvent.TOUCH_TAP, this.downbuttonClickHandler, this);

测试按钮绑定的事件:

    private tempnum = 1;
    private addbuttonClickHandler(): void {
        if ((this.tempnum + 0.2) <= 1.0) {
            this.tempnum += 0.2;
        }
        this.updateHpBar(this.tempnum);
    }

    private downbuttonClickHandler(): void {
        if ((this.tempnum - 0.2) >= 0) {
            this.tempnum -= 0.2;
        }
        this.updateHpBar(this.tempnum);
    }

DemoView.ts参考代码:

/**
 * Created by egret on 15-1-6.
 */
class DemoView extends BaseEuiView {
    public constructor($controller: BaseController, $parent: eui.Group) {
        super($controller, $parent);
        this.skinName = "resource/skins/DemoSkin.exml";
    }

    button: eui.ToggleButton;
    //展开菜单
    menuBtn: eui.Button;
    maskRect: eui.Rect;
    menu: Menu;
    //hp条
    lowHpRect: eui.Rect;
    fastHpRect: eui.Rect;
    addHP: eui.Button;
    downHP: eui.Button;
    //this.dispatchEvent(daterEvent);
    /**
     *对面板进行显示初始化,用于子类继承
     *
     */
    public initUI(): void {
        super.initUI();
        this.button.addEventListener(egret.TouchEvent.TOUCH_TAP, this.buttonClickHandler, this);
        this.menuBtn.addEventListener(egret.TouchEvent.TOUCH_TAP, this.menubuttonClickHandler, this);
        this.addHP.addEventListener(egret.TouchEvent.TOUCH_TAP, this.addbuttonClickHandler, this);
        this.downHP.addEventListener(egret.TouchEvent.TOUCH_TAP, this.downbuttonClickHandler, this);
        GameDispatcher.getInstance().addEventListener(EventName.MAINBAR_CLOSE, this.restoreButton, this);//监听界面的关闭

        //为左边的弹出菜单设定遮罩
        this.menu.mask = this.maskRect;
        //人物血条的变化
        this.initHpBar();
    }

    private buttonClickHandler(e: egret.TouchEvent): void {
        App.ViewManager.playopen(2, ViewConst.Friend);
    }
    /**左边中间的那个折叠菜单的按钮事件 */
    private menubuttonClickHandler(e: egret.TouchEvent): void {
        let tween;
        let self = this;
        if (self.menu.$visible) {
            self.menuBtn.touchEnabled = false;//播放动画时不可再次按按钮
            tween = egret.Tween.get(this.menu).to({ scaleX: 1.0, scaleY: 1.0, x: 100 }, 0).to({ scaleX: 1.0, scaleY: 1.0, x: -400 }, 460).call(function () { self.menu.$setVisible(false); self.menuBtn.touchEnabled = true; });
        } else {
            self.menu.$setVisible(true);
            self.menuBtn.touchEnabled = false;//播放动画时不可再次按按钮
            tween = egret.Tween.get(this.menu).to({ scaleX: 1.0, scaleY: 1.0, x: -400 }, 0).to({ scaleX: 1.0, scaleY: 1.0, x: 100 }, 460).call(function () { self.menuBtn.touchEnabled = true; });
        }
    }
    //关闭窗口时候的按钮恢复状态
    private restoreButton(): void {
        console.log("restoreButton");
        this.button.selected = false;
    }

    //初始化initHpBar;
    private initHpBar():void{
        this.updateHpBar(1);
    }

    private HpBarNumNow:number = 0;//HP栏目前显示的数值
    private HpBarV:number = 0.2;//Hp扣除时衰减的速度
    /**更新血条状态 */
    private updateHpBar(NumUpdate: number): void { //需要更新成的数值
        let self = this;
        if (NumUpdate > self.HpBarNumNow) {//更新的数值大于目前的数值时的逻辑
            let tween;
            //第一个条同时进行缓慢增长,实心的那条
            egret.Tween.removeTweens(self.fastHpRect);//播放前先清除之前的动画
            let tempHpNum:number = self.fastHpRect.scaleX;//动画是从目前的长度开始进行
            tween = egret.Tween.get(self.fastHpRect).to({ scaleX: tempHpNum }, 0).to({ scaleX: NumUpdate }, 1200).call(function () { 
             });
            //第二个条同时进行缓慢增长
            egret.Tween.removeTweens(self.lowHpRect);//播放前先清除之前的动画
            tempHpNum = self.fastHpRect.scaleX;//动画是从目前的长度开始进行
            tween = egret.Tween.get(self.lowHpRect).to({ scaleX: tempHpNum }, 0).to({ scaleX: NumUpdate }, 1200).call(function () { 
             });
            self.HpBarNumNow = NumUpdate; //HP栏目前的数值进行更新
            console.log("这是之前的HpBarNumNow,NumUpdate",self.HpBarNumNow,NumUpdate);
        } else if(NumUpdate < self.HpBarNumNow){//更新的数值小于目前的数值时的逻辑
            let tween;
            let tempHpNum:number = self.lowHpRect.scaleX;//动画是从目前的长度开始进行
            egret.Tween.removeTweens(self.lowHpRect);播放动画前先清除之前的动画
            let t:number = (NumUpdate - tempHpNum)/this.HpBarV * 1000;//根据衰减时间计算衰减速度
            if(t < 0) t=-t;   //取绝对值
            tween = egret.Tween.get(self.lowHpRect).to({ scaleX: tempHpNum }, 0).to({ scaleX: NumUpdate }, t);
            egret.Tween.removeTweens(self.fastHpRect);瞬变前先清除之前的动画
            self.fastHpRect.scaleX = NumUpdate;   //血条减血时瞬变
            self.HpBarNumNow = NumUpdate;
        }
    }

    private tempnum = 1;
    private addbuttonClickHandler(): void {
        if ((this.tempnum + 0.2) <= 1.0) {
            this.tempnum += 0.2;
        }
        this.updateHpBar(this.tempnum);
    }

    private downbuttonClickHandler(): void {
        if ((this.tempnum - 0.2) >= 0) {
            this.tempnum -= 0.2;
        }
        this.updateHpBar(this.tempnum);
    }

}

 

3.留下了一个待解决的问题:
点击两次扣血之后,再次点击加血,会把缓动的血条直接消失掉
这是因为命令时瞬发的,点击一次瞬发一次,假如血条需要一会儿减少,一会儿增加,就需要两条命令。
解决办法:
点击瞬发的时候,就用数学公式计算好缓动血条的减少时间与增加时间进行修复,以后有时间再来解决这个问题。
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值