cocos版本:2.4.4

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

 

一 Astar

二 Protobuf

三 JSZip

四 Decimal

五 Crypto

六 MD5

七 SocketIO

八 Pako

 

 

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
}

  

  

 

 

 

 

 

posted on 2022-05-06 15:31  gamedaybyday  阅读(1671)  评论(0编辑  收藏  举报