我是靠谱客的博主 花痴紫菜,最近开发中收集的这篇文章主要介绍【canvas】导入图片_字体(游戏前置)【canvas】导入图片/字体(游戏前置),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

【canvas】导入图片/字体(游戏前置)

在这里插入图片描述

canvas游戏加载图片需求

1.游戏开始之前必须加载完所有要用的图片/字体(缓存文件数据,方便后面代码同步执行)
2.加载的文件必须精准知道加载结束时间并给出方便后续使用的数据
PS:字体可能在css里需要使用,虽然不必在乎渲染顺序,但是需要渲染出来
音频文件也可以用类似方法预加载(但是因为ios的安全机制所以行不通,但有解决方法)

使用原理

1.浏览器的缓存机制是,只要相同的地址,请求一次后,数据就放入缓存待用
2.用js函数的方式生成dom,预加载图片数据(dom不进行渲染,只是存在缓存中)

使用相关方法

  1. new image() 解决图片加载问题
  2. async … await … 解决图片加载异步的问题
export default async function(loadArr,progressFn){ //载入图片
    let num = 0;

    function loadAfter(progressFn){
        num++
        progressFn&&progressFn((num/loadArr.length).toFixed(2))
    }

    function loadImg(url,progressFn){
        let img = new Image();
        return new Promise((resolve, reject)=>{
            img.src = url;
            img.onload = function(){
                resolve(this)
                loadAfter(progressFn)
            }
        })
    }
    function loadFont(fontName,url,progressFn){
        let font = new FontFace(fontName, `url(${url})`);
        return new Promise((resolve, reject)=>{
            font.load().then(() =>{
                resolve(font)
                loadAfter(progressFn)
                document.fonts.add(font);
                document.body.classList.add("fonts-loaded");
            })
        })
    }

    let staticObj={}
      for( let i = 0; i < loadArr.length; i++ ){
        let Obj = {
            ...loadArr[i],
        }
        if(loadArr[i]['type'] == 'img'){
            Obj.Obj = await loadImg(loadArr[i]['url'],progressFn)
        }
        if(loadArr[i]['type'] == 'font'){
            Obj.Obj = await loadFont(loadArr[i]['code'],loadArr[i]['url'],progressFn)
        }
        staticObj[loadArr[i]['code']] = Obj
    }
    return staticObj;
}

参数

类型:Array
举例:

[
  {
  	code:'img1',//图片的唯一代号
    url:'../img.png',//图片地址//其他自定义属性
  },]

返回

类型:Object
举例:

{
	img1:{
  	img:<img>,//通过参数的url生成的imgDOM对象
    code:'img1',//图片的唯一代号,同时也是当前属性名//其他自定义属性
  }
}

注意点

因为用到了async await,因此使用时调用的函数和返回此方法的数据也要使用

UNIAPP版本稍微不同

export default async function(loadArr){ //载入图片
    function loadImg(url){
        return new Promise((resolve, reject)=>{
            uni.downloadFile({
            url,
            success(res){
              resolve(res.tempFilePath)
            }
          })
        })
    }

    let staticObj={}
      for( let i = 0; i < loadArr.length; i++ ){
        staticObj[loadArr[i]['code']] = {
          ...loadArr[i],
          img:await loadImg(loadArr[i]['url'])
        }
    }
    console.log(staticObj,'所有图片载入完成')
    return staticObj;
}

最后

以上就是花痴紫菜为你收集整理的【canvas】导入图片_字体(游戏前置)【canvas】导入图片/字体(游戏前置)的全部内容,希望文章能够帮你解决【canvas】导入图片_字体(游戏前置)【canvas】导入图片/字体(游戏前置)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部