diff --git a/packages-user/data-state/src/core/core.ts b/packages-user/data-state/src/core/core.ts new file mode 100644 index 0000000..9d3be4b --- /dev/null +++ b/packages-user/data-state/src/core/core.ts @@ -0,0 +1,10 @@ +import { LayerState } from './layerState'; +import { ICoreState, ILayerState } from './types'; + +export class CoreState implements ICoreState { + readonly layer: ILayerState; + + constructor() { + this.layer = new LayerState(); + } +} diff --git a/packages-user/data-state/src/core/index.ts b/packages-user/data-state/src/core/index.ts new file mode 100644 index 0000000..9f242c1 --- /dev/null +++ b/packages-user/data-state/src/core/index.ts @@ -0,0 +1,22 @@ +import { CoreState } from './core'; + +export function createCoreState() { + const width = core._WIDTH_; + const height = core._HEIGHT_; + const bg = state.layer.addLayer(width, height); + const bg2 = state.layer.addLayer(width, height); + const event = state.layer.addLayer(width, height); + const fg = state.layer.addLayer(width, height); + const fg2 = state.layer.addLayer(width, height); + state.layer.setLayerAlias(bg, 'bg'); + state.layer.setLayerAlias(bg2, 'bg2'); + state.layer.setLayerAlias(event, 'event'); + state.layer.setLayerAlias(fg, 'fg'); + state.layer.setLayerAlias(fg2, 'fg2'); +} + +export const state = new CoreState(); + +export * from './core'; +export * from './layerState'; +export * from './types'; diff --git a/packages-user/data-state/src/core/layerState.ts b/packages-user/data-state/src/core/layerState.ts new file mode 100644 index 0000000..b42f83a --- /dev/null +++ b/packages-user/data-state/src/core/layerState.ts @@ -0,0 +1,60 @@ +import { logger } from '@motajs/common'; +import { IMapLayer, MapLayer } from '../map'; +import { ILayerState } from './types'; + +export class LayerState implements ILayerState { + readonly layerList: WeakSet = new WeakSet(); + /** 图层到图层别名映射 */ + readonly layerAliasMap: WeakMap = new WeakMap(); + /** 图层别名到图层的映射 */ + readonly aliasLayerMap: WeakMap = new WeakMap(); + + addLayer(width: number, height: number): IMapLayer { + const array = new Uint32Array(width * height); + const layer = new MapLayer(array, width, height); + this.layerList.add(layer); + return layer; + } + + removeLayer(layer: IMapLayer): void { + this.layerList.delete(layer); + const alias = this.layerAliasMap.get(layer); + if (alias) { + const symbol = Symbol.for(alias); + this.aliasLayerMap.delete(symbol); + this.layerAliasMap.delete(layer); + } + } + + setLayerAlias(layer: IMapLayer, alias: string): void { + const symbol = Symbol.for(alias); + if (this.aliasLayerMap.has(symbol)) { + logger.warn(84, alias); + return; + } + this.layerAliasMap.set(layer, alias); + this.aliasLayerMap.set(symbol, layer); + } + + getLayerByAlias(alias: string): IMapLayer | null { + const symbol = Symbol.for(alias); + return this.aliasLayerMap.get(symbol) ?? null; + } + + getLayerAlias(layer: IMapLayer): string | undefined { + return this.layerAliasMap.get(layer); + } + + resizeLayer( + layer: IMapLayer, + width: number, + height: number, + keepBlock?: boolean + ): void { + if (keepBlock) { + layer.resize(width, height); + } else { + layer.resize2(width, height); + } + } +} diff --git a/packages-user/data-state/src/core/types.ts b/packages-user/data-state/src/core/types.ts new file mode 100644 index 0000000..cb75458 --- /dev/null +++ b/packages-user/data-state/src/core/types.ts @@ -0,0 +1,57 @@ +import { IMapLayer } from '../map'; + +export interface ILayerState { + /** 地图列表 */ + readonly layerList: WeakSet; + + /** + * 添加图层 + * @param width 地图宽度 + * @param height 地图高度 + */ + addLayer(width: number, height: number): IMapLayer; + + /** + * 移除指定图层 + * @param layer 图层对象 + */ + removeLayer(layer: IMapLayer): void; + + /** + * 设置图层别名 + * @param layer 图层对象 + * @param alias 图层别名 + */ + setLayerAlias(layer: IMapLayer, alias: string): void; + + /** + * 根据图层别名获取图层对象 + * @param alias 图层别名 + */ + getLayerByAlias(alias: string): IMapLayer | null; + + /** + * 获取图层对象的别名 + * @param layer 图层对象 + */ + getLayerAlias(layer: IMapLayer): string | undefined; + + /** + * 重新设置图层的大小 + * @param layer 图层对象 + * @param width 新的图层宽度 + * @param height 新的图层高度 + * @param keepBlock 是否保留原有图块,默认不保留 + */ + resizeLayer( + layer: IMapLayer, + width: number, + height: number, + keepBlock?: boolean + ): void; +} + +export interface ICoreState { + /** 地图状态 */ + readonly layer: ILayerState; +} diff --git a/packages-user/data-state/src/index.ts b/packages-user/data-state/src/index.ts index 6573816..052a811 100644 --- a/packages-user/data-state/src/index.ts +++ b/packages-user/data-state/src/index.ts @@ -1,9 +1,16 @@ +import { loading } from '@user/data-base'; import { createMechanism } from './mechanism'; +import { createCoreState } from './core'; export function create() { createMechanism(); + loading.once('loaded', () => { + // 加载后初始化全局状态 + createCoreState(); + }); } +export * from './core'; export * from './enemy'; export * from './map'; export * from './mechanism'; diff --git a/packages-user/data-state/src/map/types.ts b/packages-user/data-state/src/map/types.ts index 0714a86..0b3eff9 100644 --- a/packages-user/data-state/src/map/types.ts +++ b/packages-user/data-state/src/map/types.ts @@ -96,7 +96,7 @@ export interface IMapLayer { readonly empty: boolean; /** - * 调整地图尺寸,如果尺寸变大,那么会补零,如果尺寸变小,那么会将当前数组裁剪 + * 调整地图尺寸,维持原有图块。如果尺寸变大,那么会补零,如果尺寸变小,那么会将当前数组裁剪 * @param width 地图宽度 * @param height 地图高度 */ diff --git a/packages/common/src/logger.json b/packages/common/src/logger.json index c64762e..99bef30 100644 --- a/packages/common/src/logger.json +++ b/packages/common/src/logger.json @@ -131,6 +131,7 @@ "81": "Map data to get is partially (or totally) out of range. Overflowed area will be filled with zero.", "82": "Big image offset size is larger than 64. Considier reduce big image offset bucket.", "83": "It seems that you call 'updateBlock' too frequently. This will extremely affect game's performance, so considering integrate them into one 'updateArea' or 'updateBlockList' call.", + "84": "Cannot set alias '$1' for layer, since '$1' is already an alias for another layer.", "1001": "Item-detail extension needs 'floor-binder' and 'floor-damage' extension as dependency.", "1101": "Cannot add new effect to point effect instance, for there's no more reserve space for it. Please increase the max count of the instance." }