Просмотр исходного кода

Merge branch 'master' of http://git.mokasz.com/zouyong/mk_framework

zouyong 5 лет назад
Родитель
Сommit
2043569d5f

+ 123 - 0
mk_framework/assets/script/mk/utils/FileUtil.ts

@@ -0,0 +1,123 @@
+/**  */
+ 
+// 读取文件方式
+enum READ_FILE_TYPE {
+    DATA_URL,// readAsDataURL, base64
+    TEXT,// readAsText
+    BINARY,// readAsBinaryString
+    ARRAYBUFFER,// readAsArrayBuffer
+}
+ /**s
+  * 文件操作工具类
+  * @author xhx
+  */
+export default class FileUtil{
+ 
+    /**
+     * 打开文件选择器
+     *
+     * @param {string} accept
+     * @param {(file: File) => void} callback
+     * @memberof FileUtil
+     */
+    openLocalFile(accept: string, callback: (file: File) => void) {
+        let inputEl: HTMLInputElement = <HTMLInputElement>document.getElementById('file_input');
+        if (!inputEl) {
+            // console.log('xxxxxx createElement input');
+            inputEl = document.createElement('input');
+            inputEl.id = 'file_input';
+            inputEl.setAttribute('id', 'file_input');
+            inputEl.setAttribute('type', 'file');
+            inputEl.setAttribute('class', 'fileToUpload');
+            inputEl.style.opacity = '0';
+            inputEl.style.position = 'absolute';
+            inputEl.setAttribute('left', '-999px');
+            document.body.appendChild(inputEl);
+        }
+ 
+        accept = accept || ".*";
+        inputEl.setAttribute('accept', accept);
+ 
+        // inputEl.addEventListener('change', (event) => {
+        //     console.log('xxx onchange1', event, inputEl.value);
+        // });
+        inputEl.onchange = (event) => {
+            // console.log('xxx onchange2', event, inputEl.files);
+            let files = inputEl.files
+            if (files && files.length > 0) {
+                var file = files[0];
+                if (callback) callback(file);
+            }
+        }
+        inputEl.click();
+    }
+ 
+    /**
+     * 读取本地文件数据
+     *
+     * @param {File} file
+     * @param {READ_FILE_TYPE} readType
+     * @param {((result: string | ArrayBuffer) => void)} callback
+     * @memberof FileUtil
+     */
+    readLocalFile(file: File, readType: READ_FILE_TYPE, callback: (result: string | ArrayBuffer) => void) {
+        var reader = new FileReader();
+        reader.onload = function (event) {
+            if (callback) {
+                if (reader.readyState == FileReader.DONE) {
+                    // console.log('xxx FileReader', event, reader.result);
+                    callback(reader.result);
+                } else {
+                    callback(null);
+                }
+            }
+        };
+        switch (readType) {
+            case READ_FILE_TYPE.DATA_URL:
+                reader.readAsDataURL(file);
+                break;
+            case READ_FILE_TYPE.TEXT:
+                reader.readAsText(file);   //作为字符串读出
+                //reader.readAsText(file,'gb2312');   //默认是用utf-8格式输出的,想指定输出格式就再添加一个参数,像txt的ANSI格式只能用国标才能显示出来
+                break;
+            case READ_FILE_TYPE.BINARY:
+                reader.readAsBinaryString(file);
+                break;
+            case READ_FILE_TYPE.ARRAYBUFFER:
+                reader.readAsArrayBuffer(file);
+                break;
+        }
+    }
+   
+    /**
+     * 保存数据到本地
+     *
+     * @param {*} fileNameToSaveAs  要保存的文件名
+     * @param {*} textToWrite       要保存的文件内容
+     * @memberof FileUtil
+     */
+    saveForBrowser(fileNameToSaveAs,textToWrite, ) {    
+        if (cc.sys.isBrowser) {        
+            console.log("浏览器");        
+            let textFileAsBlob = new Blob([textToWrite], {type:'application/json'});        
+            let downloadLink = document.createElement("a");        
+            downloadLink.download = fileNameToSaveAs;        
+            downloadLink.innerHTML = "Download File";        
+            if (window.webkitURL != null){            
+                // Chrome allows the link to be clicked            
+                // without actually adding it to the DOM.            
+                downloadLink.href = window.webkitURL.createObjectURL(textFileAsBlob);        
+            }else{            
+                // Firefox requires the link to be added to the DOM            
+                // before it can be clicked.            
+                downloadLink.href = window.URL.createObjectURL(textFileAsBlob);            
+                // downloadLink.onclick = destroyClickedElement;            
+                downloadLink.style.display = "none";            
+                document.body.appendChild(downloadLink);        
+            }        
+                
+            downloadLink.click();    
+        } 
+    }
+ 
+}

