2017-04-14 17:59:31 PT_xxj 阅读数 584
  • Cocos2d-x 游戏开发详解

    本课程通过20章125节课 详细讲述了Cocos2d-x开发的详细过程,内容包括:基础编程:开发环境搭建、核心类、标签、菜单、精灵、事件处理、动作、定时器、GUI、数据结构;高级开发:音效、网络编程、数据存储、Tiled Map、粒子系统、物理引擎、常用工具和编辑器和项目实战。

    7544 人正在学习 去看看 郭宏志

封装代码

/**
 * 文件使用说明:用户存储相关处理js文件(基于cocos2d-js 3.6.1)。
 * 
 * 1、可通过customStorage.setEncrypted设置是否采用加密模式,默认加密(加密函数引用了CryptoJS v3.1.2库文件,此封装依赖于此库,若开启加密则必须引用其代码文件,当然也可以自己替换成其他加密)。
 * 2、可使用customStorage.clearData删除指定key的存档。 
 * 3、可使用customStorage.clearAllData删除所有存档。
 * 4、可使用customStorage.Bool|Int|String新建存储对象,并用get()获取,set(value)存储。
 */

/**
 * 游戏数据IO持久化存储静态类
 */
var customStorage = customStorage || 
{
    /**
     * 设置是否加密(默认加密)
     * @param value
     */
    setEncrypted:function(value)
    {
        this._private._encrypted = (value==false?false:true);
    },
    /**
     * 读取指定数据
     * @param key 数据Key
     * @returns
     */
    readData:function(key)
    {
        var readValue = cc.sys.localStorage.getItem(this._private._getSaveKey(key));

        if(readValue!=null)
        {
            var realValue = this._private._getRealValue(readValue, key);

            cc.log("read data %s=%s",key,realValue);

            return realValue;
        }

        return null;
    },
    /**
     * 保存指定数据
     * @param key 数据Key
     * @param data 数据
     */
    saveData:function(key,data)
    {
        cc.log("save data %s=%s",key,data);

        cc.sys.localStorage.setItem(this._private._getSaveKey(key),this._private._getSaveValue(data,key));
    },
    /**
     * 清除指定数据
     * @param key 数据Key
     */
    clearData:function(key)
    {
        if(this._encrypted)
        {
            cc.sys.localStorage.removeItem(CryptoJS.HmacMD5(key,key));
        }
        else
        {
            cc.sys.localStorage.removeItem(key);
        }
    },
    /**
     * 清除所有数据
     */
    clearAllData:function()
    {
        cc.sys.localStorage.clear();
    },
    // 数据处理相关方法和标识变量
    _private : 
    {
        // 是否加密标识,默认加密
        _encrypted:true,
        // 获取数据存储时使用的数据Key
        _getSaveKey:function(key)
        {
            if(this._encrypted)
            {
                return "" + CryptoJS.HmacMD5(""+key,""+key);
            }
            else
            {
                return "" + key;
            }
        },
        // 获取数据存储时使用的数据
        _getSaveValue:function(data,key)
        {
            if(this._encrypted)
            {
                return "" + CryptoJS.AES.encrypt(""+data,""+key);
            }
            else
            {
                return "" + data;
            }
        },
        // 获取数据读取后解密的数据
        _getRealValue:function(data,key)
        {
            if(this._encrypted)
            {
                return CryptoJS.AES.decrypt(""+data,""+key).toString(CryptoJS.enc.Utf8);
            }
            else
            {
                return data;
            }
        }
    }
};

/**
 * 数据存取解析相关静态方法集合类(包含Bool,Int,String三种基本类型数据,其他类型可通过此三种扩展获得)
 */
