mirror of
https://github.com/motajs/template.git
synced 2026-11-13 06:24:30 +08:00
refactor: 移动顶层实施对象
This commit is contained in:
1 parent
327bdc840b
commit
3d72954bb2
7 files changed
+157
-186
No files matched your search
@@ -66,8 +66,7 @@ import { ILoadProgressTotal, LoadProgressTotal } from '@motajs/loader';
|
||||
import { isNil } from 'lodash-es';
|
||||
import { logger } from '@motajs/common';
|
||||
import { ISaveSystem, SaveSystem } from './save';
|
||||
import { DefaultPassChecker } from './hero';
|
||||
import { DefaultHitAction } from './hero/hitAction';
|
||||
import { DefaultHeroMoveTopImpl } from './hero';
|
||||
|
||||
export class CoreState implements ICoreState {
|
||||
// Layer 0 公共层,最底层的接口,不会依赖任何其他内容,一般是工具性接口及不需要存档的数据
|
||||
@@ -211,14 +210,11 @@ export class CoreState implements ICoreState {
|
||||
});
|
||||
|
||||
// 勇士顶层初始化
|
||||
const passChecker = new DefaultPassChecker(this.maps);
|
||||
const hitAction = new DefaultHitAction(
|
||||
this.maps,
|
||||
this.triggerCollector,
|
||||
this
|
||||
const heroMoveTopImpl = new DefaultHeroMoveTopImpl(
|
||||
this,
|
||||
this.triggerCollector
|
||||
);
|
||||
this.hero.location.mover.useTerrainChecker(passChecker);
|
||||
this.hero.location.mover.useHitAction(hitAction);
|
||||
this.hero.location.mover.useTopImplementation(heroMoveTopImpl);
|
||||
|
||||
//#endregion
|
||||
}
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
import {
|
||||
IHeroHitAction,
|
||||
IHeroHitHandler,
|
||||
IMapStore,
|
||||
IStateBase
|
||||
} from '@user/data-base';
|
||||
import { ITriggerCollector, ITriggerHandler } from '@user/data-system';
|
||||
import { isNil } from 'lodash-es';
|
||||
|
||||
export class DefaultHitAction implements IHeroHitAction {
|
||||
constructor(
|
||||
readonly maps: IMapStore,
|
||||
readonly collector: ITriggerCollector,
|
||||
readonly state: IStateBase
|
||||
) {}
|
||||
|
||||
async hit(handler: IHeroHitHandler): Promise<void> {
|
||||
if (isNil(handler.floorId)) return;
|
||||
|
||||
const map = this.maps.getLayerState(handler.floorId);
|
||||
if (!map) return;
|
||||
const event = map.eventLayer;
|
||||
if (!event) return;
|
||||
|
||||
const { x, y } = handler.nextLoc;
|
||||
const triggers = this.collector.collect(x, y, event);
|
||||
|
||||
const triggerHandler: ITriggerHandler = {
|
||||
state: this.state,
|
||||
layer: map,
|
||||
mapLayer: event,
|
||||
locator: handler.nextLoc
|
||||
};
|
||||
|
||||
return triggers.trigger(triggerHandler);
|
||||
}
|
||||
}
|
||||
@@ -1,2 +1,2 @@
|
||||
export * from './passChecker';
|
||||
export * from './moverImpl';
|
||||
export * from './types';
|
||||
+46
-7
@@ -1,13 +1,25 @@
|
||||
import { FaceDirection, PassBit } from '@user/data-common';
|
||||
import {
|
||||
IHeroMoveTopHandler,
|
||||
IHeroMoveTopImpl,
|
||||
IMapStore,
|
||||
IPassCheckerHandler,
|
||||
ITerrainPassChecker
|
||||
IStateBase
|
||||
} from '@user/data-base';
|
||||
import { FaceDirection, PassBit } from '@user/data-common';
|
||||
import { ITriggerCollector, ITriggerHandler } from '@user/data-system';
|
||||
import { isNil } from 'lodash-es';
|
||||
|
||||
export class DefaultPassChecker implements ITerrainPassChecker {
|
||||
constructor(readonly maps: IMapStore) {}
|
||||
export class DefaultHeroMoveTopImpl implements IHeroMoveTopImpl {
|
||||
/** 地图存储对象 */
|
||||
private readonly maps: IMapStore;
|
||||
|
||||
constructor(
|
||||
private readonly state: IStateBase,
|
||||
private readonly collector: ITriggerCollector
|
||||
) {
|
||||
this.maps = state.maps;
|
||||
}
|
||||
|
||||
//#region 通行性判断
|
||||
|
||||
/**
|
||||
* 将朝向转换为对应的通行性位掩码。
|
||||
@@ -36,7 +48,7 @@ export class DefaultPassChecker implements ITerrainPassChecker {
|
||||
return x >= 0 && y >= 0 && x < width && y < height;
|
||||
}
|
||||
|
||||
canPass(handler: IPassCheckerHandler): boolean {
|
||||
canPass(handler: IHeroMoveTopHandler): boolean {
|
||||
const { currLoc, nextLoc, direction, floorId, face } = handler;
|
||||
if (isNil(floorId)) return false;
|
||||
|
||||
@@ -96,7 +108,7 @@ export class DefaultPassChecker implements ITerrainPassChecker {
|
||||
return true;
|
||||
}
|
||||
|
||||
shouldHit(handler: IPassCheckerHandler): boolean {
|
||||
shouldHit(handler: IHeroMoveTopHandler): boolean {
|
||||
const { nextLoc, floorId } = handler;
|
||||
if (isNil(floorId)) return false;
|
||||
const layerState = this.maps.getLayerState(floorId);
|
||||
@@ -110,4 +122,31 @@ export class DefaultPassChecker implements ITerrainPassChecker {
|
||||
if (!next || !next.raw) return false;
|
||||
return !next.raw.eventPass;
|
||||
}
|
||||
|
||||
//#endregion
|
||||
|
||||
//#region 触发器行为
|
||||
|
||||
async hit(handler: IHeroMoveTopHandler): Promise<void> {
|
||||
if (isNil(handler.floorId)) return;
|
||||
|
||||
const map = this.maps.getLayerState(handler.floorId);
|
||||
if (!map) return;
|
||||
const event = map.eventLayer;
|
||||
if (!event) return;
|
||||
|
||||
const { x, y } = handler.nextLoc;
|
||||
const triggers = this.collector.collect(x, y, event);
|
||||
|
||||
const triggerHandler: ITriggerHandler = {
|
||||
state: this.state,
|
||||
layer: map,
|
||||
mapLayer: event,
|
||||
locator: handler.nextLoc
|
||||
};
|
||||
|
||||
return triggers.trigger(triggerHandler);
|
||||
}
|
||||
|
||||
//#endregion
|
||||
}
|
||||
Reference in new issue
Block a user