+ 9 - 0
mk_framework/assets/script/mk/utils/FileUtil.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "1.0.8",
+  "uuid": "169f68eb-642d-432b-ad4b-8c76b497590a",
+  "isPlugin": false,
+  "loadPluginInWeb": true,
+  "loadPluginInNative": true,
+  "loadPluginInEditor": false,
+  "subMetas": {}
+}

+ 254 - 0
mk_framework/assets/script/mk/utils/LoaderManager.ts

@@ -0,0 +1,254 @@
+/*============================================================================================================*/
+/**
+ * @description 资源加载
+ */
+/*============================================================================================================*/
+// import { loader, error, JsonAsset, log, sys, SpriteAtlas, SpriteFrame } from 'cc';
+
+// window.xx = window.xx || {};
+// export class LoaderMgr {
+export class LoaderMgr {
+    // xx.Loader = {
+    private _profile_res = {};
+    private _bundle = null;
+    // todo 根据场景来清除资源缓存(什么场景加载的资源就保存到什么场景资源配置上。
+    //  可能存在的问题:两个场景公用的资源可能会被释放,之后重新加载,可能会有问题
+    //  )
+    public setBundle(bundle) {
+        bundle && (this._bundle = bundle);
+    }
+
+    public getBundle() {
+        return this._bundle || cc.resources;
+    }
+    /*============================================================================================================*/
+    /**
+     * 异步加载资源
+     */
+    /*============================================================================================================*/
+    public loadAsset(relative_path: string, complete_callback) {
+        let loader = this.getBundle();
+        loader.load(relative_path, (error, asset) => {
+            if (error) {
+                error('xx.loadAsset failed ... and path = ' + relative_path, '===error:', JSON.stringify(error));
+                return;
+            } else {
+                complete_callback && complete_callback(asset);
+            }
+        });
+    }
+
+    /*============================================================================================================*/
+    /**
+     * 根据类型异步加载
+     */
+    /*============================================================================================================*/
+    public loadAssetByType(relative_path: string, asset_type, complete_callback?: Function) {
+        return new Promise((resolve: (data) => void, reject) => {
+            this.getBundle().load(relative_path, asset_type, (error, asset) => {
+                if (error) {
+                    error('xx.loadAssetByType failed ... and path = ' + relative_path, '==error:', JSON.stringify(error));
+                    reject();
+                    return;
+                } else {
+                    complete_callback && complete_callback(asset);
+                    resolve(asset);
+                }
+            });
+        });
+    }
+
+    /*============================================================================================================*/
+    /**
+     * 递归获取resource路径下资源地址数组
+     * @param type 资源类型,如果为空,则返回所有类型文件地址
+     */
+    /*============================================================================================================*/
+    public getDirUrlsRecursion(path, type) {
+        let urls = [];
+        this.getBundle().getDirWithPath(path, type, urls);
+        let arr_path = [];
+        for (let i = 0; i < urls.length; i++) {
+            const element = urls[i].path;
+            arr_path.push(element);
+        }
+        return arr_path;
+    }
+
+    /*============================================================================================================*/
+    /**
+     * 通过config构造uuid数组加载
+     */
+    /*============================================================================================================*/
+    public loadByConfigUseUuids(assets_config, progress_callback, complete_callback) {
+        // let uuids = [];
+        // let urls = [];
+        // let len = assets_config.length;
+        // for (let i = 0; i < len; i++) {
+        //     let config = assets_config[i];
+        //     let path = config.path;
+        //     let type = config.type;
+        //     let _uuids = this.getBundle().getDirWithPath(path, type, urls);
+        //     uuids = uuids.concat(_uuids);
+        // }
+
+        // if (uuids.length === 0) return;
+
+        // let DoWithAssetItemOnProgress = function (completed_count, total_count, item) {
+        //     let asset = item.content;
+        //     if (asset instanceof JsonAsset) {
+        //         xx.Dict.loadByAsset(asset);
+        //     }
+        //     progress_callback && progress_callback(completed_count, total_count);
+        // };
+
+        // let DoWithAssetOnComplete = function (errors, res_assets, res_urls) {
+        //     complete_callback && complete_callback(errors, res_assets, res_urls);
+        // };
+
+        // loader._loadResUuids(uuids, DoWithAssetItemOnProgress, DoWithAssetOnComplete, urls);
+    }
+
+    public loadAssetsByConfig(assets_config, progress_callback, complete_callback) {
+        let total_count = 0;
+        let complete_count = 0;
+        for (let i = 0; i < assets_config.length; i++) {
+            let config = assets_config[i];
+            let path = config.path;
+            let type = config.type;
+
+            let urls = [];
+            this.getBundle().getDirWithPath(path, type, urls);
+            total_count += urls.length;
+            cc.log('预加载资源:%o', urls);
+            let callback = config.cb;
+            for (let i = 0; i < urls.length; i++) {
+                let path = urls[i].path;
+                this.getBundle().load(path, type, function (err, spriteFrame) {
+                    if (err) {
+                        cc.error(err.message || err);
+                        return;
+                    }
+                    ++complete_count;
+                    progress_callback && progress_callback(complete_count, total_count, spriteFrame);
+                    callback && callback(spriteFrame);
+
+                    if (complete_count === total_count) {
+                        complete_callback && complete_callback();
+                    }
+                });
+            }
+        }
+    }
+
+    /*============================================================================================================*/
+    /**
+     */
+    /*============================================================================================================*/
+    public releaseResByPathAndType(path = '', type) {
+        if (!path || !type) return;
+
+        let urls = this.getDirUrlsRecursion(path, type);
+        let len = urls.length;
+        for (let i = 0; i < len; ++i) {
+            let url = urls[i];
+            let atlas = this.getBundle().getRes(url, type);
+            let deps = this.getBundle().getDependsRecursively(atlas);
+            // assetManager.releaseAsset(deps);
+        }
+        cc.sys.garbageCollect();
+    }
+
+    /*============================================================================================================*/
+    /**
+     * 同步获取已经预加载的图集中的spriteframe 此接口进入游戏后生效
+     */
+    /*============================================================================================================*/
+    public getSpriteFrameFromAtlas(sprite_frame_name, path = '/Atlas') {
+        let urls = this.getDirUrlsRecursion(path, cc.SpriteAtlas);
+        let len = urls.length;
+        for (let i = 0; i < len; i++) {
+            let url = urls[i];
+            let atlas: any = this.getBundle().getRes(url, cc.SpriteAtlas);//resources.get
+            if (atlas) {
+                let sf = atlas.getSpriteFrame(sprite_frame_name);
+                if (sf) return sf;
+            }
+        }
+    }
+
+    /*============================================================================================================*/
+    /**
+     * @description 获取散图资源(需要在loading的时候首先加载)
+     * @param {string} sprite_frame_path 资源相对于resource下的路径
+     */
+    /*============================================================================================================*/
+    public getSpriteFrame(sprite_frame_path) {
+        let res = this.getBundle().getRes(sprite_frame_path, cc.SpriteFrame);
+        return res;
+    }
+
+    /*============================================================================================================*/
+    /**
+     * SpriteFrame有一个_uuid的属性,根据uuid去loader里面查找路径加载路径
+     */
+    /*============================================================================================================*/
+    public parseUuidToUrl(uuid) {
+        let path_to_uuid = this.getBundle()._pathToUuid;
+        for (let key in path_to_uuid) {
+            let entrys = path_to_uuid[key];
+            if (entrys instanceof Array) {
+                for (let entry of entrys) {
+                    if (entry.uuid === uuid) {
+                        return key;
+                    }
+                }
+            } else {
+                if (entrys.uuid === uuid) {
+                    return key;
+                }
+            }
+        }
+        return '';
+    }
+
+    public loadRemoteTexture(url, role_id, callback) {
+        if (this._profile_res[role_id]) {
+            let spf = this._profile_res[role_id];
+            callback && callback(role_id, spf);
+            return;
+        }
+        if (!url) return;
+
+        if (!cc.sys.isNative) return;
+
+        this.getBundle().load({ url: url, type: 'png' }, (err, tex) => {
+            cc.log('===get_texture:', role_id);
+            if (err) {
+                cc.log('===err:', err);
+                return;
+            }
+            let spf = new tex();//SpriteFrame(tex)
+            this._profile_res[role_id] = spf;
+            callback && callback(role_id, spf);
+        });
+    }
+    /** 获取图片纹理 by 图集 
+     * - sprite_frame_name:要获取的纹理名字
+     * - arr_atlas:图集列表
+    */
+    public getSpriteFrameByArrAlst(sprite_frame_name: string, arr_atlas: Array<cc.SpriteAtlas>): cc.SpriteFrame {
+        let count = arr_atlas.length;
+        for (let i = 0; i < count; i++) {
+            let _atlas = arr_atlas[i];
+            let spf = _atlas.getSpriteFrame(sprite_frame_name);
+            if (spf) return spf;
+        }
+        return null;
+    }
+};
+// declare global {
+//     const LoaderMgr: LoaderMgr;
+// }
+// // window['LoaderMgr'] = new LoaderMgr();
+// mk.loader = new LoaderMgr();