customStorage.parseSets = customStorage.parseSets ||
{
    /**
     * Bool类型数据存取相关函数
     */
    boolParse:
    {
        read:function(key,defaultVal)
        {
            var readVal = customStorage.readData(key);
            if(readVal==null/* ||readVal=="" */)
            {
                customStorage.saveData(key, defaultVal);
                return defaultVal;
            }
            else
            {
                return readVal=="false"?false:true;
            }
        },
        save:function(value)
        {
            return value;
        }
    },
    /**
     * Int类型数据存取相关函数
     */
    intParse:
    {
        read:function(key,defaultVal)
        {
            var readVal = customStorage.readData(key);
            if(readVal==null/* ||readVal=="" */)
            {
                customStorage.saveData(key, defaultVal);
                return defaultVal;
            }
            else
            {
                return parseInt(readVal);
            }
        },
        save:function(value)
        {
            return value;
        }
    },
    /**
     * String类型数据存取相关函数
     */
    stringParse:
    {
        read:function(key,defaultVal)
        {
            var readVal = customStorage.readData(key);
            if(readVal==null/* ||readVal=="" */)
            {
                customStorage.saveData(key, defaultVal);
                return defaultVal;
            }
            else
            {
                return readVal;
            }
        },
        save:function(value)
        {
            return value;
        }
    }
};

/**
 * 游戏存档数据原型基础类
 */
customStorage.commonDataProto = function(key,defaultVal,parseFunction)
{
    this._private = this._private ||
    {
        _saveKey:key,
        _saveParse:parseFunction,
        _saveData:parseFunction.read(key,defaultVal)
    };

    this.get = function()
    {
        return this._private._saveData;
    };

    this.set = function(data)
    {
        this._private._saveData = data;
        customStorage.saveData(this._private._saveKey, ""+this._private._saveParse.save(this._private._saveData));
    };

    return this;
};

/**
 * 游戏存档数据Bool类
 */
customStorage.Bool = function(key,defaultVal)
{
    this._private = new customStorage.commonDataProto("b_"+key, defaultVal, customStorage.parseSets.boolParse);

    this.get = function()
    {
        return this._private.get();
    };

    this.set = function(data)
    {
        this._private.set(data);
    };
    return this;
};

/**
 * 游戏存档数据Int类
 */
customStorage.Int = function(key,defaultVal)
{
    this._private = new customStorage.commonDataProto("i_"+key, defaultVal, customStorage.parseSets.intParse);

    this.get = function()
    {
        return this._private.get();
    };

    this.set = function(data)
    {
        this._private.set(data);
    };
    return this;
};

/**
 * 游戏存档数据String类
 */
customStorage.String = function(key,defaultVal)
{
    this._private = new customStorage.commonDataProto("s_"+key, defaultVal, customStorage.parseSets.stringParse);

    this.get = function()
    {
        return this._private.get();
    };

    this.set = function(data)
    {
        this._private.set(data);
    };
    return this;
};

使用示例

首先定义存储字段

/**
 * 用户数据声明文件,处理与用户数据相关的内容
 */
var customLocalData = customLocalData || 
{
    init:function()
    {
        // 设定存储是否加密,不调用默认加密
        customStorage.setEncrypted(false);

        // 此处之所以讲此字段定义在init函数内,是为了延迟数据的初始化,可以控制初始化时机。
        // 没有像init函数一样写成规范的成员,是为了清晰易修改

        // 声音存储
        customLocalData.SoundOn = new customStorage.Bool("SoundOn",true);

        // 分数存储
        customLocalData.Score = new customStorage.Int("Score",0);

        // 昵称存储
        customLocalData.NickName = new customStorage.String("NickName","");
    },
    destory:function()
    {
        customLocalData = undefined;
    }
};

游戏启动后调用初始化函数,调用后会自动从本地存储加载存档,在初始化后存储就可以正常使用了

// 存档初始化
customLocalData.init();

// 声音开关读取
var soundOn = customLocalData.SoundOn.get();

// 声音开关改变
customLocalData.SoundOn.set(false);

// 分数读取
var score = customLocalData.Score.get();

// 分数改变
customLocalData.Score.set(100);

