1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
| import {FntConfig, IBitmapFont} from "./IBitmapFont";
const {ccclass, property} = cc._decorator;
@ccclass export class Helloworld extends cc.Component { @property(cc.Label) label: cc.Label = null;
private bmFontInfo: { font_texture: cc.Texture2D, font_json: cc.JsonAsset } = {font_texture:null,font_json:null};
protected start() { const list = [ {url: "https://xxxx.xxx.com/tcs/test/minitest/game_test_font.png", type: "png"}, {url: "https://xxxx.xxx.com/tcs/test/minitest/game_test_font.json", type: "json"}, ] Promise.all(list.map(item => this.loadRemoteSource(item.url, item.type, true))) .then((res) => { this.showBMfont(res); }) .catch(error => { console.error("Failed to load resources:", error); }); } private showBMfont(list: any[]) { list.forEach((item, index) => { if (item instanceof cc.Texture2D) { console.log("res 是 cc.Texture2D 类型"); this.bmFontInfo.font_texture = item; } else if (item instanceof cc.JsonAsset) { console.log("res 是 cc.JsonAsset 类型"); this.bmFontInfo.font_json = item; } else { console.log("res 不是 cc.Texture2D 也不是 cc.JsonAsset 类型"); } })
this.setLabelBMFont(this.label);
}
private setLabelBMFont(label: cc.Label) { const bmFont = new cc.BitmapFont(); const json:IBitmapFont = <IBitmapFont>this.bmFontInfo.font_json.json; const texture = this.bmFontInfo.font_texture; const spriteFrame = new cc.SpriteFrame(texture); const dictionary = this.getFontDefDictionary(spriteFrame, json._fntConfig);
bmFont["spriteFrame"] = spriteFrame; bmFont["fontSize"] = json.fontSize; bmFont["_fntConfig"] = json._fntConfig; bmFont["_fontDefDictionary"] = dictionary; label.font = bmFont; }
private loadRemoteSource(url: string, type: string, forceUpdate?: boolean) { const forceUpdateStr: string = forceUpdate ? `?time=${cc.sys.now()}` : ""; url += forceUpdateStr; return new Promise((resolve, reject) => { cc.assetManager.loadRemote(url, (err, res) => { if (err) { console.log(err); return; } resolve(res) }); }) }
private getFontDefDictionary(texture:cc.SpriteFrame, data:FntConfig) { const FontconstterDefinition = function FontconstterDefinition() { this.u = 0; this.v = 0; this.w = 0; this.h = 0; this.offsetX = 0; this.offsetY = 0; this.textureID = 0; this.valid = false; this.xAdvance = 0; };
const FontAtlas = function FontAtlas(texture) { this._constterDefinitions = {}; this._texture = texture; }; FontAtlas.prototype = { constructor: FontAtlas, addconstterDefinitions(constter, constterDefinition) { this._constterDefinitions[constter] = constterDefinition; }, cloneconstterDefinition() { const copyconstterDefinitions = {}; for (const key in this._constterDefinitions) { const value = new FontconstterDefinition(); cc.js.mixin(value, this._constterDefinitions[key]); copyconstterDefinitions[key] = value; } return copyconstterDefinitions; }, getTexture() { return this._texture; }, getLetter(key) { return this._constterDefinitions[key]; }, getLetterDefinitionForChar(char) { const key = char.charCodeAt(0); const hasKey = this._constterDefinitions.hasOwnProperty(key); return hasKey ? this._constterDefinitions[key] : null; }, clear() { this._constterDefinitions = {}; }, }; const fontAtlas = new FontAtlas(texture); const fontDict = data.fontDefDictionary; for (const fontDef in fontDict) { const constter = new FontconstterDefinition();
const rect = fontDict[fontDef].rect; constter.offsetX = fontDict[fontDef].xOffset; constter.offsetY = fontDict[fontDef].yOffset; constter.w = rect.width; constter.h = rect.height; constter.u = rect.x; constter.v = rect.y; constter.textureID = 0; constter.valid = true; constter.xAdvance = fontDict[fontDef].xAdvance; fontAtlas.addconstterDefinitions(fontDef, constter); } return fontAtlas; }
}
|