import Bag from "../../bag/Bag"; import SKLogger from "../util/SKLogger"; import SKUIUtil from "../util/SKUIUtil"; export enum TipAlign { TOP_RIGHT = 0, } export default class FGUtil { static hasAlert: boolean = false; private static _root: fgui.GRoot; // 註冊字體 static regFonts(url: string, completeBlock?: () => void) { let fonts = cc.loader.getRes(url); if (fonts) { return; } cc.loader.loadResDir(url, cc.TTFFont, (error: Error, resources: any[], urls: string[]) => { if (error) { cc.log(`加載字體錯誤:${error.message}`); return; } for (let resource of resources) { fgui.registerFont(resource.name, resource); } cc.loader.loadResDir(url, cc.BitmapFont, (error: Error, resources: any[], urls: string[]) => { if (error) { cc.log(`加載字體錯誤:${error.message}`); return; } for (let resource of resources) { fgui.registerFont(resource.name, resource); } if (completeBlock) { completeBlock(); } }); }); } // 加載包 static load(name: string, progressBlock?: (progress: number) => void, completeBlock?: (error: Error) => void) { // 判斷是否已加載 if (fgui.UIPackage.getByName(name)) { if (completeBlock) { completeBlock(null); } return; } fgui.addLoadHandler(); fgui.UIPackage.load(name, progressBlock, completeBlock); } // 獲得根節點 static root(): fgui.GRoot { if (this._root == null) { fgui.GRoot.create(); this._root = fgui.GRoot.inst; return this._root; } let parent = this._root.node.parent; if (parent != null) { let valid = SKUIUtil.isValid(parent); if (valid) { return this._root; } else { SKLogger.warn("fgui.GRoot.inst已釋放"); } } fgui.GRoot.create(); this._root = fgui.GRoot.inst; return this._root; } // 適配屏幕 static fitScreen(target: fgui.GObject) { if (!cc.sys.isNative) { target.makeFullScreen(); cc.log("H5適配"); } else { target.makeFullScreen(); cc.log("原生適配"); } } // 創建組件 static create(pkgName: string, resName: string): fgui.GComponent { let object = fgui.UIPackage.createObject(pkgName, resName); let result: fgui.GComponent = null; if (object) { result = object.asCom; } return result; } // 釋放 static dispose(value: fgui.GObject) { if (value == null) { return; } if (!SKUIUtil.isValid(value.node)) { return; } value.dispose(); } // 獲得對像類型 static getObject(target: fgui.GComponent, path: string): fgui.GObject { if (!target) { cc.warn(`$警告:獲得fgui.GObject目標為空`); return target; } let list = path.split("/"); let temp: fgui.GComponent = target; let group: fgui.GGroup = null; let child: fgui.GObject = null; for (let name of list) { if (group == null) { child = temp.getChild(name); } else { child = temp.getChildInGroup(name, group); group = null; } if (child == null) { return null; } temp = child.asCom; if (temp == null) { return null; } if (temp instanceof fgui.GGroup) { group = temp; temp = child.parent; if (temp == null) { temp = target; } } } return temp; } // 獲得組件 static getComponent(target: fgui.GComponent, path: string): fgui.GComponent { let temp = this.getObject(target, path); if (!temp) { cc.log(`${target.name}找不到組件:${path}`); return; } let result = temp.asCom; if (!result) { cc.log(`${target.name}獲取組件:${path}不是fgui.GComponent類型`); return null; } return result; } // 獲得組 static getGroup(target: fgui.GComponent, path: string): fgui.GGroup { let temp = this.getObject(target, path); if (!temp) { cc.log(`${target.name}找不到標籤:${path}`); return; } let result = temp.asGroup; if (result == null) { cc.log(`${target.name}获取组:${path}不是fgui.GGroup类型`); return null; } return result; } // 獲得控制器 static getControl(target: fgui.GComponent, path: string): fairygui.Controller { let list = path.split("/"); let name = list[list.length - 1]; list.splice(list.length - 1, 1); let temp: fgui.GComponent = target; if (list.length > 0) { temp = this.getComponent(target, list.join("/")); if (temp == null) { cc.log(`${target.name}找不到組件:${path}`); return; } } let result = temp.getController(name); if (result == null) { cc.log(`${target.name}獲取組:${path}不是fairygui.Controller類型`); return null; } return result; } // 獲得圖像 static getImage(target: fgui.GComponent, path: string): fgui.GImage { let temp = this.getObject(target, path); if (!temp) { cc.log(`${target.name}找不到組件:${path}`); return; } let result = temp.asImage; if (!result) { cc.log(`${target.name}獲取組件:${path}不是fgui.GComponent類型`); return null; } return result; } // 獲得標籤 static getTextField(target: fgui.GComponent, path: string): fgui.GTextField { let temp = this.getObject(target, path); if (!temp) { cc.log(`${target.name}找不到標籤:${path}`); return; } let result = temp.asTextField; if (!result) { cc.log(`${target.name}獲取標籤:${path}不是fgui.GTextField類型`); return null; } return result; } // 獲得按鈕 static getButton(target: fgui.GComponent, path: string): fgui.GButton { if (target == null) { return null; } let temp = this.getObject(target, path); if (temp == null) { cc.log(`${target.name}找不到按鈕:${path}`); return; } let result = temp.asButton; if (result == null) { cc.log(`${target.name}獲取按鈕:${path}不是fgui.GButton類型`); return null; } return result; } // 獲得輸入文本 static getTextInput(target: fgui.GComponent, path: string): fgui.GTextInput { let temp = this.getObject(target, path); if (!temp) { cc.log(`${target.name}找不到輸入文本:${path}`); return; } let result = temp.asTextInput; if (!result) { cc.log(`${target.name}獲取輸入文本:${path}不是fgui.GTextInput類型`); return null; } return result; } // 獲得進度條 static getProgressBar(target: fgui.GComponent, path: string): fgui.GProgressBar { let temp = this.getObject(target, path); if (!temp) { cc.log(`${target.name}找不到進度條:${path}`); return; } let result = temp.asProgress; if (!result) { cc.log(`${target.name}獲取進度條:${path}不是fgui.GProgressBar類型`); return null; } return result; } // 獲得加載器 static getLoader(target: fgui.GComponent, path: string): fgui.GLoader { let temp = this.getObject(target, path); if (!temp) { cc.log(`${target.name}找不到加載器:${path}`); return; } let result = temp.asLoader; if (!result) { cc.log(`${target.name}獲取加載器:${path}不是fgui.GLoader類型`); return null; } return result; } // 獲得列表 static getList(target: fgui.GComponent, path: string): fgui.GList { let temp = this.getObject(target, path); console.log(temp , 777) if (!temp) { cc.log(`${target.name}找不到列表:${path}`); return; } let result = temp.asList; if (!result) { cc.log(`${target.name}獲取列表:${path}不是fgui.GList類型`); return null; } return result; } // 獲得富文本 static getRichTextField(target: fgui.GComponent, path: string): fgui.GRichTextField { let temp = this.getObject(target, path); if (!temp) { cc.log(`${target.name}找不到富文本:${path}`); return; } let result = temp.asRichTextField; if (!result) { cc.log(`${target.name}獲取富文本:${path}不是fgui.GRichTextField類型`); return null; } return result; } // 獲得動畫 static getAnim(target: fgui.GComponent, path: string): fgui.GMovieClip { let temp = this.getObject(target, path); if (!temp) { cc.log(`${target.name}找不到動畫:${path}`); return; } let result = temp.asMovieClip; if (!result) { cc.log(`${target.name}獲取列表:${path}不是fgui.GMovieClip類型`); return null; } return result; } // 獲得位圖精靈 static getImageSprite(target: fgui.GComponent, path: string): fgui.Image { let temp = this.getObject(target, path); if (!temp) { cc.log(`${target.name}找不到位圖精靈:${path}`); return; } let result = temp.asImage; if (!result) { cc.log(`${target.name}獲取位圖精靈:${path}不是fgui.GImage類型`); return null; } return result._content; } // 設置按鈕 static setButton(target: fgui.GComponent, path: string, listener: Function, owner: any): fgui.GButton { let btn = this.getButton(target, path); if (!btn) { cc.log(`設置按鈕:找不到按鈕${path}`); return null; } btn.onClick(listener, owner); } // 設置輸入文本 static setTextInput(target: fgui.GComponent, path: string, prompt: string, password: boolean = false): fgui.GTextInput { let ti = this.getTextInput(target, path); if (!ti) { cc.log(`找不到輸入文本${path}`); return null; } ti.password = password; ti.ubbEnabled = true; let promptText = `[i][color=#999999]${prompt}[/color][/i]`; ti.promptText = promptText; cc.log(`設置${path}輸入文本類型成功!`); return ti; } static align(source: fgui.GObject, target: fgui.GObject, align: TipAlign) { let pos = source.localToGlobal(0, 0); let tx = pos.x + source.width - target.width; let ty = pos.y - target.height; target.setPosition(tx, ty); } // 獲得文本渲染寬度 static labelWidthOf(value: string, fontSize: number): number { let node = new cc.Node(); cc.director.getScene().addChild(node); let label = node.addComponent(cc.Label); label.fontSize = fontSize; label.string = value; // _forceUpdateRenderData(); 2.2及後的版本都是用的這個。 // _updateRenderData(true); 這個好像是2.1及之前版本用的。 // 可以看源碼 ...resources\engine\cocos2d\core\components\CCLabel.js // 直接操作組件對象 (label)._forceUpdateRenderData(); let width = Math.ceil(label.node.getContentSize().width); node.removeFromParent(); return width; } // 獲得富文本渲染宽度 static richTextWidthOf(value: fgui.GRichTextField): number { let node = new cc.Node(); cc.director.getScene().addChild(node); let richTF = node.addComponent(cc.RichText); richTF.fontSize = value.fontSize; let rt = value.node.getComponent(cc.RichText); richTF.string = rt.string; // 可看源碼 ...resources\engine\cocos2d\core\components\CCLabel.js\CCRichText.js // 可看源碼 ...resources\engine\bin\.cache\dev\cocos2d\core\CCNode.js // 1. 先操作組件所處節點對象(激活組件所在的節點) // 2. 再刷新組件 (richTF)._activeInHierarchy = true; (richTF)._updateRichText(); let width = Math.ceil(richTF.node.getContentSize().width); node.removeFromParent(); return width; } }