// 昵称读取
var nickName = customLocalData.NickName.get();

// 分数改变
customLocalData.NickName.set("Nick_001");

依赖库下载

CryptoJS下载后将“CryptoJS-master.zip\CryptoJS-master\rollups\”下的aes.js和hmac-md5.js引入项目即可。

2014-10-24 11:00:15 qinning199 阅读数 3750
  • Cocos2d-x 游戏开发详解

    本课程通过20章125节课 详细讲述了Cocos2d-x开发的详细过程,内容包括:基础编程:开发环境搭建、核心类、标签、菜单、精灵、事件处理、动作、定时器、GUI、数据结构;高级开发:音效、网络编程、数据存储、Tiled Map、粒子系统、物理引擎、常用工具和编辑器和项目实战。

    7544 人正在学习 去看看 郭宏志

基础数据类型统一通过方法来创建。不再支持new方式

1、坐标cc.Point 一共3种创建方式

结构:{x:0,y:0}

//1 快捷创建,返回相当于cc.p(0,0)
var point1 = cc.p();
//2 常用
var point2 = cc.p(100,100);
//3 拷贝
var point3 = cc.p(point2);

2、尺寸cc.Size 一共3种创建方式

结构:{width:0,height:0}

//1 快捷创建,返回相当于cc.size(0,0)
var size1 = cc.size();
//2 常用
var size2 = cc.size(100,100);
//3 拷贝
var size3 = cc.size(size2);

3、区域cc.Rect 一共3种创建方式

结构:{x:0,y:0,width:0,height:0}

//1 快捷创建,返回相当于cc.rect(0,0,0,0)
var rect1 = cc.rect();
//2 常用
var rect2 = cc.rect(100,100,100,100);
//3 拷贝
var rect3 = cc.rect(rect2);

4、颜色cc.Color 一共5种创建方式

结构:{r:0,g:0,b:0,a:0}

//1 快捷创建,返回相当于cc.color(0,0,0,255);
var color1 = cc.color();
//2 常用,不包含alpha值
var color2 = cc.color(255,255,255);
//3 常用,包含alpha值
var color3 = cc.color(255,255,255,255);
//4 拷贝
var color4 = cc.color(color2);
//5 固定颜色
var color5 = cc.color.white;

常用9种固定颜色类型
cc.color.WHITE;//白色
cc.color.YELLOW;//黄色
cc.color.BLUE;//蓝色
cc.color.GREEN;//绿色
cc.color.RED;//红色
cc.color.MAGENTA;//紫红色
cc.color.BLACK;//黑色
cc.color.ORANGE;//橙色
cc.color.GRAY;//灰色
转载请注明:http://www.douapp.com/post/2436
2015-02-09 10:32:16 u013321328 阅读数 1553
  • Cocos2d-x 游戏开发详解

    本课程通过20章125节课 详细讲述了Cocos2d-x开发的详细过程,内容包括:基础编程:开发环境搭建、核心类、标签、菜单、精灵、事件处理、动作、定时器、GUI、数据结构;高级开发:音效、网络编程、数据存储、Tiled Map、粒子系统、物理引擎、常用工具和编辑器和项目实战。

    7544 人正在学习 去看看 郭宏志
引擎包含2部分:  cocos2d-html5 + cocos2d-x 2部分组成,所以全平台运行
引擎包目录结构:


1:   属性 方法都有.访问
2; 想似得: if  switch  {}    new对像   cc.。。。。
3:   var  相当于local
使用cocos2d-Js的特点:   快速(程序开发)  全平台

使用啥语言无所谓, 关键是经验: 如逻辑结构, 项目的架构/数据 Ui分离, 文件夹层次   网络




[入门教程]使用Cocos2d-html5游戏引擎编写一个简单的游戏  

