`
周大帅
  • 浏览: 27154 次
社区版块
存档分类
最新评论

JavaScript强化教程 —— 资源打包工具的使用及资源的异步加载处理

阅读更多
本文为 HTML5培训 机构官方 HTML5培训 教程,主要介绍:JavaScript强化教程 —— 资源打包工具的使用及资源的异步加载处理

TexturePacker是纹理资源打包工具,支持Cocos2dx的游戏资源打包。

如果用过的同学可以直接看下面的资源的异步加载处理

首先为什么用TexturePacker?

节省图片资源实际大小

减少我们游戏中大量资源带来的内存负荷

方便游戏对纹理资源的内存管理

游戏开发到后期,我们或许都会遇到的瓶颈就是需要对游戏包进行“瘦身”和内存优化。那么使用TexturePacker

就能达到我们的目的;

我们以一组技能特效图片来举例,进行TexturePacker的图片打包,然后在程序中使用:

blob.png

我们对这些文件进行打包成一张大图.png和Cocos2dx-JS中会使用到的.plist文件

1431484478134171.png

打包注意一下几点:

文件格式,选择cocos2d

设置导出文件的plist和png路径

图片格式,一般使用RGBA8888,但根据平台需求现在也可以导出Pvr格式图片类型;使用:1)Textuer Format 选择Pvr图片类型  2)Image Format 选择 PVRCT4 这种类型的;可大大节省图片的大小!

每张大图的png尺寸一定不能大于2048*2048!因为目前比较低端的android手机是不支持加载这么大的图片的!所以我们的游戏要被大部分机型适配,那就最好不要用太大的图片包

OK。我们打包完成后将文件拷贝到我们的Gofinght目录中,继续我们上一节知识点开始写我们这节知识点的代码:

我们需要实现图片资源的加载!这个是我们的目的。

那么我们就需要书写一个GameFrameCache.js的类,来单独处理我们的图片资源加载;

GameFrameCache.js:

/**
* Created by yangshengjiepro on 15/5/11. *//**
* 游戏资源加载处理 */var GameFrameCache = function () {    this.flag = 0;
}var LOADINGBARPROALLNUM=0;//异步加载GameFrameCache.setAllCache = function (obj,objcallback) {    //异步加载所有游戏资源
    var texCache = cc.textureCache;    //遍历所有的资源
    var reslist = res;    var allnum = 0;    for (var key = 0 in reslist) {
        Mlog.c("reslist key"+key+"value:"+reslist[key]);
        allnum++;
    }

    LOADINGBARPROALLNUM = allnum;
    Mlog.c("LOADINGBARPROALLNUM>>",LOADINGBARPROALLNUM);    var readnum = 0;    for (var key = 0 in reslist) {        //开始装载        texCache.addImageAsync(reslist[key], objcallback, obj);
    }
};//资源加载GameFrameCache.setCache = function (plist) {    if (jsb.fileUtils.isFileExist(plist) == true) {
        cc.SpriteFrameCache.getInstance().addSpriteFrames(plist);
    }    else
    {
        Mlog.c("No Add File>>",plist);
    }
};//获取FrameGameFrameCache.getCache = function (name) {    var frame;
    frame = cc.SpriteFrameCache.getInstance().getSpriteFrame(name);    return frame;
};//移除PlistGameFrameCache.removeCache = function(plist){    if (jsb.fileUtils.isFileExist(plist) == true) {
        cc.SpriteFrameCache.getInstance().removeSpriteFramesFromFile(plist);
    }
}
代码中有三个方法:

GameFrameCache.setCache
GameFrameCache.getCache
GameFrameCache.removeCache
顾名思义就是,添加,获取,和删除

添加一张大图资源方法:

cc.SpriteFrameCache.getInstance().addSpriteFrames(plist);
我们知道SpriteFrameCache可以帮我们预加载plist图片,并且能大大提高我们游戏对图片的渲染效率

所以我们尽可能的使用这样的方式去做图片的渲染,而且我们能更方便的,在合适的地方去添加,获取,删除;

从而达到我们内存资源最佳管理的方式!就不会导致我们因为加载过多图片导致程序效率缓慢甚至卡死的情况!

那么下面我们来使用SpriteFrameCache这个类,我们需要在我们上一节课中的基类中添加一个方法

setGameFrameCache:function(plistfile){
     GameFrameCache.setCache(plistfile);
},
很简单,就是调用我们GameFrameCache的set方法!

在我们MainLayer中添加调用方法,直接:

this.setGameFrameCache("plist文件路径");
就能调用到我们基类的加载大图方法!

然后我们来尝试调用一下我们的大图纹理使用,我们新建一个PFuns.js动作类来播放我们的技能特效!

PFun.js

/**
* Created by yangshengjiepro on 15/5/11. */var PFuns = function () {    this.flag = 0;
}//执行某个特效PFuns.runEFFAttack_SP = function (sp , Url , name , num, speed , loop , delay , zorder , scale , tag , cp) {    var sprite = sp;    var sp_eff = new cc.Sprite();    var animation = new cc.Animation();    for (var i = 1; i <= num; i++) {        var toi="";        if(i<10)
        {
            toi = "0"+i;
        }        else
        {
            toi = i;
        }        var frameName = Url  + "/" + name  + toi + ".png";
        Mlog.c("frameName>>"+frameName);        var frame =GameFrameCache.getCache(frameName);        if(frame!=null) {
            Mlog.c("frameName>ok>>"+frameName);
            animation.addSpriteFrame(frame);
        }
    }    var usetime =1 / parseInt(speed);
    animation.setDelayPerUnit(usetime);
    animation.setRestoreOriginalFrame(true);
    animation.setLoops(loop);    var action = cc.animate(animation);    var actdelay2 = cc.DelayTime.create(delay);    if(delay>0)
    {
        sp_eff.runAction(cc.Sequence(actdelay2,action,cc.callFunc(PFuns.effremove, sp_eff)));
    }    else
    {
        sp_eff.runAction(cc.Sequence(action,cc.callFunc(PFuns.effremove, sp_eff)));
    }    if(cp!=null)
    {
        sp_eff.setPosition(cc.p(cp.x,cp.y));
    }    else
    {
        sp_eff.setPosition(cc.p(sprite.getContentSize().width/2,sprite.getContentSize().height/2));
    }

    sp_eff.setScale(scale);
    sprite.addChild(sp_eff,zorder,tag);

};//移除PFuns.effremove = function () {    this.removeFromParent();
};
我们使用帧动画的方式来进行技能特效的播放,帧动画的每帧的Frame获取方式使用:

var frame =GameFrameCache.getCache(frameName);

OK,我们可以Run起来看一下效果:

1431484630776075.png

我们的技能帧动画已经非常漂亮的渲染出来了!看起来非常不错!那么这个小知识点就完了!


异步加载

好,那么下面我们来讲解一下我们所有图片的异步加载!我们知道在Cocos2d-x中提供了textureCache来

帮助我们实现图片资源文件的管理,和使用。

试想我们是需要使用图片时临时加载图片快,还是先通过一个Loading界面将资源加载完毕后,在从textureCache中

取出来快呢?

答案当然是后者!

那么我们现在来进行LoadIng异步加载的实现方式,GameFrameCache.js类中有

1
GameFrameCache.setAllCache
这样一个方法,通过遍历我们的res目录中所有的png文件来获取文件路径,并且加载所有的图片;

这里要注意一下:res这个数组中只能填写png,jpg等图片文件类型

blob.png

可以这样来写我们的各种文件路径。

接下来我们就来实现一个进度条的实现来异步加载我们的所有程序资源,在MainLayer中添加两个方法:

    //加载进度条
    initloadingbar:function(sp_loading){
        //加载Loading条
        var sp_loadingtiao = new cc.Sprite(res.UILOADINGBD_png);
        sp_loadingtiao.attr({
            x: sp_loading.getContentSize().width/2,
            y: sp_loading.getContentSize().height/2-180,
            scale: 1,
            rotation: 0
        });
        sp_loading.addChild(sp_loadingtiao,1);
        var loadingBar = new ccui.LoadingBar(res.UILOADINGBAR_png);
        loadingBar.x = sp_loading.getContentSize().width/2;
        loadingBar.y = sp_loading.getContentSize().height/2-180;
        sp_loading.addChild(loadingBar,2,LOADINGBAR_TAG);
        loadingBar.setPercent(0);
    },
    //资源loadding buffer进度回调
    setloadingbar:function(){
        var pernum = parseInt(LOADINGBARPRONUM/LOADINGBARPROALLNUM *100);
        Mlog.c("pernum >>" +pernum);
        LOADINGBARPRONUM++;
        var loadingBar = this.getChildByTag(LOADINGBAR_TAG);
        if(loadingBar!=null)
        {
            loadingBar.setPercent(pernum);
        }
        //进度条加载完毕进行跳转
        if(pernum==100)
        {
            //加载完毕
            Mlog.c("异步加载资源完毕");
            PFuns.runEFFAttack_SP(this , "skill_dianjin" , "000" , 13, 6 , 3 ,1 , 11111 , 1 ,1000 , null);
        }
    },
setloadingbar这个方法是我们的回调;在GameFrameCache会使用addImageAsync方法来进行资源加载成功的回调!

并且获取两个值:

var LOADINGBARPRONUM = 1;
var LOADINGBARPROALLNUM=0;
和LOADINGBARPROALLNUM来进行进度条的计算和更新;

最后进度条的比例为100时,那么播放我们的技能动画:

texCache.addImageAsync(reslist[key], objcallback, obj);
在构造函数尾部,直接加上调用方法:

        //加载进度条调用
        this.initloadingbar(this);
        //异步加载所有资源调用
        GameFrameCache.setAllCache(this,this.setloadingbar);
这样就实现了我们整个项目的图片资源的异步加载

我们可以跑起来看看效果!

1431484749655902.png

好了,本章知识点在我们游戏开发中是非常的常用,也是非常重要的!所以我觉得会对大家一定有帮助!
分享到:
评论

相关推荐

    JavaScript实战手册——第七版代码

    5. **AJAX与Fetch API**:用于实现页面数据的异步加载,理解和使用XMLHttpRequest及新的Fetch API。 6. **ES6+新特性**:包括箭头函数、解构赋值、模板字符串、let和const、Map和Set、Symbol、Proxy和Reflect等。 ...

    AJAX教程——待理事的打包下载

    **待整理教程**:这个压缩包可能包含了一些未整理的 AJAX 教程资源,可能包括代码示例、讲解文档、问题解答等。由于资料未整理,建议开发者自行查阅并按照自己的需求进行分类和学习,以深入理解和掌握 AJAX 技术。 ...

    vue第五天笔记04——打包

    Vue打包主要是通过Webpack这个模块打包工具来完成的,Webpack负责处理JavaScript、CSS、图片等各种资源,使其能够被浏览器正确理解和执行。 在“vue第五天笔记04”中,我们可能涉及了以下几个核心知识点: 1. **...

    前端资源集合——大厂不是梦(doge

    这个名为"前端资源集合——大厂不是梦(doge"的压缩包文件显然包含了帮助开发者提升技能并迈向顶级公司的资源。让我们详细了解一下其中涉及的关键知识点。 首先,HTML(HyperText Markup Language)是网页的基础,...

    网页模板——纯javascript制作T恤花纹图案预览特效源码.zip

    10. **前端构建工具**:如Webpack或Gulp,可以自动化处理资源打包、压缩、合并等任务,提高开发效率。 这个压缩包内的文件"132687021636687640"可能是源代码文件,包含HTML、CSS和JavaScript代码,用于实现上述功能...

    frontend javascript

    Webpack是一个模块打包器,它将各种资源(如JavaScript、CSS、图片等)视为模块,并根据依赖关系进行打包。Webpack的核心概念有入口(entry)、输出(output)、加载器(loaders)和插件(plugins)。 - 入口:定义...

    JavaScript语言精粹5

    - **代码分割**: 使用Webpack等打包工具将代码分割成多个较小的文件,以便按需加载,从而提高加载速度。 - **缓存策略**: 合理利用浏览器缓存机制,可以显著提升页面加载速度。 #### 四、最佳实践 **4.1 代码...

    前端开发项目——美食天下

    此外,自动化构建工具如Webpack或Gulp用于资源的打包和优化,包括CSS预处理器(如Sass或Less)、图片压缩、代码分割等,以提高页面加载速度。 最后,测试也是前端开发不可或缺的一环。开发者可能使用Jest、Mocha等...

    smbms静态资源.zip

    开发过程中,开发者可能使用诸如Webpack、Gulp等工具进行资源打包和优化,合并多个CSS或JS文件,减少HTTP请求,提高加载速度。 总结,"smbms静态资源.zip"压缩包揭示了SSM超市管理系统前端部分的实现细节,涵盖了...

    javascript高级编程(第2版)pdf.part2

    根据提供的标题、描述、标签及部分内容,我们可以推测这本书——《JavaScript高级编程(第2版)》第二部分的主要内容涉及到了JavaScript的高级应用和技术细节。尽管给出的部分内容并未包含实际的文字内容,但从书名...

    全栈学习资源

    - **Webpack打包工具**:学习如何使用Webpack优化前端资源加载。 #### 六、总结 全栈工程师作为软件开发领域中的多面手,其需求量日益增长。通过上述提供的学习资源,可以从零开始逐步建立起全面的技术栈,掌握...

    JavaScript语言参考手册+源码大全

    本资源包含两部分——“JavaScript语言参考手册”和“JavaScript源码大全”,将帮助你深入理解和掌握这门语言。 《JavaScript语言参考手册》通常会涵盖以下内容: 1. **基础语法**:包括变量、数据类型(如字符串...

    基于 Javascript 的Bilibili第三方音频播放器.zip

    JavaScript 是一种广泛用于网页和网络应用的编程语言,尤其适用于处理用户交互、动态内容以及与服务器的异步通信。 描述中的信息同样简明,它强调了这个压缩包文件包含的是一个基于 JavaScript 的Bilibili音频...

    ASP————批量上传文件

    为了防止内存溢出,通常我们会使用流式处理来读取和写入文件,而不是一次性加载整个文件到内存。 在实际应用中,考虑到文件大小和数量,我们可能还需要实现异步上传,例如使用Ajax技术分块上传大文件,或者使用...

    require.js.rar

    - **异步加载**:在传统的JavaScript中,脚本的加载是阻塞的,而require.js通过异步加载方式,允许脚本按需加载,提升了页面的加载速度。 - **依赖管理**:require.js可以自动处理模块间的依赖关系,开发者无需...

    云生活超市——React Native项目,React Native电商app,(项目配套:1、后台管理系统(Rea.zip

    8. **图片加载与资源处理**:学习如何处理静态资源,如图片加载,可能会使用Image组件和网络图片加载库,如react-native-fast-image。 9. **权限管理**:了解Android和iOS的权限模型,如如何处理相机、位置等敏感...

    前端大厂最新面试题-first_page_time.docx

    8. **代码分割与异步加载**:利用`webpack`的代码分割功能,将不同功能的代码拆分为独立的chunk,按需加载。 9. **优化网络请求**:减少不必要的网络请求,如合并CSS和JavaScript文件,利用CDN加速静态资源的加载。...

    RequireJS-源码.rar

    RequireJS的核心功能是实现异步加载模块,它引入了AMD(Asynchronous Module Definition)规范,允许开发者在页面加载时并行下载JavaScript文件,提高页面的加载速度。通过定义模块和依赖关系,RequireJS能够保证...

    JavaScript学习资料

    以上仅是JavaScript部分核心知识点,实际学习过程中,你还会接触到Ajax、Web API、Web Storage、WebSocket、前端路由、CSS选择器与样式绑定、模块打包工具如Webpack、测试框架如Jest等内容。通过"JavaScriptHelp_...

    Mootools 源码分析文档与完整文档打包下载.zip

    Mootools是一个强大的JavaScript库,它提供了一系列工具和方法,帮助开发者更高效地构建和维护Web应用程序。这个压缩包包含了Mootools的源码分析文档和完整的官方文档,是深入理解Mootools工作原理和使用技巧的重要...

Global site tag (gtag.js) - Google Analytics