任务23:图片的显示与切换

一、任务目标

图片的显示和切换是游戏开发的基础,该任务并非介绍LayaAir中Image组件的使用,而是介绍两种引擎绘制图片的方式,通过比较这两种方式,可以让我们在最后的优化过程中有些许思路。

二、任务分解

2.1 loadImage()方法

该方法是Sprite节点上的方法。Sprite 是基本的显示图形的显示列表节点。 Sprite 默认没有宽高,默认不接受鼠标事件。通过 graphics 可以绘制图片或者矢量图,支持旋转,缩放,位移等操作。Sprite同时也是容器类,可用来添加多个子节点。

  • 注意:loadImage是加载并显示
export default class image extends Laya.Script {

    constructor() {
        super();
        this.showImage();
    }

    private showImage(): void {
        // 方法1.使用loadImage
        let sprite: Laya.Sprite = new Laya.Sprite();
        sprite.pos(100,50);
        sprite.loadImage("myComp/leaftexiao.png");
        Laya.stage.addChild(sprite);
    }
}

查看运行结果:(图片能够正常显示)
在这里插入图片描述

2.2 loadImage()实现切换图片

loadImage()加载并显示图片,其实就相当于先加载图片,然后设置texture属性,所以切换图片的实只就是先清空绘制的纹理,然后再次加载新的纹理即可,在2.0版本中loadImage()只能显示一张图片,后设置的不会覆盖之前的,所以需要手动清空。

export default class showImage extends Laya.Script {

    private texture1: string = "myComp/leaftexiao.png";
    private texture2: string = "myComp/silver.png";
    private flag: boolean = false;
    private sprite: Laya.Sprite;

    constructor() {
        super();
        Laya.loader.load([this.texture1,this.texture2],Laya.Handler.create(this,this.onAssetsLoaded));
    }

    private onAssetsLoaded(): void {
        this.sprite = new Laya.Sprite();
        Laya.stage.addChild(this.sprite);
        this.sprite.pos(100,50);

        // 显示默认纹理
        this.switchTexture();

        // 添加点击切换图片事件
        this.sprite.on("click",this,this.switchTexture);
    }

    private switchTexture(): void {
        let textureURL: string = (this.flag = !this.flag) ? this.texture1 : this.texture2;

        //更换纹理
        //这里需要注意的是sprite所有的绘图方法都是通过graphics实例来完成的
        this.sprite.graphics.clear();
        let texture: Laya.Texture = Laya.loader.getRes(textureURL);
        this.sprite.loadImage(textureURL);
        //this.sprite.texture = texture;

        //console.log(this.sprite.width,this.sprite.height);
        //设置交互区域,sprite默认没有宽高,如果不设置点击事件就不能触发
        this.sprite.size(texture.width,texture.height);
    } 
}
  • 经过测试,如果注释掉交互区域的设置,还是有sprite的宽高在,即可以完成点击事件
  • 可以利用texture属性赋值的方法改变纹理,这个方法相当于先清空再绘制,性能也更优一些
    在这里插入图片描述

2.3 drawTexture()方法

drawTexture()方法做不到loadImage()方法那样的即时加载,该方法必须先加载再绘制,相对的其功能也要更丰富一些。

export default class drawImage extends Laya.Script {

    private url: string = "myComp/leaftexiao.png";

    constructor() {
        super();
        Laya.stage.bgColor = "#ffffff";
        this.showImage();
    }

    private showImage(): void {
        Laya.loader.load(this.url,Laya.Handler.create(this,(texture: Laya.Texture)=>{
            let sprite: Laya.Sprite = new Laya.Sprite();
            Laya.stage.addChild(sprite);
            //性能不及drawImage,但是功能更强大
            sprite.graphics.drawTexture(texture);
            sprite.pos(100,50);
        }));
    }
}

在这里插入图片描述

2.4 drawImage()实现图片切换

类比2.2中的方法,如果有问题可以参考官方文档。

三、总结

  • loadImage()即时加载,drawTexture()先加载再绘制
  • loadImage()轻量级,drawTexture()功能强大,但是性能有所下降
  • 绘制纹理之前需要清空上一次的纹理
  • 如果直接利用texture属性绘制,相当于先clear(),再drawImage(),性能会优一些,也省去了麻烦的操作
  • 如果点击切换不了可以尝试查看Sprite的宽高,其默认宽高为0,之后设置交互区域即可
  • 资源加载的时候因为不确定什么时候加载完,所以绘制操作要在回调函数或者处理类Handler中操作

四、参考资料

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值