• cocos中常用的一些第三方库(astar、proto、jszip、decimal、crypto、socketio、pako)


    cocos版本:2.4.4

    测试环境:web、微信小游戏 

    demo地址,里面包含测试的库文件:demo下载

    在论坛看到帖子你想在cocos中使用哪些npm包,点进去看到支持一些常用的包。但是这个貌似要3.0才能用。所以搜集下2.0中能使用的这些第三方库。

    AStar

    A*寻路,经典寻路算法。

        private astarTest() {
            //创建网格
            let grid: AStarGrid = new AStarGrid(20, 20);
            //设置不可行走点
            for (var i = 0; i < 100; i++) {
                grid.setWalkable(Math.floor(Math.random() * 20),
                    Math.floor(Math.random() * 20),
                    false);
            }
            //设置起点
            grid.setStartNode(0, 0);
            //设置终点
            grid.setEndNode(19, 19);
            //开始寻路
            let aStar: AStar = new AStar();
            if (aStar.findPath(grid)) {
                console.log("寻路成功,路径点:", aStar.path);
            } else {
                console.log("寻路失败");
            }
        }
    

    寻路成功

    ProtoBuf

    google开发用于通讯的序列化结构数据格式,常用于websocket通讯。

        private protoTest() {
            let roomInfo: game.RoomInfo = new game.RoomInfo();
            roomInfo.roomId = 123;
            let sendData = game.RoomInfo.encode(roomInfo).finish();
            let revData = game.RoomInfo.decode(sendData);
            console.log(revData);
        }
    

    解析成功

    JSZip

    压缩工具,将大量文件压缩,节约空间。

    将GameItem.json文件压缩成GameItem.zip文件,然后修改GameItem.zip后缀为GameItem.bin

    把GameItem.bin放在resouces下

    加载GameItem.bin并取出GameItem.json,读取name。

        /**JsZip */
        private jszipTest() {
            //加载config.bin
            cc.resources.load("config_zip/GameItem", (err, assets: any) => {
                console.log("A:", assets);
                //解析
                JSZip.loadAsync(assets._buffer).then((zip) => {
                    console.log("B:", zip);
                    //获取GameItem.json配置
                    zip.file("GameItem.json").async("text").then((data) => {
                        //string转成json格式
                        let json = JSON.parse(data);
                        console.log(json["name"]);
                    })
                });
            })
        }
    

      

    读取成功

     小游戏需要在game.js中加入window.JSZip =require("src/assets/libs/jszip/jszip.min.js"); 如果不加,则会报错 JSZip is not defined。

    为了防止每次发布小游戏game.js被覆盖,需要将修改好的game.js放到模板文件夹下。在项目目录下新建文件夹build-templates/wechatgame,把修改好的game.js拷贝进去。

    这样每次发布都会使用这个模板game.js。

     Decimal

    大数计算,一般游戏很少使用到,只有数值非常大的游戏才会用到。

    从github上搜索decimal.js第一个就是,将decimal.js和decimal.d.ts到cocos下,选中decimal.js,在属性面板中去掉导入为插件选项,不然报错。

        private decimalTest() {
            let a = new Decimal(100);
            console.log(a, a.toString(), a.toNumber());
            let b = new Decimal(999999999999999 * 999999999999999);
            console.log(b, b.toString(), b.toNumber());
            //加法
            console.log(new Decimal(999).add(1).toNumber());
            //减法
            console.log(new Decimal(1000).sub(1).toNumber());
            //除法
            console.log(new Decimal(1000).div(2).toNumber());
            //乘法
            console.log(new Decimal(9).mul(9).toNumber());
            //是否相等
            console.log(new Decimal(9).equals(9));
            //是否大于
            console.log(new Decimal(9).gt(10));
        }
    

    输出正常

     Decimal的API可以查看https://www.jianshu.com/p/37829c87faa9

    Crypto

    一个密码类库,在github上搜索可下载。

        private cryPtoTest() {
            //密钥
            let key = enc.Utf8.parse("1234567890123456");
            //密钥偏移量
            let iv = enc.Utf8.parse("abcdefabcdea1234");
            //待加密字符串
            let word = "123abc";
            //加密
            let srcs = enc.Utf8.parse(word);
            let encrypted = AES.encrypt(srcs, key, { iv: iv, mode: mode.CBC, padding: pad.PKCS7 });
            let encryptedStr = encrypted.ciphertext.toString().toUpperCase();
            console.log(encryptedStr);
            //解密
            let encryptedHex = enc.Hex.parse(encryptedStr);
            let srcs2 = Base64.stringify(encryptedHex);
            let decrypt = AES.decrypt(srcs2, key, { iv: iv, mode: mode.CBC, padding: pad.PKCS7 });
            let decryptStr = decrypt.toString(enc.Utf8);
            console.log(decryptStr);
        }
    

     输出 

     MD5 

    从网上找的js版本,在web下有用,在微信小游戏报错。md5 is not constructor。只好找了个typescript的来用。

        private md5Test() {
            let str = new MD5_TS().hex_md5("123abc");
            console.log(str);
        }
    

     SocketIO

    网上下的用不了,有document,无法在微信小游戏中使用。下载了一个修改过的socket.io。

    在微信小游戏的game.js中加上 window.io = require("src/assets/libs/socketIO/weapp.socket.io.js");

     在任意代码ts里加上

    declare let io: any;
    declare interface Window {
        io: any
    }
    

      

    使用socket.io

        private socketIOTest() {
            let socket;
            socket = io.connect("http://127.0.0.1:3004", { reconnection: false, 'force new connection': true });
            socket.on('connect', function () {
                console.log("connect success");
            });
        }
    

     

    API可以正常调用,但是没有服务端,所以请求失败 

     

     Pako

     对内容进行压缩和解压。

    在线使用Pako

    使用pako转换字符

        /**pako测试 */
        private pakoTest() {
            console.log(this.toUint8Arr("阿阿阿阿阿哦哦哦哦哦11111aaaaa非非非非非非非非非非非非"));
    
            let a = pako.deflate("阿阿阿阿阿哦哦哦哦哦11111aaaaa非非非非非非非非非非非非", { level: 1 });
            console.log(a);
            let b = pako.inflate(a, { to: "string" });
            console.log(b);
            let c = pako.gzip("阿阿阿阿阿哦哦哦哦哦11111aaaaa非非非非非非非非非非非非");
            console.log(c);
            let d = pako.ungzip(c, { to: "string" });
            console.log(d);
        }
    
        /**字符串转Uint8Array */
        private toUint8Arr(str) {
            const buffer = [];
            for (let i of str) {
                const _code = i.charCodeAt(0);
                if (_code < 0x80) {
                    buffer.push(_code);
                } else if (_code < 0x800) {
                    buffer.push(0xc0 + (_code >> 6));
                    buffer.push(0x80 + (_code & 0x3f));
                } else if (_code < 0x10000) {
                    buffer.push(0xe0 + (_code >> 12));
                    buffer.push(0x80 + (_code >> 6 & 0x3f));
                    buffer.push(0x80 + (_code & 0x3f));
                }
            }
            return Uint8Array.from(buffer);
        }
    

      

    根据输出可以看出,手动string转Uint8Array比较大,使用pako转换的比较小。

     

     微信小游戏,需要在game.js中增加

    window.pako = require("src/assets/libs/pako/pako.js");

    在任意ts文件中增加

    declare let pako: any;
    declare interface Window {
        pako: any
    }
    

      

      

  • 相关阅读:
    spring in action小结4.1
    spring in action小结3 运行时值注入
    python-__init__.py 与模块对象的关系
    Python-常用库扩展
    Qt-优化布局结构
    Python-文件修改器
    C语言-数据结构(一)
    Python-PyQt4学习笔记
    Python-PyQt4学习资料汇总
    Linux-查看C语言手册及man的特殊用法
  • 原文地址:https://www.cnblogs.com/gamedaybyday/p/16228965.html
Copyright © 2020-2023  润新知