mirror of
https://github.com/unanmed/HumanBreak.git
synced 2025-10-29 10:22:59 +08:00
feat: 素材管理器
This commit is contained in:
parent
ce7be406cb
commit
618827b419
6
packages-user/client-base/package.json
Normal file
6
packages-user/client-base/package.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"name": "@user/client-base",
|
||||||
|
"dependencies": {
|
||||||
|
"@motajs/render-asset": "workspace:*"
|
||||||
|
}
|
||||||
|
}
|
||||||
7
packages-user/client-base/src/index.ts
Normal file
7
packages-user/client-base/src/index.ts
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
import { createMaterial } from './material';
|
||||||
|
|
||||||
|
export function create() {
|
||||||
|
createMaterial();
|
||||||
|
}
|
||||||
|
|
||||||
|
export * from './material';
|
||||||
56
packages-user/client-base/src/material/builder.ts
Normal file
56
packages-user/client-base/src/material/builder.ts
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
import {
|
||||||
|
ITextureStore,
|
||||||
|
ITexture,
|
||||||
|
ITextureComposedData,
|
||||||
|
ITextureStreamComposer,
|
||||||
|
TextureMaxRectsStreamComposer
|
||||||
|
} from '@motajs/render-assets';
|
||||||
|
import { IAssetBuilder } from './types';
|
||||||
|
import { logger } from '@motajs/common';
|
||||||
|
|
||||||
|
export class AssetBuilder implements IAssetBuilder {
|
||||||
|
readonly composer: ITextureStreamComposer<void> =
|
||||||
|
new TextureMaxRectsStreamComposer(4096, 4096, 0);
|
||||||
|
|
||||||
|
private output: ITextureStore | null = null;
|
||||||
|
private started: boolean = false;
|
||||||
|
|
||||||
|
pipe(store: ITextureStore): void {
|
||||||
|
if (this.started) {
|
||||||
|
logger.warn(76);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.output = store;
|
||||||
|
}
|
||||||
|
|
||||||
|
addTexture(texture: ITexture): ITextureComposedData {
|
||||||
|
this.started = true;
|
||||||
|
const res = [...this.composer.add([texture])];
|
||||||
|
const data = res[0];
|
||||||
|
if (this.output) {
|
||||||
|
if (!this.output.getTexture(data.index)) {
|
||||||
|
this.output.addTexture(data.index, data.texture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
addTextureList(
|
||||||
|
texture: Iterable<ITexture>
|
||||||
|
): Iterable<ITextureComposedData> {
|
||||||
|
this.started = true;
|
||||||
|
const res = [...this.composer.add(texture)];
|
||||||
|
if (this.output) {
|
||||||
|
res.forEach(v => {
|
||||||
|
if (!this.output!.getTexture(v.index)) {
|
||||||
|
this.output!.addTexture(v.index, v.texture);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
close(): void {
|
||||||
|
this.composer.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
3
packages-user/client-base/src/material/index.ts
Normal file
3
packages-user/client-base/src/material/index.ts
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
export function createMaterial() {}
|
||||||
|
|
||||||
|
export * from './manager';
|
||||||
325
packages-user/client-base/src/material/manager.ts
Normal file
325
packages-user/client-base/src/material/manager.ts
Normal file
@ -0,0 +1,325 @@
|
|||||||
|
import {
|
||||||
|
ITexture,
|
||||||
|
ITextureComposedData,
|
||||||
|
ITextureRenderable,
|
||||||
|
ITextureSplitter,
|
||||||
|
ITextureStore,
|
||||||
|
SizedCanvasImageSource,
|
||||||
|
Texture,
|
||||||
|
TextureColumnAnimater,
|
||||||
|
TextureGridSplitter,
|
||||||
|
TextureRowSplitter,
|
||||||
|
TextureStore
|
||||||
|
} from '@motajs/render-assets';
|
||||||
|
import {
|
||||||
|
IBlockIdentifier,
|
||||||
|
IMaterialData,
|
||||||
|
IMaterialManager,
|
||||||
|
IIndexedIdentifier,
|
||||||
|
IMaterialAssetData,
|
||||||
|
BlockCls,
|
||||||
|
IBigImageData,
|
||||||
|
IAssetBuilder
|
||||||
|
} from './types';
|
||||||
|
import { logger } from '@motajs/common';
|
||||||
|
import { getClsByString } from './utils';
|
||||||
|
import { isNil } from 'lodash-es';
|
||||||
|
import { AssetBuilder } from './builder';
|
||||||
|
|
||||||
|
export class MaterialManager implements IMaterialManager {
|
||||||
|
readonly tileStore: ITextureStore = new TextureStore();
|
||||||
|
readonly tilesetStore: ITextureStore = new TextureStore();
|
||||||
|
readonly imageStore: ITextureStore = new TextureStore();
|
||||||
|
readonly assetStore: ITextureStore = new TextureStore();
|
||||||
|
readonly bigImageStore: ITextureStore = new TextureStore();
|
||||||
|
|
||||||
|
/** 图集信息存储 */
|
||||||
|
readonly assetDataStore: Map<number, ITextureComposedData> = new Map();
|
||||||
|
/** 大怪物数据 */
|
||||||
|
readonly bigImageData: Map<number, ITexture> = new Map();
|
||||||
|
/** tileset 中 `Math.floor(id / 10000) + 1` 映射到 tileset 对应索引的映射,用于处理图块超出 10000 的 tileset */
|
||||||
|
readonly tilesetOffsetMap: Map<number, number> = new Map();
|
||||||
|
/** 图集打包器 */
|
||||||
|
readonly assetBuilder: IAssetBuilder = new AssetBuilder();
|
||||||
|
|
||||||
|
readonly idNumMap: Map<string, number> = new Map();
|
||||||
|
readonly numIdMap: Map<number, string> = new Map();
|
||||||
|
readonly clsMap: Map<number, BlockCls> = new Map();
|
||||||
|
|
||||||
|
/** 网格切分器 */
|
||||||
|
readonly gridSplitter: TextureGridSplitter = new TextureGridSplitter();
|
||||||
|
/** 行切分器 */
|
||||||
|
readonly rowSplitter: TextureRowSplitter = new TextureRowSplitter();
|
||||||
|
|
||||||
|
/** 大怪物贴图的标识符 */
|
||||||
|
private bigImageId: number = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加由分割器和图块映射组成的图像源贴图
|
||||||
|
* @param source 图像源
|
||||||
|
* @param map 图块 id 与图块数字映射
|
||||||
|
* @param store 要添加至的贴图存储对象
|
||||||
|
* @param splitter 使用的分割器
|
||||||
|
* @param splitterData 传递给分割器的数据
|
||||||
|
* @param processTexture 对每个纹理进行处理
|
||||||
|
*/
|
||||||
|
private addMappedSource<T>(
|
||||||
|
source: SizedCanvasImageSource,
|
||||||
|
map: ArrayLike<IBlockIdentifier>,
|
||||||
|
store: ITextureStore,
|
||||||
|
splitter: ITextureSplitter<T>,
|
||||||
|
splitterData: T,
|
||||||
|
processTexture?: (tex: ITexture) => void
|
||||||
|
): Iterable<IMaterialData> {
|
||||||
|
const tex = new Texture(source);
|
||||||
|
const textures = [...splitter.split(tex, splitterData)];
|
||||||
|
if (textures.length !== map.length) {
|
||||||
|
logger.warn(75, textures.length.toString(), map.length.toString());
|
||||||
|
}
|
||||||
|
const res: IMaterialData[] = textures.map((v, i) => {
|
||||||
|
const { id, num, cls } = map[i];
|
||||||
|
store.addTexture(num, v);
|
||||||
|
store.alias(num, id);
|
||||||
|
this.clsMap.set(num, getClsByString(cls));
|
||||||
|
processTexture?.(v);
|
||||||
|
const data: IMaterialData = {
|
||||||
|
store,
|
||||||
|
texture: v,
|
||||||
|
identifier: num,
|
||||||
|
alias: id
|
||||||
|
};
|
||||||
|
return data;
|
||||||
|
});
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
addGrid(
|
||||||
|
source: SizedCanvasImageSource,
|
||||||
|
map: ArrayLike<IBlockIdentifier>
|
||||||
|
): Iterable<IMaterialData> {
|
||||||
|
return this.addMappedSource(
|
||||||
|
source,
|
||||||
|
map,
|
||||||
|
this.tileStore,
|
||||||
|
this.gridSplitter,
|
||||||
|
[32, 32]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
addRowAnimate(
|
||||||
|
source: SizedCanvasImageSource,
|
||||||
|
map: ArrayLike<IBlockIdentifier>,
|
||||||
|
frames: number
|
||||||
|
): Iterable<IMaterialData> {
|
||||||
|
return this.addMappedSource(
|
||||||
|
source,
|
||||||
|
map,
|
||||||
|
this.tileStore,
|
||||||
|
this.rowSplitter,
|
||||||
|
32,
|
||||||
|
(tex: ITexture<number>) => {
|
||||||
|
tex.animated(new TextureColumnAnimater(), frames);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
addAutotile(
|
||||||
|
source: SizedCanvasImageSource,
|
||||||
|
identifier: IBlockIdentifier
|
||||||
|
): IMaterialData {
|
||||||
|
const texture = new Texture(source);
|
||||||
|
this.tileStore.addTexture(identifier.num, texture);
|
||||||
|
this.tileStore.alias(identifier.num, identifier.id);
|
||||||
|
this.clsMap.set(identifier.num, BlockCls.Autotile);
|
||||||
|
const data: IMaterialData = {
|
||||||
|
store: this.tileStore,
|
||||||
|
texture,
|
||||||
|
identifier: identifier.num,
|
||||||
|
alias: identifier.id
|
||||||
|
};
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
addTileset(
|
||||||
|
source: SizedCanvasImageSource,
|
||||||
|
identifier: IIndexedIdentifier
|
||||||
|
): IMaterialData {
|
||||||
|
const tex = new Texture(source);
|
||||||
|
this.tilesetStore.addTexture(identifier.index, tex);
|
||||||
|
this.tilesetStore.alias(identifier.index, identifier.alias);
|
||||||
|
const data: IMaterialData = {
|
||||||
|
store: this.tilesetStore,
|
||||||
|
texture: tex,
|
||||||
|
identifier: identifier.index,
|
||||||
|
alias: identifier.alias
|
||||||
|
};
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
addImage(
|
||||||
|
source: SizedCanvasImageSource,
|
||||||
|
identifier: IIndexedIdentifier
|
||||||
|
): IMaterialData {
|
||||||
|
const texture = new Texture(source);
|
||||||
|
this.imageStore.addTexture(identifier.index, texture);
|
||||||
|
this.imageStore.alias(identifier.index, identifier.alias);
|
||||||
|
const data: IMaterialData = {
|
||||||
|
store: this.imageStore,
|
||||||
|
texture,
|
||||||
|
identifier: identifier.index,
|
||||||
|
alias: identifier.alias
|
||||||
|
};
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
getTile(identifier: number): ITexture | null {
|
||||||
|
return this.tileStore.getTexture(identifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
getTileset(identifier: number): ITexture | null {
|
||||||
|
return this.tilesetStore.getTexture(identifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
getImage(identifier: number): ITexture | null {
|
||||||
|
return this.imageStore.getTexture(identifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
getTileByAlias(alias: string): ITexture | null {
|
||||||
|
return this.tileStore.fromAlias(alias);
|
||||||
|
}
|
||||||
|
|
||||||
|
getTilesetByAlias(alias: string): ITexture | null {
|
||||||
|
return this.tilesetStore.fromAlias(alias);
|
||||||
|
}
|
||||||
|
|
||||||
|
getImageByAlias(alias: string): ITexture | null {
|
||||||
|
return this.imageStore.fromAlias(alias);
|
||||||
|
}
|
||||||
|
|
||||||
|
buildAssets(): Iterable<IMaterialAssetData> {
|
||||||
|
this.assetBuilder.pipe(this.assetStore);
|
||||||
|
const data = this.assetBuilder.addTextureList(this.tileStore.values());
|
||||||
|
const arr = [...data];
|
||||||
|
const res: IMaterialAssetData[] = [];
|
||||||
|
arr.forEach((v, i) => {
|
||||||
|
const alias = `asset-${i}`;
|
||||||
|
this.assetStore.alias(i, alias);
|
||||||
|
const data: IMaterialAssetData = {
|
||||||
|
data: v,
|
||||||
|
identifier: i,
|
||||||
|
alias,
|
||||||
|
store: this.assetStore
|
||||||
|
};
|
||||||
|
for (const tex of v.assetMap.keys()) {
|
||||||
|
tex.toAsset(v);
|
||||||
|
}
|
||||||
|
res.push(data);
|
||||||
|
});
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
getAsset(identifier: number): ITextureComposedData | null {
|
||||||
|
return this.assetDataStore.get(identifier) ?? null;
|
||||||
|
}
|
||||||
|
|
||||||
|
getAssetByAlias(alias: string): ITextureComposedData | null {
|
||||||
|
const id = this.assetStore.identifierOf(alias);
|
||||||
|
if (isNil(id)) return null;
|
||||||
|
return this.assetDataStore.get(id) ?? null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private getTextureOf(identifier: number, cls: BlockCls): ITexture | null {
|
||||||
|
if (cls === BlockCls.Unknown) return null;
|
||||||
|
if (cls !== BlockCls.Tileset) {
|
||||||
|
return this.tileStore.getTexture(identifier);
|
||||||
|
}
|
||||||
|
if (identifier < 10000) return null;
|
||||||
|
const texture = this.tileStore.getTexture(identifier);
|
||||||
|
if (texture) return texture;
|
||||||
|
// 如果 tileset 不存在,那么执行缓存操作
|
||||||
|
const offset = Math.floor(identifier / 10000);
|
||||||
|
const index = this.tilesetOffsetMap.get(offset);
|
||||||
|
if (isNil(index)) return null;
|
||||||
|
// 获取对应的 tileset 贴图
|
||||||
|
const tileset = this.tilesetStore.getTexture(index);
|
||||||
|
if (!tileset) return null;
|
||||||
|
// 计算图块位置
|
||||||
|
const rest = identifier - offset * 10000;
|
||||||
|
const { width, height } = tileset;
|
||||||
|
const tileWidth = Math.floor(width / 32);
|
||||||
|
const tileHeight = Math.floor(height / 32);
|
||||||
|
// 如果图块位置超出了贴图范围
|
||||||
|
if (rest > tileWidth * tileHeight) return null;
|
||||||
|
// 裁剪 tileset,生成贴图
|
||||||
|
const x = rest % tileWidth;
|
||||||
|
const y = Math.floor(rest / tileWidth);
|
||||||
|
const newTexture = new Texture(tileset.source);
|
||||||
|
newTexture.clip(x * 32, y * 32, 32, 32);
|
||||||
|
// 缓存贴图
|
||||||
|
this.tileStore.addTexture(identifier, newTexture);
|
||||||
|
this.idNumMap.set(`X${identifier}`, identifier);
|
||||||
|
this.numIdMap.set(identifier, `X${identifier}`);
|
||||||
|
const data = this.assetBuilder.addTexture(newTexture);
|
||||||
|
newTexture.toAsset(data);
|
||||||
|
return newTexture;
|
||||||
|
}
|
||||||
|
|
||||||
|
getRenderable(identifier: number): ITextureRenderable | null {
|
||||||
|
const cls = this.clsMap.get(identifier);
|
||||||
|
if (isNil(cls)) return null;
|
||||||
|
const texture = this.getTextureOf(identifier, cls);
|
||||||
|
if (!texture) return null;
|
||||||
|
return texture.static();
|
||||||
|
}
|
||||||
|
|
||||||
|
getRenderableByAlias(alias: string): ITextureRenderable | null {
|
||||||
|
const identifier = this.idNumMap.get(alias);
|
||||||
|
if (isNil(identifier)) return null;
|
||||||
|
return this.getRenderable(identifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
getBlockCls(identifier: number): BlockCls {
|
||||||
|
return this.clsMap.get(identifier) ?? BlockCls.Unknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
getBlockClsByAlias(alias: string): BlockCls {
|
||||||
|
const id = this.idNumMap.get(alias);
|
||||||
|
if (isNil(id)) return BlockCls.Unknown;
|
||||||
|
return this.clsMap.get(id) ?? BlockCls.Unknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
getIdentifierByAlias(alias: string): number | undefined {
|
||||||
|
return this.idNumMap.get(alias);
|
||||||
|
}
|
||||||
|
|
||||||
|
getAliasByIdentifier(identifier: number): string | undefined {
|
||||||
|
return this.numIdMap.get(identifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
setBigImage(identifier: number, image: ITexture): IBigImageData {
|
||||||
|
const bigImageId = this.bigImageId++;
|
||||||
|
this.bigImageStore.addTexture(bigImageId, image);
|
||||||
|
this.bigImageData.set(identifier, image);
|
||||||
|
const data: IBigImageData = {
|
||||||
|
identifier: bigImageId,
|
||||||
|
store: this.bigImageStore
|
||||||
|
};
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
isBigImage(identifier: number): boolean {
|
||||||
|
return this.bigImageData.has(identifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
getBigImage(identifier: number): ITexture | null {
|
||||||
|
return this.bigImageData.get(identifier) ?? null;
|
||||||
|
}
|
||||||
|
|
||||||
|
getBigImageByAlias(alias: string): ITexture | null {
|
||||||
|
const identifier = this.idNumMap.get(alias);
|
||||||
|
if (isNil(identifier)) return null;
|
||||||
|
return this.bigImageData.get(identifier) ?? null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const materials = new MaterialManager();
|
||||||
330
packages-user/client-base/src/material/types.ts
Normal file
330
packages-user/client-base/src/material/types.ts
Normal file
@ -0,0 +1,330 @@
|
|||||||
|
import {
|
||||||
|
IRect,
|
||||||
|
ITexture,
|
||||||
|
ITextureComposedData,
|
||||||
|
ITextureRenderable,
|
||||||
|
ITextureStore,
|
||||||
|
SizedCanvasImageSource
|
||||||
|
} from '@motajs/render-assets';
|
||||||
|
|
||||||
|
export const enum BlockCls {
|
||||||
|
Unknown,
|
||||||
|
Terrains,
|
||||||
|
Animates,
|
||||||
|
Enemys,
|
||||||
|
Npcs,
|
||||||
|
Items,
|
||||||
|
Enemy48,
|
||||||
|
Npc48,
|
||||||
|
Tileset,
|
||||||
|
Autotile
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IMaterialData {
|
||||||
|
/** 此素材的贴图对象存入了哪个贴图存储对象 */
|
||||||
|
readonly store: ITextureStore;
|
||||||
|
/** 贴图对象 */
|
||||||
|
readonly texture: ITexture;
|
||||||
|
/** 此素材的贴图对象的数字 id,一般对应到图块数字 */
|
||||||
|
readonly identifier: number;
|
||||||
|
/** 此素材的贴图对象的字符串别名,一般对应到图块 id */
|
||||||
|
readonly alias?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IBlockIdentifier {
|
||||||
|
/** 图块 id */
|
||||||
|
readonly id: string;
|
||||||
|
/** 图块数字 */
|
||||||
|
readonly num: number;
|
||||||
|
/** 图块类型 */
|
||||||
|
readonly cls: Cls;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IIndexedIdentifier {
|
||||||
|
/** 标识符索引 */
|
||||||
|
readonly index: number;
|
||||||
|
/** 标识符别名 */
|
||||||
|
readonly alias: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IMaterialAssetData {
|
||||||
|
/** 图集数据 */
|
||||||
|
readonly data: ITextureComposedData;
|
||||||
|
/** 贴图的标识符 */
|
||||||
|
readonly identifier: number;
|
||||||
|
/** 贴图的别名 */
|
||||||
|
readonly alias: string;
|
||||||
|
/** 贴图所属的存储对象 */
|
||||||
|
readonly store: ITextureStore;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IAutotileConnection {
|
||||||
|
/** 连接方式,上方连接是第一位,顺时针旋转位次依次升高 */
|
||||||
|
readonly connection: number;
|
||||||
|
/** 中心自动元件对应的图块数字 */
|
||||||
|
readonly center: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IAutotileRenderable {
|
||||||
|
/** 自动元件的图像源 */
|
||||||
|
readonly source: SizedCanvasImageSource;
|
||||||
|
/** 渲染的矩形范围 */
|
||||||
|
readonly rects: Readonly<IRect>[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IBigImageData {
|
||||||
|
/** 大怪物贴图在 store 中的标识符 */
|
||||||
|
readonly identifier: number;
|
||||||
|
/** 存储大怪物贴图的存储对象 */
|
||||||
|
readonly store: ITextureStore;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IAutotileProcessor {
|
||||||
|
/** 该自动元件处理器使用的素材管理器 */
|
||||||
|
readonly manager: IMaterialManager;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置一个自动元件的父元件,一个自动元件可以有多个父元件
|
||||||
|
* @param autotile 自动元件
|
||||||
|
* @param parent 自动元件的父元件
|
||||||
|
*/
|
||||||
|
setParent(autotile: number, parent: number): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取自动元件的链接情况
|
||||||
|
* @param array 地图图块数组
|
||||||
|
* @param index 自动元件图块所在的索引
|
||||||
|
* @param edge 当前图块的边缘连接情况
|
||||||
|
*/
|
||||||
|
connect(
|
||||||
|
array: Float32Array,
|
||||||
|
index: number,
|
||||||
|
edge: number
|
||||||
|
): IAutotileConnection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取指定自动元件的可渲染对象
|
||||||
|
* @param autotile 自动元件的图块数字
|
||||||
|
* @param connection 连接方式,上方连接是第一位,顺时针旋转位次依次升高
|
||||||
|
*/
|
||||||
|
render(autotile: number, connection: number): IAutotileRenderable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过可渲染对象输出自动元件经过连接的可渲染对象
|
||||||
|
* @param renderable 自动元件的原始可渲染对象
|
||||||
|
* @param connection 自动元件的链接方式
|
||||||
|
*/
|
||||||
|
fromRenderable(
|
||||||
|
renderable: ITextureRenderable,
|
||||||
|
connection: number
|
||||||
|
): IAutotileRenderable;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IMaterialManager {
|
||||||
|
/** 贴图存储,把 terrains 等内容单独分开存储 */
|
||||||
|
readonly tileStore: ITextureStore;
|
||||||
|
/** tilesets 贴图存储,每个 tileset 是一个贴图对象 */
|
||||||
|
readonly tilesetStore: ITextureStore;
|
||||||
|
/** 存储注册的图像的存储对象 */
|
||||||
|
readonly imageStore: ITextureStore;
|
||||||
|
/** 图集存储,将常用贴图存入其中 */
|
||||||
|
readonly assetStore: ITextureStore;
|
||||||
|
/** bigImage 存储,存储大怪物数据 */
|
||||||
|
readonly bigImageStore: ITextureStore;
|
||||||
|
|
||||||
|
/** 图块类型映射 */
|
||||||
|
readonly clsMap: Map<number, BlockCls>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加网格类型的贴图,包括 terrains 和 items 类型
|
||||||
|
* @param source 图像源
|
||||||
|
* @param map 贴图字符串 id 与图块数字映射,按照先从左到右,再从上到下的顺序映射
|
||||||
|
*/
|
||||||
|
addGrid(
|
||||||
|
source: SizedCanvasImageSource,
|
||||||
|
map: ArrayLike<IBlockIdentifier>
|
||||||
|
): Iterable<IMaterialData>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加行动画的贴图,包括 animates enemys npcs enemy48 npc48 类型
|
||||||
|
* @param source 图像源
|
||||||
|
* @param map 贴图字符串 id 与图块数字映射,按从上到下的顺序映射
|
||||||
|
* @param frames 每一行的帧数
|
||||||
|
*/
|
||||||
|
addRowAnimate(
|
||||||
|
source: SizedCanvasImageSource,
|
||||||
|
map: ArrayLike<IBlockIdentifier>,
|
||||||
|
frames: number
|
||||||
|
): Iterable<IMaterialData>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加自动元件
|
||||||
|
* @param source 图像源
|
||||||
|
* @param identifier 自动元件的字符串 id 及图块数字
|
||||||
|
*/
|
||||||
|
addAutotile(
|
||||||
|
source: SizedCanvasImageSource,
|
||||||
|
identifier: IBlockIdentifier
|
||||||
|
): IMaterialData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加一个 tileset 类型的素材
|
||||||
|
* @param source 图像源
|
||||||
|
* @param alias tileset 的标识符,包含其在 tilesets 列表中的索引和图片名称
|
||||||
|
*/
|
||||||
|
addTileset(
|
||||||
|
source: SizedCanvasImageSource,
|
||||||
|
identifier: IIndexedIdentifier
|
||||||
|
): IMaterialData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加一个图片
|
||||||
|
* @param source 图像源
|
||||||
|
* @param identifier 图片的标识符,包含其在 images 列表中的索引和图片名称
|
||||||
|
*/
|
||||||
|
addImage(
|
||||||
|
source: SizedCanvasImageSource,
|
||||||
|
identifier: IIndexedIdentifier
|
||||||
|
): IMaterialData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据图块数字获取图块,可以获取额外素材,会自动将未缓存的额外素材缓存
|
||||||
|
* @param identifier 图块的图块数字
|
||||||
|
*/
|
||||||
|
getTile(identifier: number): ITexture | null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据额外素材索引获取额外素材
|
||||||
|
* @param identifier 额外素材的索引
|
||||||
|
*/
|
||||||
|
getTileset(identifier: number): ITexture | null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据图片的索引获取图片
|
||||||
|
* @param identifier 图片的索引
|
||||||
|
*/
|
||||||
|
getImage(identifier: number): ITexture | null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据图块 id 获取图块,可以获取额外素材,会自动将未缓存的额外素材缓存
|
||||||
|
* @param alias 图块 id
|
||||||
|
*/
|
||||||
|
getTileByAlias(alias: string): ITexture | null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据额外素材名称获取额外素材
|
||||||
|
* @param alias 额外素材名称
|
||||||
|
*/
|
||||||
|
getTilesetByAlias(alias: string): ITexture | null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据图片名称获取图片
|
||||||
|
* @param alias 图片名称
|
||||||
|
*/
|
||||||
|
getImageByAlias(alias: string): ITexture | null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 把常用素材打包成为图集形式供后续使用
|
||||||
|
*/
|
||||||
|
buildAssets(): Iterable<IMaterialAssetData>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据标识符获取图集信息
|
||||||
|
* @param identifier 图集的标识符
|
||||||
|
*/
|
||||||
|
getAsset(identifier: number): ITextureComposedData | null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据别名获取图集信息
|
||||||
|
* @param alias 图集的别名
|
||||||
|
*/
|
||||||
|
getAssetByAlias(alias: string): ITextureComposedData | null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据图块标识符在图集中获取对应的可渲染对象
|
||||||
|
* @param identifier 图块标识符,即图块数字
|
||||||
|
*/
|
||||||
|
getRenderable(identifier: number): ITextureRenderable | null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据图块别名在图集中获取对应的可渲染对象
|
||||||
|
* @param alias 图块的别名,即图块的 id
|
||||||
|
*/
|
||||||
|
getRenderableByAlias(alias: string): ITextureRenderable | null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据图块标识符获取图块类型
|
||||||
|
* @param identifier 图块标识符,即图块数字
|
||||||
|
*/
|
||||||
|
getBlockCls(identifier: number): BlockCls;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据图块别名获取图块类型
|
||||||
|
* @param alias 图块别名,即图块的 id
|
||||||
|
*/
|
||||||
|
getBlockClsByAlias(alias: string): BlockCls;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据图块别名获取图块标识符,即图块数字
|
||||||
|
* @param alias 图块别名,即图块的 id
|
||||||
|
*/
|
||||||
|
getIdentifierByAlias(alias: string): number | undefined;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据图块标识符获取图块别名,即图块的 id
|
||||||
|
* @param identifier 图块标识符,即图块数字
|
||||||
|
*/
|
||||||
|
getAliasByIdentifier(identifier: number): string | undefined;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置一个图块的 `bigImage` 贴图,即大怪物贴图,但不止怪物能用
|
||||||
|
* @param identifier 图块标识符,即图块数字
|
||||||
|
* @param image `bigImage` 对应的贴图对象
|
||||||
|
*/
|
||||||
|
setBigImage(identifier: number, image: ITexture): IBigImageData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断一个图块是否包含 `bigImage` 贴图,即是否是大怪物
|
||||||
|
* @param identifier 图块标识符,即图块数字
|
||||||
|
*/
|
||||||
|
isBigImage(identifier: number): boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据图块标识符获取一个图块的 `bigImage` 贴图
|
||||||
|
* @param identifier 图块标识符,即图块数字
|
||||||
|
*/
|
||||||
|
getBigImage(identifier: number): ITexture | null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据图块别名获取一个图块的 `bigImage` 贴图
|
||||||
|
* @param alias 图块别名,即图块的 id
|
||||||
|
*/
|
||||||
|
getBigImageByAlias(alias: string): ITexture | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IAssetBuilder {
|
||||||
|
/**
|
||||||
|
* 将图集打包器输出至指定贴图存储对象,只能输出到一个存储对象中,设置多个仅最后一个有效
|
||||||
|
* @param store 贴图存储对象
|
||||||
|
*/
|
||||||
|
pipe(store: ITextureStore): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加贴图对象至打包器
|
||||||
|
* @param texture 贴图对象
|
||||||
|
* @returns 当前打包的贴图对象对应的组合数据
|
||||||
|
*/
|
||||||
|
addTexture(texture: ITexture): ITextureComposedData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加一个贴图对象列表至打包器
|
||||||
|
* @param texture 贴图对象列表
|
||||||
|
* @returns 当前打包的贴图列表的组合数据,每一项代表一个图集,只包含使用到的图集,之前已经打包完成的将不会在列表内
|
||||||
|
*/
|
||||||
|
addTextureList(texture: Iterable<ITexture>): Iterable<ITextureComposedData>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 结束此打包器
|
||||||
|
*/
|
||||||
|
close(): void;
|
||||||
|
}
|
||||||
26
packages-user/client-base/src/material/utils.ts
Normal file
26
packages-user/client-base/src/material/utils.ts
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import { BlockCls } from './types';
|
||||||
|
|
||||||
|
export function getClsByString(cls: Cls): BlockCls {
|
||||||
|
switch (cls) {
|
||||||
|
case 'terrains':
|
||||||
|
return BlockCls.Terrains;
|
||||||
|
case 'animates':
|
||||||
|
return BlockCls.Animates;
|
||||||
|
case 'autotile':
|
||||||
|
return BlockCls.Autotile;
|
||||||
|
case 'enemys':
|
||||||
|
return BlockCls.Enemys;
|
||||||
|
case 'items':
|
||||||
|
return BlockCls.Items;
|
||||||
|
case 'npcs':
|
||||||
|
return BlockCls.Npcs;
|
||||||
|
case 'npc48':
|
||||||
|
return BlockCls.Npc48;
|
||||||
|
case 'enemy48':
|
||||||
|
return BlockCls.Enemy48;
|
||||||
|
case 'tileset':
|
||||||
|
return BlockCls.Tileset;
|
||||||
|
default:
|
||||||
|
return BlockCls.Unknown;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -5,6 +5,7 @@
|
|||||||
"@motajs/client-base": "workspace:*",
|
"@motajs/client-base": "workspace:*",
|
||||||
"@motajs/common": "workspace:*",
|
"@motajs/common": "workspace:*",
|
||||||
"@motajs/render": "workspace:*",
|
"@motajs/render": "workspace:*",
|
||||||
|
"@motajs/render-assets": "workspace:*",
|
||||||
"@motajs/render-core": "workspace:*",
|
"@motajs/render-core": "workspace:*",
|
||||||
"@motajs/render-elements": "workspace:*",
|
"@motajs/render-elements": "workspace:*",
|
||||||
"@motajs/render-style": "workspace:*",
|
"@motajs/render-style": "workspace:*",
|
||||||
@ -17,7 +18,8 @@
|
|||||||
"@motajs/legacy-data": "workspace:*",
|
"@motajs/legacy-data": "workspace:*",
|
||||||
"@motajs/legacy-ui": "workspace:*",
|
"@motajs/legacy-ui": "workspace:*",
|
||||||
"@motajs/legacy-system": "workspace:*",
|
"@motajs/legacy-system": "workspace:*",
|
||||||
|
"@user/client-base": "workspace:*",
|
||||||
"@user/client-modules": "workspace:*",
|
"@user/client-modules": "workspace:*",
|
||||||
"@user/legacy-plugin-client": "workspace:*"
|
"@user/legacy-plugin-client": "workspace:*"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,6 +5,7 @@ import * as LegacyClient from '@motajs/legacy-client';
|
|||||||
import * as LegacySystem from '@motajs/legacy-system';
|
import * as LegacySystem from '@motajs/legacy-system';
|
||||||
import * as LegacyUI from '@motajs/legacy-ui';
|
import * as LegacyUI from '@motajs/legacy-ui';
|
||||||
import * as Render from '@motajs/render';
|
import * as Render from '@motajs/render';
|
||||||
|
import * as RenderAssets from '@motajs/render-assets';
|
||||||
import * as RenderCore from '@motajs/render-core';
|
import * as RenderCore from '@motajs/render-core';
|
||||||
import * as RenderElements from '@motajs/render-elements';
|
import * as RenderElements from '@motajs/render-elements';
|
||||||
import * as RenderStyle from '@motajs/render-style';
|
import * as RenderStyle from '@motajs/render-style';
|
||||||
@ -12,6 +13,7 @@ import * as RenderVue from '@motajs/render-vue';
|
|||||||
import * as System from '@motajs/system';
|
import * as System from '@motajs/system';
|
||||||
import * as SystemAction from '@motajs/system-action';
|
import * as SystemAction from '@motajs/system-action';
|
||||||
import * as SystemUI from '@motajs/system-ui';
|
import * as SystemUI from '@motajs/system-ui';
|
||||||
|
import * as UserClientBase from '@user/client-base';
|
||||||
import * as ClientModules from '@user/client-modules';
|
import * as ClientModules from '@user/client-modules';
|
||||||
import * as LegacyPluginClient from '@user/legacy-plugin-client';
|
import * as LegacyPluginClient from '@user/legacy-plugin-client';
|
||||||
import * as MutateAnimate from 'mutate-animate';
|
import * as MutateAnimate from 'mutate-animate';
|
||||||
@ -28,6 +30,7 @@ export function create() {
|
|||||||
Mota.register('@motajs/legacy-system', LegacySystem);
|
Mota.register('@motajs/legacy-system', LegacySystem);
|
||||||
Mota.register('@motajs/legacy-ui', LegacyUI);
|
Mota.register('@motajs/legacy-ui', LegacyUI);
|
||||||
Mota.register('@motajs/render', Render);
|
Mota.register('@motajs/render', Render);
|
||||||
|
Mota.register('@motajs/render-assets', RenderAssets);
|
||||||
Mota.register('@motajs/render-core', RenderCore);
|
Mota.register('@motajs/render-core', RenderCore);
|
||||||
Mota.register('@motajs/render-elements', RenderElements);
|
Mota.register('@motajs/render-elements', RenderElements);
|
||||||
Mota.register('@motajs/render-style', RenderStyle);
|
Mota.register('@motajs/render-style', RenderStyle);
|
||||||
@ -35,6 +38,7 @@ export function create() {
|
|||||||
Mota.register('@motajs/system', System);
|
Mota.register('@motajs/system', System);
|
||||||
Mota.register('@motajs/system-action', SystemAction);
|
Mota.register('@motajs/system-action', SystemAction);
|
||||||
Mota.register('@motajs/system-ui', SystemUI);
|
Mota.register('@motajs/system-ui', SystemUI);
|
||||||
|
Mota.register('@user/client-base', UserClientBase);
|
||||||
Mota.register('@user/client-modules', ClientModules);
|
Mota.register('@user/client-modules', ClientModules);
|
||||||
Mota.register('@user/legacy-plugin-client', LegacyPluginClient);
|
Mota.register('@user/legacy-plugin-client', LegacyPluginClient);
|
||||||
Mota.register('MutateAnimate', MutateAnimate);
|
Mota.register('MutateAnimate', MutateAnimate);
|
||||||
@ -47,6 +51,7 @@ export function create() {
|
|||||||
async function createModule() {
|
async function createModule() {
|
||||||
LegacyUI.create();
|
LegacyUI.create();
|
||||||
ClientModules.create();
|
ClientModules.create();
|
||||||
|
UserClientBase.create();
|
||||||
|
|
||||||
await import('ant-design-vue/dist/antd.dark.css');
|
await import('ant-design-vue/dist/antd.dark.css');
|
||||||
main.renderLoaded = true;
|
main.renderLoaded = true;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user