canvas的drawImage方法有个缺点,就是当图片还未加载完成时调用它将无效。
当然,在高速运转的游戏主循环中,可以直接忽略这个问题,或者用 img.complete == true来做下判断。
在游戏循环之外的地方,可以用 img.onload = function (){};这样的回调解决。
但是,如果需要实现预先大量图片的加载,并且将加载进度告知用户,这时就需要一个图片加载器。
一.图片加载器原理
1.对于每张图片,开启对应的一个线程去负责加载,加载完成后修改一个变量的值-loadedNum
2.额外开启一个线程,监控loadedNum与needLoadNum的值,当加载全部完成时,调用回调函数。
3.由于javascript没有传统意义的线程机制,所以要使用setInterval模拟这些操作。
二.图片加载器的使用
var canvas = document.getElementById("canvas"); var context = canvas.getContext("2d"); //canvas自适应 MikuScaleUtil.rejustCanvas(canvas); //图片加载器 MikuImageManager.addImg("girl01","http://www.dm123.cn/ecms/d/file/2015-02-01/ae20761d9c6ff6e87989634a586a1906.jpg"); MikuImageManager.addImg("girl02","http://www.dm123.cn/ecms/d/file/2015-02-04/c6913e96129402d88f344e1c7b8e3c8e.jpg"); MikuImageManager.addImg("girl03","http://www.dm123.cn/ecms/d/file/2015-02-03/071624b53ca02eca0d5696b7759f9b2e.jpg"); MikuImageManager.addImg("girl04","http://www.dm123.cn/ecms/d/file/2015-02-03/4ef08ed1842579ff38244479b1b721ba.jpg"); MikuImageManager.initImgs(loadImage,main); //主函数 function main(){ context.drawImage(MikuImageManager.getImg("girl01"),0,0); } function loadImage(loaded,total){ console.log(loaded+"|"+total); }
1.使用addImg方法添加图片链接到加载器中
2.调用initImgs(loadImage,main);方法起动加载器
loadImage这个回调函数是,每隔50毫秒调用一次,输出当前已经加载图片的数量与总数。可以用它来更新进度条。
main这个回调是,当加载完成后调用。
3.getImg(name),方法可以使用之前取得名字获取图片对象。
三.效果图:
四.源代码
//工具类01-图片管理工具 function MikuImageManager(){}; //私用属性 MikuImageManager._imgArray = new Array(); MikuImageManager._loadedNum = 0; //公有方法 MikuImageManager.addImg = function(name,src){ var img = new Image(); img.src = src; img.name = name; img.loaded = false; MikuImageManager._imgArray.push(img); }; MikuImageManager.getImg = function(name){ var target ; MikuImageManager._imgArray.forEach(function(img){ if(img.name == name){ target = img; } }); return target; }; MikuImageManager.initImgs = function(onLoadCallBack,loadOvercallBack){ MikuImageManager._imgArray.forEach(function(img){ MikuImageManager._loadImg(img); }); var timer = setInterval(function(){ //console.log(MikuImageManager._loadedNum+"|"+MikuImageManager._imgArray.length); onLoadCallBack(MikuImageManager._loadedNum,MikuImageManager._imgArray.length); if(MikuImageManager._loadedNum === MikuImageManager._imgArray.length){ //console.log("全部图片加载完成"); clearInterval(timer); //回调 loadOvercallBack(); } },50); }; //私有方法 MikuImageManager._loadImg = function(img){ var checkTime = 0; //设置定时器 var timer = setInterval(function(){ checkTime = checkTime + 50; //console.log("加载耗时:"+img.name+"|"+checkTime); //如果图片加载完成 if(img.complete == true){ MikuImageManager._loadedNum ++; //console.log("加载完成:"+img.name); //清除定时器 clearInterval(timer); } },50); };
时间: 2024-11-08 03:57:26