egret 通过自带api实现进度条

首先看看ProgressBar类:


class ProgressBar extends egret.Sprite implements RES.PromiseTaskReporter{

    private timer: number = 0;
    private guard: number = 0;

    private changeBar: egret.Shape;

    public realWidth = 600 - 14;
    public realHeight = 36;

    private space: number = 60;
    // 进度条外边框颜色
    private outerColor: number = 0xffffff;
    private backColor: number = 0xff0000;
    private changeColor: number = 0x008899;

    // 加载比例
    private rate: number = 0;
    public constructor() {
        super();
        this.addEventListener(egret.Event.ADDED_TO_STAGE,this.init,this);
        this.addEventListener(egret.Event.ENTER_FRAME,this.update,this);
    }
    // 设置真实长度和高度
    public setWidthHeight(realWidth: number,realHeight: number): void {
        this.realWidth = realWidth;
        this.realHeight = realHeight;
    }
    // 设置进度条的背景色
    public setColor(outerColor: number,backColor: number,changeColor: number) {
        this.outerColor = outerColor;
        this.backColor = backColor;
        this.changeColor = changeColor;
    }
    // 初始化进度条
    public init(): void {
        // 绘制背景
        let progressShape = new egret.Shape();
        let progressGraphics = progressShape.graphics;
        progressGraphics.beginFill(this.outerColor);
        let spance: number = 60;
        progressGraphics.drawRoundRect(0,50,this.realWidth + 14,this.realHeight + 14,50);
        progressGraphics.endFill();
        this.addChild(progressShape);
        let topProgress = new egret.Shape();
        let topProgressGra: egret.Graphics = topProgress.graphics;
        topProgressGra.beginFill(this.backColor);
        topProgressGra.drawRoundRect(7,50 + 7,this.realWidth,this.realHeight,36);
        topProgressGra.endFill();
        this.addChild(topProgress);
    }
    // 帧循环
    private update(event: egret.Event): void {
        // console.log("event is ",event);
        let beforeTime = this.timer;
        let interval = (egret.getTimer() - beforeTime) / 1000;
        // console.log("interval is ",interval);
        // 更新比例同步绘制进度条
        this.drawUpdateByRate(this.rate);
        this.timer = egret.getTimer();
    }
    public onProgress(current: number, total: number): void {
        console.log("current is ",current," and total is ",total);
        // 将加载比例赋值
        this.rate = current / total;
    }
    private drawUpdateByRate(rate: number): void {
        let w = rate * this.realWidth;
        if(!this.changeBar) {
            this.changeBar = new egret.Shape();
            
        }
        let tempGra = this.changeBar.graphics;
        let spaceNum: number = w / this.space;
        for(let i = 0; i < spaceNum; i++) {
            tempGra.clear();
            tempGra.beginFill(this.changeColor);
            tempGra.lineStyle(5,0xff0000);
            tempGra.drawRoundRect(7,50 + 7,w,this.realHeight,50);
        }
        if(this.changeBar) {
            // this.changeBar.width = this.changeBar.getBounds().width;
            let textureRender: egret.RenderTexture = new egret.RenderTexture()
            textureRender.drawToTexture(this.changeBar);
            let bar: egret.Bitmap = new egret.Bitmap(textureRender);
            let container: egret.DisplayObjectContainer = new egret.DisplayObjectContainer();
            container.addChild(bar);
            this.addChild(container);
        }
        if(rate === 1 && this.parent && this.parent.contains(this)) {
            let self = this;
            // 从父节点移除该节点(延迟500ms)
            setTimeout(() => {
                if(self.parent && self.parent.contains && self.parent.contains(self)) {
                    self.parent.removeChild(self);
                }
            },500);
        } 

    }
}

 然后就是在加载资源组的地方调用它就行了

await RES.loadGroup("preload", 0,new ProgressBar());

 

在 Egret 中,可以使用 RenderTexture 和 BlendMode 来实现渲染批次。 渲染批次是指将多个绘制操作合并为一个批次,从而减少绘制次数,提高游戏性能。 具体实现步骤如下: 1. 创建一个 RenderTexture 对象,将要渲染的显示对象添加到 RenderTexture 中。 2. 使用 BlendMode 设置渲染模式,将多个 RenderTexture 合并为一个批次。 示例代码如下: ``` // 创建一个 RenderTexture 对象 var renderTexture: egret.RenderTexture = new egret.RenderTexture(); renderTexture.drawToTexture(displayObject); // 设置 BlendMode renderTexture.blendMode = egret.BlendMode.ADD; ``` 在使用 RenderTexture 进行渲染时,可以将多个 RenderTexture 合并为一个批次,从而减少绘制次数,提高游戏性能。例如,可以将多个 RenderTexture 合并到一个 Bitmap 中进行渲染,代码如下: ``` // 创建一个 Bitmap 对象 var bitmap: egret.Bitmap = new egret.Bitmap(); bitmap.width = 800; bitmap.height = 600; // 创建多个 RenderTexture 对象 var renderTexture1: egret.RenderTexture = new egret.RenderTexture(); var renderTexture2: egret.RenderTexture = new egret.RenderTexture(); renderTexture1.drawToTexture(displayObject1); renderTexture2.drawToTexture(displayObject2); // 合并 RenderTexture bitmap.texture = new egret.RenderTexture(); bitmap.texture.drawToTexture(renderTexture1); bitmap.texture.drawToTexture(renderTexture2); // 设置 BlendMode bitmap.blendMode = egret.BlendMode.ADD; ``` 注意,使用渲染批次时需要注意渲染顺序和深度问题,以避免出现渲染错误的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值