[入门教程]使用Cocos2d-html5游戏引擎编写一个简单的游戏 第一回合: 搭建开发环境
[入门教程]使用Cocos2d-html5游戏引擎编写一个简单的游戏  第二回合:运行Hello World
[入门教程]使用Cocos2d-html5游戏引擎编写一个简单的游戏  第三回合:创建工程 
[入门教程]使用Cocos2d-html5游戏引擎编写一个简单的游戏 第四回合:添加场景
[入门教程]使用Cocos2d-html5游戏引擎编写一个简单的游戏 第五回合:添加飞机
[入门教程]使用Cocos2d-html5游戏引擎编写一个简单的游戏 第六回合:移动精灵
[入门教程]使用Cocos2d-html5游戏引擎编写一个简单的游戏 第七回合:发射子弹
[入门教程]使用Cocos2d-html5游戏引擎编写一个简单的游戏 第八回合:添加敌机 
[入门教程]使用Cocos2d-html5游戏引擎编写一个简单的游戏 第九回合:碰撞检测
[入门教程]使用Cocos2d-html5游戏引擎编写一个简单的游戏 第十回合:游戏结束

--------------------
类名字var   JS没有文件之分, lua是有的; 但放在函数中是用区别的
Cocos2d-JS 快速入门07_Cocos2d基础概念  --- 视频


***********************
-------------------------------------------------------------cocos2d-html5 碰撞检测的几种方法-----------------------------------
游戏中的碰撞还是比较多的,比如角色与角色的碰撞,角色与墙壁的碰撞,角色与怪物的碰撞等,都需要
进行碰撞的检测,来触发一定的事件

最近在尝试制作一个小游戏的时候需要用到碰撞检测,然后就查了下资料,并在论坛进行提问等算是找到了比较满意的碰撞检测方法,这里记录下来


现在自己知道的方法算是有了三种了,下面一一记录并分析下他们各自的优缺点
1、就是官方提供的,根据getBoundingBox();方法获取要检测的碰撞物体的范围,然后再根据rectIntersectsRect();方法进行判断需要检测的两个精灵是否有重叠,有则发生碰撞;
优点:适合对规则的矩形物体进行检测碰撞,简单,直接
缺点:对于复杂图形不友好,对于碰撞的检测不准确,使用中有种莫名其妙的感觉

[javascript] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. var dollRect = sprite.getBoundingBox();  
  2. var dollHeadRect = this.catchHand.getBoundingBox();  
  3. if(cc.rectIntersectsRect(dollRect, dollHeadRect)){  
  4.       //发生碰撞事件  
  5. }  


2、第二种是在网上找到的,我感觉有些麻烦,不过相对于第一种,对于不规则物体支持的好了一些

这里根据BoundingBox 的 上下左右的中间点来判断碰撞,使检测的更准确一些
优点:使碰撞检测更准确一点
缺点:麻烦

[javascript] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. var box1 = sprite1.getBoundingBox();  
  2. var bottom = cc.p(box1.x +box1.width / 2,box1.y);  
  3. var right = cc.p(box1.x +box1.width,box1.y +box1.height / 2);  
  4. var left = cc.p(box1.x,box1.y +box1.height / 2);  
  5. var top = cc.p(box1.x + box1.width / 2,box1.y + box1.height);  
  6.   
  7.   
  8.  var box2 = sprite2.getBoundingBox();  
  9.  if(cc.rectContainsPoint(box2, left)||cc.rectContainsPoint(box2, right)||cc.rectContainsPoint(box2, top)||cc.rectContainsPoint(box2, bottom)){  
  10.       //发生碰撞  
  11.  }  



3、第三种就是我现在使用的,不过这个针对大小比较规矩,即接近正方形比较好,但是对于外形可以复杂
这个碰撞检测就是要给精灵添加一个radius属性,设置精灵以中心为原点,radius为半径的碰撞区域,然后去判断两个精灵的中心点的距离是否小于radius之和,如果是则发生碰撞;
优点:更准确,简单
缺点:对于长的图片碰撞不友好
想判断距离首先要知道一个方法:pDistance();这个方法是cocos2d-html5获取两个坐标点之间的方法,使用这个方法我们就可以获取两个精灵中心的距离

