试试这个
import { js, Label, assetManager, ImageAsset, SpriteFrame, Texture2D, LabelAtlas, path } from "cc";
class FontLetterDefinition {
public rect = {};
public u = 0;
public v = 0;
public w = 0;
public h = 0;
public offsetX = 0;
public offsetY = 0;
public textureID = 0;
public valid = false;
public xAdvance = 0;
}
interface ILetterDefinition {
[key: string]: FontLetterDefinition;
}
class FontAtlas {
public declare letterDefinitions;
public declare texture;
constructor(texture) {
this.letterDefinitions = {};
this.texture = texture;
}
public addLetterDefinitions(letter, letterDefinition): void {
this.letterDefinitions[letter] = letterDefinition;
}
public cloneLetterDefinition(): ILetterDefinition {
const copyLetterDefinitions: ILetterDefinition = {};
for (const key of Object.keys(this.letterDefinitions)) {
const value = new FontLetterDefinition();
js.mixin(value, this.letterDefinitions[key]);
copyLetterDefinitions[key] = value;
}
return copyLetterDefinitions;
}
public getTexture(): any {
return this.texture;
}
public getLetter(key): any {
return this.letterDefinitions[key];
}
public getLetterDefinitionForChar(char, labelInfo?): any {
const key = char.charCodeAt(0);
const hasKey = this.letterDefinitions.hasOwnProperty(key);
let letter;
if (hasKey) {
letter = this.letterDefinitions[key];
} else {
letter = null;
}
return letter;
}
public clear(): void {
this.letterDefinitions = {};
}
}
export default class RemoteLoader {
public static loadRemoteLabelatlas(remoteImageUrl: string, label: Label) {
let fontCount = 6;
let startChar = '.';
assetManager.loadRemote<ImageAsset>(remoteImageUrl, (err, imageAsset) => {
if (err) {
console.error('Failed to load Texture2D:', err);
return;
}
const spriteFrame = new SpriteFrame();
const texture = new Texture2D();
texture.image = imageAsset;
spriteFrame.texture = texture;
let labelAtlas = new LabelAtlas('testFont');
let fntConfig = {
fontDefDictionary: new FontAtlas(spriteFrame.texture),
atlasName: path.basename(remoteImageUrl),
commonHeight: imageAsset.height,
fontSize: Number((imageAsset.height / (100 / 88)).toFixed(2))
};
for (let index = 0; index < fontCount; index++) {
const letter = new FontLetterDefinition();
const rect = spriteFrame.rect;
letter.offsetX = spriteFrame['_offset'].x;
letter.offsetY = spriteFrame['_offset'].y;
letter.w = Math.ceil(rect.width / fontCount);
letter.h = rect.height;
letter.u = spriteFrame['_trimmedBorder'].x + letter.w * index;
letter.v = spriteFrame['_trimmedBorder'].y;
// FIXME: only one texture supported for now
letter.textureID = 0;
letter.valid = true;
letter.rect = {
width: letter.w,
height: letter.h,
x: letter.u,
y: letter.v
}
letter.xAdvance = letter.w;
const fontDef = startChar.charCodeAt(0) + index;
fntConfig.fontDefDictionary.addLetterDefinitions(fontDef, letter);
}
labelAtlas.fontDefDictionary = fntConfig.fontDefDictionary;
labelAtlas.fntConfig = fntConfig;
labelAtlas.fontSize = labelAtlas.fntConfig.fontSize;
labelAtlas.spriteFrame = spriteFrame;
label.font = labelAtlas;
label.useSystemFont = false;
label.cacheMode = Label.CacheMode.BITMAP;
});
}
}