mirror of
https://github.com/motajs/template.git
synced 2026-11-11 13:34:31 +08:00
feat(event): complete phase one event system
This commit is contained in:
1 parent
b9213ddf22
commit
a297311ea6
51 files changed
+3261
-1114
No files matched your search
@@ -0,0 +1,48 @@
|
||||
import { logger } from '@motajs/common';
|
||||
import { ILayerEventView } from './types';
|
||||
|
||||
export class LayerEventView implements ILayerEventView {
|
||||
/** 当前绑定的事件 */
|
||||
private readonly store: Map<number, string> = new Map();
|
||||
/** 用于判断事件是否变化的参考基准 */
|
||||
private reference: Map<number, string> | null = null;
|
||||
|
||||
get(): ReadonlyMap<number, string> {
|
||||
return this.store;
|
||||
}
|
||||
|
||||
set(priority: number, event: string): void {
|
||||
if (this.store.has(priority)) {
|
||||
logger.warn(136, priority.toString());
|
||||
}
|
||||
this.store.set(priority, event);
|
||||
}
|
||||
|
||||
delete(priority: number): void {
|
||||
this.store.delete(priority);
|
||||
}
|
||||
|
||||
clear(): void {
|
||||
this.store.clear();
|
||||
}
|
||||
|
||||
markPure(): void {
|
||||
this.reference = new Map(this.store);
|
||||
}
|
||||
|
||||
dirty(): boolean {
|
||||
const reference = this.reference;
|
||||
if (!reference) {
|
||||
return this.store.size > 0;
|
||||
}
|
||||
if (this.store.size !== reference.size) {
|
||||
return true;
|
||||
}
|
||||
for (const [priority, event] of this.store) {
|
||||
if (reference.get(priority) !== event) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -16,6 +16,7 @@ import {
|
||||
} from './types';
|
||||
import {
|
||||
IDataCommon,
|
||||
ILocationIndexer,
|
||||
ITileStore,
|
||||
MapLocIndexer,
|
||||
SaveCompression
|
||||
@@ -36,7 +37,7 @@ export class GameMap extends Hookable<IGameMapHooks> implements IGameMap {
|
||||
private layerHookMap: Map<IMapLayer, IMapLayerHookController> = new Map();
|
||||
|
||||
/** 坐标索引器 */
|
||||
readonly indexer = new MapLocIndexer();
|
||||
readonly indexer: ILocationIndexer = new MapLocIndexer();
|
||||
|
||||
active: boolean = false;
|
||||
eventLayer: IMapLayer | null = null;
|
||||
|
||||
@@ -3,11 +3,16 @@ import {
|
||||
FaceDirection,
|
||||
IDataCommon,
|
||||
IDataCommonExtended,
|
||||
IMapBlockRawData,
|
||||
ISaveableContent,
|
||||
ITileRawData
|
||||
} from '@user/data-common';
|
||||
import { IMapBlockSaveBase, IMapLayer, ITileBase } from './types';
|
||||
import { LayerEventView } from './eventView';
|
||||
import {
|
||||
ILayerEventView,
|
||||
IMapBlockSaveBase,
|
||||
IMapLayer,
|
||||
ITileBase
|
||||
} from './types';
|
||||
|
||||
export abstract class MapTileBase<TSave extends IMapBlockSaveBase>
|
||||
implements ITileBase, IDataCommonExtended, ISaveableContent<Readonly<TSave>>
|
||||
@@ -15,12 +20,15 @@ export abstract class MapTileBase<TSave extends IMapBlockSaveBase>
|
||||
readonly state: IDataCommon;
|
||||
readonly layer: IMapLayer;
|
||||
locator: ITileLocator;
|
||||
triggers: Set<number> | null = null;
|
||||
/** 该图块实例绑定的图块事件 */
|
||||
private readonly tileEvents: ILayerEventView;
|
||||
|
||||
constructor(x: number, y: number, layer: IMapLayer) {
|
||||
this.layer = layer;
|
||||
this.state = layer.state;
|
||||
this.locator = { x, y };
|
||||
this.tileEvents = new LayerEventView();
|
||||
this.tileEvents.markPure();
|
||||
}
|
||||
|
||||
abstract num(): number;
|
||||
@@ -29,10 +37,6 @@ export abstract class MapTileBase<TSave extends IMapBlockSaveBase>
|
||||
|
||||
abstract set(num: number): void;
|
||||
|
||||
block(): IMapBlockRawData | null {
|
||||
return null;
|
||||
}
|
||||
|
||||
setFaceDirection(direction: FaceDirection): number {
|
||||
const cur = this.num();
|
||||
const next = this.layer.faceBinder.getFaceOf(cur, direction);
|
||||
@@ -44,24 +48,12 @@ export abstract class MapTileBase<TSave extends IMapBlockSaveBase>
|
||||
}
|
||||
}
|
||||
|
||||
clearTrigger(): void {
|
||||
this.triggers = null;
|
||||
tileEvent(): ILayerEventView {
|
||||
return this.tileEvents;
|
||||
}
|
||||
|
||||
addTrigger(trigger: number): void {
|
||||
if (!this.triggers) {
|
||||
this.triggers = new Set();
|
||||
}
|
||||
this.triggers.add(trigger);
|
||||
}
|
||||
|
||||
deleteTrigger(trigger: number): void {
|
||||
if (!this.triggers) return;
|
||||
this.triggers.delete(trigger);
|
||||
}
|
||||
|
||||
useEmptyTrigger(): void {
|
||||
this.triggers = new Set();
|
||||
pointEvent(): ILayerEventView | null {
|
||||
return this.layer.event(this.locator.x, this.locator.y);
|
||||
}
|
||||
|
||||
abstract saveState(): Readonly<TSave>;
|
||||
|
||||
Reference in new issue
Block a user