[javascript] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. var sprite = this.dolls3[i];  
  2. var distance = cc.pDistance(this.catchHand.getPosition(), sprite.getPosition());  
  3. var radiusSum = sprite.radius + this.catchHand.radius;  
  4. cc.log("distance:" + distance + "; radius:" + radiusSum);  
  5. if(distance < radiusSum){  
  6.     //发生碰撞  
  7. }  
  8.   
  9.   
  10. //针对第三三种方法又加深了一下,使得对矩形类的精灵也能有好的判断,  
  11. //主要就是分别对X和Y方向设置不同的Radius,然后去进行分别判断  
  12. var distanceX = Math.abs(this.catchHand.getPositionX() - sprite.getPositionX());  
  13. var distanceY = Math.abs(this.catchHand.getPositionY() - sprite.getPositionY());  
  14. var radiusYSum = sprite.radiusY + this.catchHand.radius;  
  15. if(distanceX < sprite.radiusX && distanceY < radiusYSum){  
  16.     this.catchDollSucceed(sprite);  
  17.     return;  
  18. }  



总结:综上所述,碰撞检测的方法不止一种,(应该还有其他的方法是我不知道的)在适合的时候选择合适的方法才是最好的,

更多cocos2d-html5开发文章可以关注牛人 touchsnow的博客:http://blog.makeapp.co

也可以去我的个人博客站点:Melove 我爱http://www.melove.net

------------------------------------------------------------------------------------------------cocos2d-html5开发之本地数据存储

做游戏时经常需要的一个功能呢就是数据的保存了,比如游戏最高分、得到的金币数、物品的数量等等,cocos2d-html5使用了html5,所以html5的数据保存方法是对引擎可用的;

html5本地数据存储是使用js对数据进行操作,html5 对数据的存储提供了两个方法:

  • sessionStorage – 只对本次会话保留数据
  • localStorage – 长时间保留数据

关于这个sessionStorage只在浏览器打开进行会话时可用,在游戏中没有测试,用法是和localStorage方法相同的,只是对数据保存的时间上不同;

其中localStorage 方法 对保留的数据没有时间限制,除非用户手动清理数据,也是我在游戏中常用的方法;
对数据的存储最常用的就是 getItem(”,”); 和setItem(”,”);这两个方法;
由此可见本地存储数据的方法很简单,就是简单的设置键(key)值(value)对,以及根据键(key)获取保存的值(value);
还有一点需要注意的就是 html5本地数据存储,只能保存字符串数据,无论你保存什么都会自动转换为字符串,所以如果要保存其他类型的数据的时候,要记得进行数据转换,
这里我写一个保存和读取json数据的例子:

//这是一个保存娃娃数量的json数据
dollNum = {Aries: 0, Taurus: 0, Gemini: 0, Cancer: 0, Leo: 0, Virgo: 0, Libra: 0, Scorpius: 0, Sagittarius: 0, Capricornus: 0, Aquarius: 0, Pisces: 0};
/**
 * 保存Doll数量,要保存json数据的时候,需要使用JSON.stringify();方法将JSON转化为字符串
 */
function saveDollNum(){
    var tempDollNum = JSON.stringify(dollNum);
    sys.localStorage.setItem("dollNum", tempDollNum);
}

/**
 * 加载Doll数量 和 keys;然后再读取过后,需要用JSON.parse();方法将字符串转化为JSON
 */
function loadDollNum() {
    var tempDollNum = sys.localStorage.getItem("dollNum");

    if(tempDollNum == null || tempDollNum == ""){
        saveDollNum();
        cc.log("default dollNum " + dollNum);
    }else{
        tempDollNum = sys.localStorage.getItem("dollNum");
        cc.log("get dollNum " + tempDollNum);
    }
    //将字符串转化为json
    tempDollNum = JSON.parse(tempDollNum);
}