+ 9 - 0
mk_framework/assets/script/mk/utils/LoaderManager.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "1.0.8",
+  "uuid": "803afd6a-cc27-421e-8d5b-f88683cb9e0e",
+  "isPlugin": false,
+  "loadPluginInWeb": true,
+  "loadPluginInNative": true,
+  "loadPluginInEditor": false,
+  "subMetas": {}
+}

+ 166 - 0
mk_framework/assets/script/mk/utils/StringUtil.ts

@@ -0,0 +1,166 @@
+/**
+ * 字符串工具类
+ * @author xhx
+ */
+export default class StringUtil {
+
+    /** 颜色表 */
+    private str_color = {
+        /** 红色1 */
+        red1: '#be2c1d',
+        /** 棕色1 */
+        bro1: '#4E301B',
+    }
+
+    /** 将数据表里的字符串转成相对颜色
+     * @param 需要转换的字符串 比如  "你好[red中国]" 其中“中国”为红色...你好[red{s40}中国]
+     * @return 返回一个富文本字符串
+     * @author xhx
+     */
+    public getTextByStringInData(str: string): string {
+        var newStr: string = str;
+        var i: number = 0;
+        var begin: number;
+        var end: number;
+        var sub: string;
+        var searchValue: string;
+        var replaceValue: string;
+        var color_key: string;
+
+        // 解析颜色
+        while (i < str.length) {
+            begin = str.indexOf("[", i);
+            end = str.indexOf("]", begin);
+            if (begin != -1 && end != -1)//把[redXXX]转成富文本
+            {
+                searchValue = str.slice(begin, end + 1);
+                // 颜色内容
+                color_key = str.slice(begin + 1, begin + 5);
+                let color_str = this.str_color[color_key]
+                if (color_str) {
+                    sub = str.slice(begin + 6, end);
+                    replaceValue = this.getColorStringColor(sub, color_str);
+                    newStr = newStr.replace(searchValue, replaceValue);
+                }
+                i = end;
+            }
+            else {
+                break;
+            }
+        }
+        let size_index: number = 0;
+        let size_begin: number = 0;
+        let size_end: number = 0;
+        let size_searchValue: string;
+        // let size_sub: string
+
+        // 解析尺寸{40=100%},100%是40尺寸.例子2:[bro对目标造成][red{40=104%}][bro攻击伤害]
+        while (size_index < newStr.length) {
+            size_begin = newStr.indexOf("{", size_index);
+            size_end = newStr.indexOf("}", size_begin);
+            if (size_begin != -1 && size_end != -1) {
+                // 尺寸内容
+                size_searchValue = newStr.slice(size_begin, size_end + 1);
+                let size_value = newStr.slice(size_begin + 1, size_begin + 3);
+                let size_sub = size_searchValue.slice(4, size_searchValue.length - 1);
+                if (size_sub) {
+                    let new_value = '<size = ' + size_value + '>' + size_sub + '</color>';
+                    newStr = newStr.replace(size_searchValue, new_value);
+                }
+
+                size_index = size_end;
+            } else {
+                break;
+            }
+        }
+        return newStr;
+    }
+    /**按品质转换字符串颜色 */
+    private getColorStringColor(str: string = '#FFFFFF', color_str: string): string {
+        return '<color=' + color_str + '>' + str + '</color>';
+    }
+
+
+    /**
+     * 阿拉伯数字 转 汉字
+     * @param num 要转的数字
+     * @returns 汉字数字
+     * @author xhx
+     */
+    public arabicToChinese(num: number): string {
+        let unit_section = ['', '万', '亿', '万亿', '亿亿'];
+        let unit_chn = ['', '十', '百', '千'];
+        let chars = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
+        let unit_index = 0;
+        let str_ins = '', zh_str = '';
+        let need_zero = false;
+
+        let SectionToChinese = function (section) {
+            let _zh_str = '';
+            let _unit_index = 0;
+            let zero = true;
+            while (section > 0) {
+                let v = section % 10;
+                let _str_ins = '';
+                if (v === 0) {
+                    if (!zero) {
+                        zero = true;
+                        _zh_str = chars[v] + _zh_str;
+                    }
+                } else {
+                    zero = false;
+                    if (_unit_index !== 1 || section > 1) {
+                        _str_ins = chars[v];
+                    }
+
+                    _str_ins += unit_chn[_unit_index];
+                    _zh_str = _str_ins + _zh_str;
+                }
+                ++_unit_index;
+                section = Math.floor(section / 10);
+            }
+            return _zh_str;
+        };
+
+        if (num === 0) {
+            return chars[0];
+        }
+
+        while (num > 0) {
+            let section = num % 10000;
+            if (need_zero) {
+                zh_str = chars[0] + zh_str;
+            }
+            str_ins = SectionToChinese(section);
+            str_ins += (section !== 0) ? unit_section[unit_index] : unit_section[0];
+            zh_str = str_ins + zh_str;
+            need_zero = (section < 1000) && (section > 0);
+            num = Math.floor(num / 10000);
+            ++unit_index;
+        }
+
+        return zh_str;
+    }
+    /**
+     * 限制字符串长度,超出部分用...代替
+     * @param str 要拆分的字符串
+     * @param max_len 最大长度
+     * @returns 被限制后的字符串
+     * @author xhx
+     */
+    public getNewLimitStr(str: string, max_len: number) {
+        let arr_str = str.split("");
+        let new_str = '';
+        max_len = arr_str.length >= max_len ? max_len : arr_str.length;//字符串不能超出的长度,否则用...显示
+        for (let i = 0; i < max_len; i++) {
+            if (i == (max_len - 1)) {
+                new_str += '...';
+            } else {
+                new_str += arr_str[i];
+            }
+        }
+        return new_str;
+    }
+}
+
+

