mirror of
https://github.com/unanmed/HumanBreak.git
synced 2025-11-27 13:42:58 +08:00
61 lines
1.9 KiB
TypeScript
61 lines
1.9 KiB
TypeScript
import { IHeroState, IMapLayer } from '@user/data-state';
|
|
import {
|
|
IMapDoorRenderer,
|
|
IMapExtensionManager,
|
|
IMapHeroRenderer
|
|
} from './types';
|
|
import { IMapRenderer } from '../types';
|
|
import { MapHeroRenderer } from './hero';
|
|
import { logger } from '@motajs/common';
|
|
import { MapDoorRenderer } from './door';
|
|
|
|
export class MapExtensionManager implements IMapExtensionManager {
|
|
/** 勇士状态至勇士渲染器的映射 */
|
|
readonly heroMap: Map<IHeroState, IMapHeroRenderer> = new Map();
|
|
/** 地图图层到门渲染器的映射 */
|
|
readonly doorMap: Map<IMapLayer, IMapDoorRenderer> = new Map();
|
|
|
|
constructor(readonly renderer: IMapRenderer) {}
|
|
|
|
addHero(state: IHeroState, layer: IMapLayer): IMapHeroRenderer | null {
|
|
if (this.heroMap.has(state)) {
|
|
logger.error(45, 'hero renderer');
|
|
return null;
|
|
}
|
|
const heroRenderer = new MapHeroRenderer(this.renderer, layer, state);
|
|
this.heroMap.set(state, heroRenderer);
|
|
return heroRenderer;
|
|
}
|
|
|
|
removeHero(state: IHeroState): void {
|
|
const renderer = this.heroMap.get(state);
|
|
if (!renderer) return;
|
|
renderer.destroy();
|
|
this.heroMap.delete(state);
|
|
}
|
|
|
|
addDoor(layer: IMapLayer): IMapDoorRenderer | null {
|
|
if (this.doorMap.has(layer)) {
|
|
logger.error(45, 'door renderer');
|
|
return null;
|
|
}
|
|
const doorRenderer = new MapDoorRenderer(this.renderer, layer);
|
|
this.doorMap.set(layer, doorRenderer);
|
|
return doorRenderer;
|
|
}
|
|
|
|
removeDoor(layer: IMapLayer): void {
|
|
const renderer = this.doorMap.get(layer);
|
|
if (!renderer) return;
|
|
renderer.destroy();
|
|
this.doorMap.delete(layer);
|
|
}
|
|
|
|
destroy(): void {
|
|
this.heroMap.forEach(v => void v.destroy());
|
|
this.doorMap.forEach(v => void v.destroy());
|
|
this.heroMap.clear();
|
|
this.doorMap.clear();
|
|
}
|
|
}
|