这样就可以一次保存多个数据,并且操作起来也方便


----------------------------------------------------------------------------------------------

文采
类名字var   JS没有文件之分, lua是有的; 但放在函数中是用区别的
Cocos2d-JS 快速入门07_Cocos2d基础概念  --- 视频

2017-07-11 11:19:49 iamlegendary 阅读数 2805
  • Cocos2d-x 游戏开发详解

    本课程通过20章125节课 详细讲述了Cocos2d-x开发的详细过程,内容包括:基础编程:开发环境搭建、核心类、标签、菜单、精灵、事件处理、动作、定时器、GUI、数据结构;高级开发:音效、网络编程、数据存储、Tiled Map、粒子系统、物理引擎、常用工具和编辑器和项目实战。

    7544 人正在学习 去看看 郭宏志

在项目下,按住shift键,然后鼠标右键-“在此处打开命令窗口”(或者你自己输入绝对路径)
使用cocos命令

//JSC保存到同级目录
cocos jscompile -s frameworks\js-bindings\bindings\script  -d frameworks\js-bindings\bindings\script

//JSC保存到新目录
cocos jscompile -s xxxgame\src  -d xxxgame\src_sign 
2014-12-14 14:06:09 qinning199 阅读数 4845
  • Cocos2d-x 游戏开发详解

    本课程通过20章125节课 详细讲述了Cocos2d-x开发的详细过程,内容包括:基础编程:开发环境搭建、核心类、标签、菜单、精灵、事件处理、动作、定时器、GUI、数据结构;高级开发:音效、网络编程、数据存储、Tiled Map、粒子系统、物理引擎、常用工具和编辑器和项目实战。

    7544 人正在学习 去看看 郭宏志

统一引擎内部创建SpriteFrame的数据结构

将Plist的解析工作转移到了cc._plistLoader中去,对SAXParser进行了改造。

统一了引擎创建SpriteFrame的数据结构:

{
    _inited : true,
    frames : {
        "a_frame_0.png" : {
            rect : {x : 0, y : 0, width : 1, height : 1},
            rotated : false,
            offset : {x : 0, y : 0},
            size : {width : 1, height : 1}
            aliases : ["a_f_0"]
        }
    },
    meta : {
        image : "a.png"
    }
}

引擎在创建SpriteFrame的时候,读取了plist配置文件的信息后,会将其转换为以上的数据格式。

自定义SpriteFrame的配置文件

采用cc.loader的插件机制,我们可以很轻松的自定义自己的配置文件格式。SpriteFrame的各种格式的配置文件,只要转换成对应格式就行了。

例如,我们自定义了一个文件,用于存储原本配置在多个plist(res/ui/tcc_issue_1.plist, res/ui/tcc_issue_2.plist)的SpriteFrame的打包信息, 名为res/ui/imgs.pkgJson(plist的内容就不贴了):

{
    "tcc_issue_1.plist" : {
        "frames" : {
            "grossini_dance_01.png" : {
                "rect" : [2, 79, 51, 109],
                "offset" : [0, -1],
                "size" : [85, 121],
                "rotated" : true
            },
            "grossini_dance_05.png" : {
                "rect" : [2, 2, 75, 109],
                "offset" : [-1, -1],
                "size" : [85, 121],
                "rotated" : true
            },
            "grossini_dance_08.png" : {
                "rect" : [2, 79, 51,109],
                "offset" : [0, -1],
                "size" : [85, 121]
            }
        }
    },
    "tcc_issue_2.plist" : {
        "frames" : {
            "grossini_dance_13.png" : {
                "rect" : [2, 52, 51, 109],
                "offset" : [0, -1],
                "size" : [85, 121],
                "rotated" : true
            },
            "grossinis_sister1.png" : {
                "rect" : [2, 2, 48, 113],
                "offset" : [-1, -11],
                "size" : [52, 139],
                "rotated" : true
            },
            "grossinis_sister2.png" : {
                "rect" : [2, 105, 54, 126],
                "offset" : [-1, -2],
                "size" : [56, 138]
            }
        }
    }
}