+ 9 - 0
mk_framework/assets/script/mk/utils/StringUtil.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "1.0.8",
+  "uuid": "4c029b5e-91f6-4b10-a8fd-c6fb884c4c1f",
+  "isPlugin": false,
+  "loadPluginInWeb": true,
+  "loadPluginInNative": true,
+  "loadPluginInEditor": false,
+  "subMetas": {}
+}

+ 98 - 0
mk_framework/assets/script/mk/utils/TimerManager.ts

@@ -0,0 +1,98 @@
+/**
+ * 时间工具管理类
+ */
+export default class TimerManager {
+    /**
+     * 获取当前日期
+     * @param replace 间隔符,默认'-',则返回2020-10-10
+     * @returns 当前时间字符串
+     */
+    public getNowDay(replace: string = '-'): string {
+        // let day = new Date().toLocaleDateString().replace(/\//g, replace);// 这东西每种设备返回的格式不一样,不要用!
+        let str = new Date();
+        let day = str.getFullYear() + replace + (str.getMonth() + 1) + replace + str.getDate();
+        return day;
+    }
+    /**
+     * 计算日期之差【要求两日期格式相同】
+     * @param strDateStart 开始时间
+     * @param strDateEnd 结束时间
+     * @param replace 日期分隔符,默认-
+     * @returns <number>两日期之间相差多少天
+     */
+    public getDaysCount(strDateStart: string, strDateEnd: string, replace: string = '-'): number {
+        var replace = "-"; //日期分隔符
+        var oDate1;
+        var oDate2;
+        var iDays;
+        oDate1 = strDateStart.split(replace);
+        oDate2 = strDateEnd.split(replace);
+        var strDateS = new Date(oDate1[0], oDate1[1] - 1, oDate1[2]) as any;
+        var strDateE = new Date(oDate2[0], oDate2[1] - 1, oDate2[2]) as any;
+        let temp_num = Math.abs(strDateS - strDateE) as any || 0;
+        temp_num = temp_num / 1000 / 60 / 60 / 24;
+        iDays = parseInt(temp_num)//把相差的毫秒数转换为天数 
+
+        return iDays;
+    }
+    /**
+     * 是否是第二个月
+     * @param strDateStart 开始时间
+     * @param strDateEnd 结束时间
+     * @param replace 日期分隔符,默认-
+     * @returns <boolean>
+     */
+    public isNextMonth(strDateStart: string, strDateEnd: string, replace: string = '-'): boolean {
+        let oDate1 = strDateStart.split(replace);
+        let oDate2 = strDateEnd.split(replace);
+        if (parseInt(oDate1[1]) < parseInt(oDate2[1])) {
+            return true;
+        }
+        return false;
+    }
+    /**
+     * 将秒转换成 时分秒 格式 
+     * @param value <string>秒
+     * @param complement <number>补位,1补位到分,>1补位到时
+     * @returns <string>时分秒 格式的时间
+     */
+    public formatSeconds(value: string, complement: number = 0): string {
+        let theTime = parseInt(value);// 秒
+        let middle = 0;// 分
+        let hour = 0;// 小时
+
+        if (theTime > 60) {
+            middle = parseInt((theTime / 60) as any);
+            theTime = parseInt((theTime % 60) as any);
+            if (middle > 60) {
+                hour = parseInt((middle / 60) as any);
+                middle = parseInt((middle % 60) as any);
+            }
+        }
+        let second = parseInt(theTime as any) as any;
+        if (complement) {
+            second = second < 10 ? '0' + second : second;// 补位加0
+        }
+        let result = "" + second + "";//秒
+        if (middle > 0) {
+            let str_middle = parseInt(middle as any) as any;
+            str_middle = str_middle < 10 ? '0' + str_middle : str_middle;// 补位加0
+            result = "" + str_middle + ":" + result;//分
+        } else {
+            if (complement) {
+                result = "00" + ":" + result;//分
+            }
+        }
+        if (hour > 0) {
+            let str_hour = parseInt(hour as any) as any;
+            str_hour = str_hour < 10 ? '0' + str_hour : str_hour;// 补位加0
+            result = "" + str_hour + ":" + result;//小时
+        } else {
+            if (complement > 1) {
+                result = "00" + ":" + result;// 时
+            }
+        }
+        return result;
+    }
+
+}

+ 9 - 0
mk_framework/assets/script/mk/utils/TimerManager.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "1.0.8",
+  "uuid": "ab83e5a7-4044-4b61-8b12-a64b5fd7e6c5",
+  "isPlugin": false,
+  "loadPluginInWeb": true,
+  "loadPluginInNative": true,
+  "loadPluginInEditor": false,
+  "subMetas": {}
+}