(由于meta.image为对应plist文件名改后缀名为png,故可以不配置meta属性。)

接着我们可以自定义一个loader插件用于加载、解析pkgJson,loader插件代码如下:


/**
 * This is a loader to merge plist files to one file.
 */
cc._pkgJsonLoader = {
    /**
     * @constant
     */
    KEY : {
        frames : "frames",
        rect : "rect", size : "size", offset : "offset", rotated : "rotated", aliases : "aliases",

        meta : "meta",
        image : "image"
    },
    /**
     * @constant
     */
    MIN_KEY : {
        frames : 0,
        rect : 0, size : 1, offset : 2, rotated : 3, aliases : 4,

        meta : 1,
        image : 0
    },
    _parse : function(data){
        var KEY = data instanceof Array ? this.MIN_KEY : this.KEY;
        var frames = {}, meta = data[KEY.meta] ? {image : data[KEY.meta][KEY.image]} : {};
        var tempFrames = data[KEY.frames];
        for (var frameName in tempFrames) {
            var f = tempFrames[frameName];
            var rect = f[KEY.rect];
            var size = f[KEY.size];
            var offset = f[KEY.offset];
            frames[frameName] = {
                rect : {x : rect[0], y : rect[1], width : rect[2], height : rect[3]},
                size : {width : size[0], height : size[1]},
                offset : {x : offset[0], y : offset[1]},
                rotated : f[KEY.rotated],
                aliases : f[KEY.aliases]
            }
        }
        return {_inited : true, frames : frames, meta : meta};
    },
    load : function(realUrl, url, res, cb){
        var self = this, locLoader = cc.loader, cache = locLoader.cache;
        locLoader.loadJson(realUrl, function(err, pkg){
            if(err) return cb(err);
            var dir = cc.path.dirname(url);
            for (var key in pkg) {
                var filePath = cc.path.join(dir, key);
                cache[filePath] = self._parse(pkg[key]);
            }
            cb(null, true);
        });
    }
};
cc.loader.register(["pkgJson"], cc._pkgJsonLoader);

pkgJson其实就是一个json文件,那为什么不直接叫做json呢?因为每个loader插件是根据后缀名进行处理的, 如果也叫json那就会使用cc._jsonLoader进行加载了。

还可以支持混淆压缩模式:

{
    "tcc_issue_1.plist":[{
        "grossini_dance_01.png":[[2, 79, 51, 109],[85, 121],[0, -1],1],
        "grossini_dance_05.png":[[2, 2, 75, 109],[85, 121],[-1, -1],1],
        "grossini_dance_08.png":[[2, 79, 51,109],[85, 121],[0, -1]]
    }],
    "tcc_issue_2.plist":[{
        "grossini_dance_13.png":[[2, 52, 51, 109],[85, 121],[0, -1],1],
        "grossinis_sister1.png":[[2, 2, 48, 113],[52, 139],[-1, -11],1],
        "grossinis_sister2.png":[[2, 105, 54, 126],[56, 138],[-1, -2]]
    }]
}

这个混淆压缩模式有什么用呢?

1、减少配置文件的大小;

2、将多个配置文件整理合并到一个,减少网络连接请求数量。

用这种方式可以很好的解决plist文件在H5上带来的各种问题,同时可以让开发者在开发的时候用plist进行开发,在发布的时候使用pkgJson进行发布, 却不需要改动项目代码,只需要把资源加载列表中的plsit替换成对于的pkgJson就可以了。

但是目前,jsb尚无法支持自定义资源加载器插件,该功能只能在HTML5上使用。

转载请注明:http://www.cocos2dx.net/post/218

cocos2d-x 数据存储

阅读数 14

1. 游戏视频2.

博文 来自: fox64194167
没有更多推荐了,返回首页