diff --git a/packages-user/client-modules/package.json b/packages-user/client-modules/package.json index 919a733..56e61c9 100644 --- a/packages-user/client-modules/package.json +++ b/packages-user/client-modules/package.json @@ -1,6 +1,7 @@ { "name": "@user/client-modules", "dependencies": { + "@motajs/animate": "workspace:*", "@motajs/client-base": "workspace:*", "@motajs/common": "workspace:*", "@motajs/render": "workspace:*", diff --git a/packages-user/client-modules/src/render/map/block.ts b/packages-user/client-modules/src/render/map/block.ts index ab8800e..629099e 100644 --- a/packages-user/client-modules/src/render/map/block.ts +++ b/packages-user/client-modules/src/render/map/block.ts @@ -6,6 +6,7 @@ import { IBlockSplitter, IBlockSplitterConfig } from './types'; +import { ISearchable8Dir } from '@motajs/common'; export class BlockSplitter implements IBlockSplitter { blockWidth: number = 0; @@ -288,7 +289,7 @@ export class BlockSplitter implements IBlockSplitter { } } -class SplittedBlockData implements IBlockData { +class SplittedBlockData implements IBlockData, ISearchable8Dir { width: number; height: number; x: number; diff --git a/packages/animate/src/excitation.ts b/packages/animate/src/excitation.ts index e69de29..df70cd0 100644 --- a/packages/animate/src/excitation.ts +++ b/packages/animate/src/excitation.ts @@ -0,0 +1,323 @@ +import { logger } from '@motajs/common'; +import { + IExcitation, + IExcitable, + IExcitableController, + IExcitationVariator, + ExcitationCurve, + VariatorCurveMode +} from './types'; +import { excited } from './utils'; + +/** + * IExcitation 抽象基类,管理受激励对象的注册、激励与移除。 + * 便于拓展不同类型的激励源。 + */ +export abstract class ExcitationBase implements IExcitation { + protected readonly excitables: Set> = new Set(); + protected destroyed: boolean = false; + + /** + * 当前激励负载,由子类实现 + */ + abstract payload(): T; + + /** + * 激励所有受激励对象 + */ + excite(payload: T): void { + this.excitables.forEach(ex => ex.excited(payload)); + } + + /** + * 添加受激励对象 + */ + add(object: IExcitable): IExcitableController | null { + if (this.destroyed) { + logger.error(48, 'add'); + return null; + } + this.excitables.add(object); + const controller: IExcitableController = { + excitable: object, + revoke: () => this.remove(object), + excite: (payload: T) => object.excited(payload) + }; + return controller; + } + + /** + * 移除受激励对象 + */ + remove(object: IExcitable): boolean { + if (this.destroyed) { + logger.error(48, 'remove'); + return false; + } + return this.excitables.delete(object); + } + + /** + * 摧毁激励源,清理所有引用 + */ + destroy(): void { + this.destroyed = true; + this.excitables.clear(); + } +} + +/** + * 基于 requestAnimationFrame 的激励源 + * 每帧激励所有对象,payload 为当前时间戳 + */ +export class RafExcitation extends ExcitationBase { + private rafId: number = -1; + private now: number = 0; + + constructor() { + super(); + this.tick = this.tick.bind(this); + this.rafId = requestAnimationFrame(this.tick); + } + + payload(): number { + return this.now; + } + + /** + * 每帧对所有激励源激励一次 + * @param ts 当前时间戳 + */ + private tick(ts: number) { + this.now = ts; + this.excite(ts); + if (!this.destroyed) { + this.rafId = requestAnimationFrame(this.tick); + } else { + this.rafId = -1; + } + } + + override destroy(): void { + if (this.rafId !== -1) { + cancelAnimationFrame(this.rafId); + this.rafId = -1; + } + super.destroy(); + } +} + +interface CurveQueue { + /** 速率曲线 */ + curve: ExcitationCurve; + /** 变速持续时间 */ + time: number; + /** 变速参考模式 */ + mode: VariatorCurveMode; + /** 兑现 Promise */ + resolve: () => void; +} + +interface CurrentCurve { + /** 当前速率曲线 */ + curve: ExcitationCurve; + /** 变速时长 */ + time: number; + /** 变速参考模式 */ + mode: VariatorCurveMode; + /** 起始时间戳 */ + startTs: number; + /** 兑现 Promise */ + resolve: () => void; +} + +/** + * 激励源变速器 + * 可对 payload 为 number 的激励源进行变速处理 + */ +export class ExcitationVariator + extends ExcitationBase + implements IExcitationVariator +{ + /** 当前绑定的激励源 */ + source: IExcitation | null = null; + /** 当前速度 */ + speed: number = 1; + + /** 在源中添加的被激励对象的控制器 */ + private sourceController: IExcitableController | null = null; + + /** 上一次变速时源的参考时间戳 */ + private sourceTs: number = 0; + /** 上一次变速时自身的参考时间戳 */ + private selfTs: number = 0; + /** 当前自身时间戳 */ + private now: number = 0; + + /** 曲线队列 */ + private curveQueue: CurveQueue[] = []; + /** 当前执行的曲线 */ + private currentCurve: CurrentCurve | null = null; + + payload(): number { + return this.now; + } + + /** + * 处理源的激励,更新自身时间戳并处理曲线逻辑 + */ + excite(payload: number): void { + if (!this.source) return; + + // 计算新的自身时间戳 + const newSelfTs = this.selfTs + (payload - this.sourceTs) * this.speed; + this.now = newSelfTs; + + // 处理曲线执行 + if (this.currentCurve) { + // 根据模式计算完成度所用的时间戳 + const referenceTs = + this.currentCurve.mode === VariatorCurveMode.SourceRelated + ? payload + : newSelfTs; + const elapsed = referenceTs - this.currentCurve.startTs; + + if (elapsed >= this.currentCurve.time) { + // 曲线完成,使用 curve(1) 作为最终速率值 + this.setSpeed(this.currentCurve.curve(1)); + this.currentCurve.resolve(); + + this.currentCurve = null; + + // 执行下一个曲线 + if (this.curveQueue.length > 0) { + this.startNextCurve(); + } + } else { + // 曲线进行中,更新速度 + const progress = elapsed / this.currentCurve.time; + this.setSpeed(this.currentCurve.curve(progress)); + } + } + + // 激励所有受激励对象 + this.excitables.forEach(ex => ex.excited(newSelfTs)); + } + + bindExcitation(excitation: IExcitation): void { + // 如果已绑定不同的源,先解绑 + if (this.source !== null && this.source !== excitation) { + this.unbindExcitation(); + } + + if (this.source === excitation) { + return; + } + + this.source = excitation; + this.sourceTs = excitation.payload(); + this.selfTs = this.sourceTs; + this.speed = 1; + + // 创建内部激励对象,将源的激励转发给自身 + const internalExcitable: IExcitable = excited(payload => { + this.excite(payload); + }); + + this.sourceController = excitation.add(internalExcitable); + } + + unbindExcitation(): void { + if (this.source === null) { + return; + } + + // 取消在源上的绑定 + if (this.sourceController !== null) { + this.sourceController.revoke(); + this.sourceController = null; + } + + // 取消曲线执行 + this.endAllCurves(); + + // 重置状态 + this.source = null; + this.speed = 1; + this.sourceTs = 0; + this.selfTs = 0; + this.now = 0; + } + + setSpeed(speed: number): void { + if (this.source === null) { + logger.error(49, 'set speed'); + return; + } + + // 更新参考时间戳 + this.sourceTs = this.source.payload(); + this.selfTs = this.now; + this.speed = speed; + } + + curveSpeed( + curve: ExcitationCurve, + time: number, + mode: VariatorCurveMode = VariatorCurveMode.SourceRelated + ): Promise { + if (this.source === null) { + logger.error(49, 'curve speed'); + return Promise.resolve(); + } + + return new Promise(resolve => { + this.curveQueue.push({ curve, time, mode, resolve }); + + // 如果没有正在执行的曲线,立即开始 + if (this.currentCurve === null) { + this.startNextCurve(); + } + }); + } + + private startNextCurve(): void { + if (this.curveQueue.length === 0) { + return; + } + + const item = this.curveQueue.shift()!; + + // 记录起始时间戳 + const startTs = + item.mode === VariatorCurveMode.SourceRelated + ? this.source!.payload() + : this.now; + + this.currentCurve = { + ...item, + startTs + }; + } + + endAllCurves(): void { + if (!this.currentCurve) return; + + if (this.curveQueue.length > 0) { + const last = this.curveQueue.at(-1)!; + const speed = last.curve(1); + this.setSpeed(speed); + this.curveQueue = []; + this.currentCurve = null; + } else { + const speed = this.currentCurve.curve(1); + this.setSpeed(speed); + this.currentCurve = null; + } + } + + override destroy(): void { + this.unbindExcitation(); + super.destroy(); + } +} diff --git a/packages/animate/src/index.ts b/packages/animate/src/index.ts index fcb073f..4d66c9b 100644 --- a/packages/animate/src/index.ts +++ b/packages/animate/src/index.ts @@ -1 +1,3 @@ +export * from './excitation'; export * from './types'; +export * from './utils'; diff --git a/packages/animate/src/types.ts b/packages/animate/src/types.ts index b5ed84c..eb7b416 100644 --- a/packages/animate/src/types.ts +++ b/packages/animate/src/types.ts @@ -1,3 +1,24 @@ +/** + * 动画速率曲线,输入时间完成度,输出一个值,时间完成度范围在 `0-1` 之间,而输出值没有范围限制。 + * 在不同场景下,速率曲线返回值的含义可能不同,有的可能表示动画完成度,有的可能表示绝对的坐标值。 + */ +export type ExcitationCurve = (progress: number) => number; + +/** + * 二维动画速率曲线,输入时间完成度,输出两个值。可由两个一维曲线组合而成(本质是参数方程) + */ +export type ExcitationCurve2D = (progress: number) => [number, number]; + +/** + * 三维动画速率曲线,输入时间完成度,输出三个值。可由三个一维曲线组合而成(本质是参数方程) + */ +export type ExcitationCurve3D = (progress: number) => [number, number, number]; + +/** + * `n` 维动画速率曲线,输入时间完成度,输出三个值。可由 `n` 个一维曲线组合而成(本质是参数方程) + */ +export type GeneralExcitationCurve = (progress: number) => number[]; + export interface IExcitable { /** * 受到激励源激励 @@ -39,7 +60,7 @@ export interface IExcitation { * @param object 受激励对象 * @returns 受激励对象控制器 */ - add(object: IExcitable): IExcitableController; + add(object: IExcitable): IExcitableController | null; /** * 移除一个受激励对象 @@ -53,3 +74,56 @@ export interface IExcitation { */ destroy(): void; } + +export const enum VariatorCurveMode { + /** + * 时间相对于激励源,不受变速器当前速度影响 + */ + SourceRelated, + + /** + * 时间相对于变速器本身,当变速器本身的速度变慢时,速率曲线的运行速度也变慢 + */ + SelfRelated +} + +export interface IExcitationVariator extends IExcitation { + /** 变速器当前的速度值 */ + readonly speed: number; + /** 当前绑定的激励源 */ + readonly source: IExcitation | null; + + /** + * 绑定激励源对象,变速器将以此激励源为基础实施变速 + * @param excitation 绑定的激励源 + */ + bindExcitation(excitation: IExcitation): void; + + /** + * 取消绑定当前的激励源 + */ + unbindExcitation(): void; + + /** + * 修改激励速度 + * @param speed 激励速度,值表示当前速度与原速度的比值,1 为原速 + */ + setSpeed(speed: number): void; + + /** + * 使用速率曲线来修改激励速度,当有速率曲线在执行时,调用此函数将会加入队列,当上一个曲线结束后立刻执行 + * @param curve 速率曲线 + * @param time 速率曲线实施时间 + * @param mode 速率曲线实施模式 + */ + curveSpeed( + curve: ExcitationCurve, + time: number, + mode?: VariatorCurveMode + ): Promise; + + /** + * 终止当前所有速率曲线的执行,最终速度为队列中最后一个曲线的终止速度 + */ + endAllCurves(): void; +} diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts index 605e235..5763297 100644 --- a/packages/common/src/index.ts +++ b/packages/common/src/index.ts @@ -1,5 +1,6 @@ +export * from './utils'; + export * from './dirtyTracker'; export * from './hook'; export * from './logger'; -export * from './utils'; export * from './types'; diff --git a/packages/common/src/logger.json b/packages/common/src/logger.json index ce256ca..dc76f8e 100644 --- a/packages/common/src/logger.json +++ b/packages/common/src/logger.json @@ -47,6 +47,8 @@ "45": "Cannot add $1 map renderer extension, since $1 already exists for the given state.", "46": "Cannot execute close door action on $1,$2, since the given position is not empty.", "47": "Cannot require text area outside the target map.", + "48": "Cannot $1 excitables on destroyed excitation.", + "49": "Cannot $1 on variator without excitation binding.", "1201": "Floor-damage extension needs 'floor-binder' extension as dependency." }, "warn": { diff --git a/packages/common/src/utils.ts b/packages/common/src/utils/func.ts similarity index 100% rename from packages/common/src/utils.ts rename to packages/common/src/utils/func.ts diff --git a/packages/common/src/utils/index.ts b/packages/common/src/utils/index.ts new file mode 100644 index 0000000..11d7c3a --- /dev/null +++ b/packages/common/src/utils/index.ts @@ -0,0 +1,2 @@ +export * from './func'; +export * from './types'; diff --git a/packages/common/src/utils/types.ts b/packages/common/src/utils/types.ts new file mode 100644 index 0000000..fbff08c --- /dev/null +++ b/packages/common/src/utils/types.ts @@ -0,0 +1,29 @@ +export interface ISearchable4Dir { + /** 获取上侧元素 */ + up(): ISearchable4Dir | null; + /** 获取下侧元素 */ + down(): ISearchable4Dir | null; + /** 获取左侧元素 */ + left(): ISearchable4Dir | null; + /** 获取右侧元素 */ + right(): ISearchable4Dir | null; +} + +export interface ISearchable8Dir { + /** 获取上侧元素 */ + up(): ISearchable8Dir | null; + /** 获取下侧元素 */ + down(): ISearchable8Dir | null; + /** 获取左侧元素 */ + left(): ISearchable8Dir | null; + /** 获取右侧元素 */ + right(): ISearchable8Dir | null; + /** 获取左上元素 */ + leftUp(): ISearchable8Dir | null; + /** 获取右上元素 */ + rightUp(): ISearchable8Dir | null; + /** 获取左下元素 */ + leftDown(): ISearchable8Dir | null; + /** 获取右下元素 */ + rightDown(): ISearchable8Dir | null; +} diff --git a/packages/render/package.json b/packages/render/package.json index fd0971b..20db508 100644 --- a/packages/render/package.json +++ b/packages/render/package.json @@ -1,41 +1,3 @@ { - "name": "@motajs/render", - "version": "0.1.0", - "main": "dist/render.cjs.js", - "module": "dist/render.es.js", - "types": "dist/render.es.d.ts", - "keywords": [ - "render", - "game", - "vue", - "graphics" - ], - "repository": { - "type": "git", - "url": "https://github.com/motajs/motajs-engine" - }, - "author": { - "name": "AncTe", - "email": "1319491857@qq.com" - }, - "exports": { - ".": { - "import": "./dist/render.es.js", - "require": "./dist/render.cjs.js", - "types": "./dist/render.es.d.ts" - } - }, - "files": [ - "dist" - ], - "dependencies": { - "eventemitter3": "^5.0.1", - "gl-matrix": "^3.4.3", - "lodash-es": "^4.17.21", - "mutate-animate": "^1.4.2" - }, - "peerDependencies": { - "vue": "^3.5.13" - }, - "license": "LGPL-3.0-only" + "name": "@motajs/render" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7b01620..f3605ce 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -228,6 +228,9 @@ importers: packages-user/client-modules: dependencies: + '@motajs/animate': + specifier: workspace:* + version: link:../../packages/animate '@motajs/client-base': specifier: workspace:* version: link:../../packages/client-base @@ -453,23 +456,7 @@ importers: specifier: workspace:* version: link:../system - packages/render: - dependencies: - eventemitter3: - specifier: ^5.0.1 - version: 5.0.1 - gl-matrix: - specifier: ^3.4.3 - version: 3.4.4 - lodash-es: - specifier: ^4.17.21 - version: 4.17.21 - mutate-animate: - specifier: ^1.4.2 - version: 1.4.2 - vue: - specifier: ^3.5.13 - version: 3.5.20(typescript@5.9.3) + packages/render: {} packages/render-vue: dependencies: @@ -2461,27 +2448,15 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@vue/compiler-core@3.5.20': - resolution: {integrity: sha512-8TWXUyiqFd3GmP4JTX9hbiTFRwYHgVL/vr3cqhr4YQ258+9FADwvj7golk2sWNGHR67QgmCZ8gz80nQcMokhwg==} - '@vue/compiler-core@3.5.29': resolution: {integrity: sha512-cuzPhD8fwRHk8IGfmYaR4eEe4cAyJEL66Ove/WZL7yWNL134nqLddSLwNRIsFlnnW1kK+p8Ck3viFnC0chXCXw==} - '@vue/compiler-dom@3.5.20': - resolution: {integrity: sha512-whB44M59XKjqUEYOMPYU0ijUV0G+4fdrHVKDe32abNdX/kJe1NUEMqsi4cwzXa9kyM9w5S8WqFsrfo1ogtBZGQ==} - '@vue/compiler-dom@3.5.29': resolution: {integrity: sha512-n0G5o7R3uBVmVxjTIYcz7ovr8sy7QObFG8OQJ3xGCDNhbG60biP/P5KnyY8NLd81OuT1WJflG7N4KWYHaeeaIg==} - '@vue/compiler-sfc@3.5.20': - resolution: {integrity: sha512-SFcxapQc0/feWiSBfkGsa1v4DOrnMAQSYuvDMpEaxbpH5dKbnEM5KobSNSgU+1MbHCl+9ftm7oQWxvwDB6iBfw==} - '@vue/compiler-sfc@3.5.29': resolution: {integrity: sha512-oJZhN5XJs35Gzr50E82jg2cYdZQ78wEwvRO6Y63TvLVTc+6xICzJHP1UIecdSPPYIbkautNBanDiWYa64QSFIA==} - '@vue/compiler-ssr@3.5.20': - resolution: {integrity: sha512-RSl5XAMc5YFUXpDQi+UQDdVjH9FnEpLDHIALg5J0ITHxkEzJ8uQLlo7CIbjPYqmZtt6w0TsIPbo1izYXwDG7JA==} - '@vue/compiler-ssr@3.5.29': resolution: {integrity: sha512-Y/ARJZE6fpjzL5GH/phJmsFwx3g6t2KmHKHx5q+MLl2kencADKIrhH5MLF6HHpRMmlRAYBRSvv347Mepf1zVNw==} @@ -2513,37 +2488,20 @@ packages: typescript: optional: true - '@vue/reactivity@3.5.20': - resolution: {integrity: sha512-hS8l8x4cl1fmZpSQX/NXlqWKARqEsNmfkwOIYqtR2F616NGfsLUm0G6FQBK6uDKUCVyi1YOL8Xmt/RkZcd/jYQ==} - '@vue/reactivity@3.5.29': resolution: {integrity: sha512-zcrANcrRdcLtmGZETBxWqIkoQei8HaFpZWx/GHKxx79JZsiZ8j1du0VUJtu4eJjgFvU/iKL5lRXFXksVmI+5DA==} - '@vue/runtime-core@3.5.20': - resolution: {integrity: sha512-vyQRiH5uSZlOa+4I/t4Qw/SsD/gbth0SW2J7oMeVlMFMAmsG1rwDD6ok0VMmjXY3eI0iHNSSOBilEDW98PLRKw==} - '@vue/runtime-core@3.5.29': resolution: {integrity: sha512-8DpW2QfdwIWOLqtsNcds4s+QgwSaHSJY/SUe04LptianUQ/0xi6KVsu/pYVh+HO3NTVvVJjIPL2t6GdeKbS4Lg==} - '@vue/runtime-dom@3.5.20': - resolution: {integrity: sha512-KBHzPld/Djw3im0CQ7tGCpgRedryIn4CcAl047EhFTCCPT2xFf4e8j6WeKLgEEoqPSl9TYqShc3Q6tpWpz/Xgw==} - '@vue/runtime-dom@3.5.29': resolution: {integrity: sha512-AHvvJEtcY9tw/uk+s/YRLSlxxQnqnAkjqvK25ZiM4CllCZWzElRAoQnCM42m9AHRLNJ6oe2kC5DCgD4AUdlvXg==} - '@vue/server-renderer@3.5.20': - resolution: {integrity: sha512-HthAS0lZJDH21HFJBVNTtx+ULcIbJQRpjSVomVjfyPkFSpCwvsPTA+jIzOaUm3Hrqx36ozBHePztQFg6pj5aKg==} - peerDependencies: - vue: 3.5.20 - '@vue/server-renderer@3.5.29': resolution: {integrity: sha512-G/1k6WK5MusLlbxSE2YTcqAAezS+VuwHhOvLx2KnQU7G2zCH6KIb+5Wyt6UjMq7a3qPzNEjJXs1hvAxDclQH+g==} peerDependencies: vue: 3.5.29 - '@vue/shared@3.5.20': - resolution: {integrity: sha512-SoRGP596KU/ig6TfgkCMbXkr4YJ91n/QSdMuqeP5r3hVIYA3CPHUBCc7Skak0EAKV+5lL4KyIh61VA/pK1CIAA==} - '@vue/shared@3.5.29': resolution: {integrity: sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg==} @@ -3213,9 +3171,6 @@ packages: engines: {node: '>=4'} hasBin: true - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} @@ -3567,10 +3522,6 @@ packages: entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - entities@7.0.1: resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} engines: {node: '>=0.12'} @@ -3754,9 +3705,6 @@ packages: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} @@ -4476,9 +4424,6 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - lodash-es@4.17.23: resolution: {integrity: sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==} @@ -6074,14 +6019,6 @@ packages: peerDependencies: vue: ^3.0.0 - vue@3.5.20: - resolution: {integrity: sha512-2sBz0x/wis5TkF1XZ2vH25zWq3G1bFEPOfkBcx2ikowmphoQsPH6X0V3mmPCXA2K1N/XGTnifVyDQP4GfDDeQw==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - vue@3.5.29: resolution: {integrity: sha512-BZqN4Ze6mDQVNAni0IHeMJ5mwr8VAJ3MQC9FmprRhcBYENw+wOAAjRj8jfmN6FLl0j96OXbR+CjWhmAmM+QGnA==} peerDependencies: @@ -8330,14 +8267,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@vue/compiler-core@3.5.20': - dependencies: - '@babel/parser': 7.29.0 - '@vue/shared': 3.5.20 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.2.1 - '@vue/compiler-core@3.5.29': dependencies: '@babel/parser': 7.29.0 @@ -8346,28 +8275,11 @@ snapshots: estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.20': - dependencies: - '@vue/compiler-core': 3.5.20 - '@vue/shared': 3.5.20 - '@vue/compiler-dom@3.5.29': dependencies: '@vue/compiler-core': 3.5.29 '@vue/shared': 3.5.29 - '@vue/compiler-sfc@3.5.20': - dependencies: - '@babel/parser': 7.29.0 - '@vue/compiler-core': 3.5.20 - '@vue/compiler-dom': 3.5.20 - '@vue/compiler-ssr': 3.5.20 - '@vue/shared': 3.5.20 - estree-walker: 2.0.2 - magic-string: 0.30.21 - postcss: 8.5.8 - source-map-js: 1.2.1 - '@vue/compiler-sfc@3.5.29': dependencies: '@babel/parser': 7.29.0 @@ -8380,11 +8292,6 @@ snapshots: postcss: 8.5.8 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.20': - dependencies: - '@vue/compiler-dom': 3.5.20 - '@vue/shared': 3.5.20 - '@vue/compiler-ssr@3.5.29': dependencies: '@vue/compiler-dom': 3.5.29 @@ -8439,31 +8346,15 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@vue/reactivity@3.5.20': - dependencies: - '@vue/shared': 3.5.20 - '@vue/reactivity@3.5.29': dependencies: '@vue/shared': 3.5.29 - '@vue/runtime-core@3.5.20': - dependencies: - '@vue/reactivity': 3.5.20 - '@vue/shared': 3.5.20 - '@vue/runtime-core@3.5.29': dependencies: '@vue/reactivity': 3.5.29 '@vue/shared': 3.5.29 - '@vue/runtime-dom@3.5.20': - dependencies: - '@vue/reactivity': 3.5.20 - '@vue/runtime-core': 3.5.20 - '@vue/shared': 3.5.20 - csstype: 3.1.3 - '@vue/runtime-dom@3.5.29': dependencies: '@vue/reactivity': 3.5.29 @@ -8471,20 +8362,12 @@ snapshots: '@vue/shared': 3.5.29 csstype: 3.2.3 - '@vue/server-renderer@3.5.20(vue@3.5.20(typescript@5.9.3))': - dependencies: - '@vue/compiler-ssr': 3.5.20 - '@vue/shared': 3.5.20 - vue: 3.5.20(typescript@5.9.3) - '@vue/server-renderer@3.5.29(vue@3.5.29(typescript@5.9.3))': dependencies: '@vue/compiler-ssr': 3.5.29 '@vue/shared': 3.5.29 vue: 3.5.29(typescript@5.9.3) - '@vue/shared@3.5.20': {} - '@vue/shared@3.5.29': {} '@vueuse/core@12.8.2(typescript@5.9.3)': @@ -9213,8 +9096,6 @@ snapshots: cssesc@3.0.0: {} - csstype@3.1.3: {} - csstype@3.2.3: {} cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.1): @@ -9602,8 +9483,6 @@ snapshots: entities@2.2.0: {} - entities@4.5.0: {} - entities@7.0.1: {} env-paths@2.2.1: {} @@ -9925,8 +9804,6 @@ snapshots: event-target-shim@5.0.1: {} - eventemitter3@5.0.1: {} - eventemitter3@5.0.4: {} events-universal@1.0.1: @@ -10722,8 +10599,6 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash-es@4.17.21: {} - lodash-es@4.17.23: {} lodash.debounce@4.0.8: {} @@ -12611,16 +12486,6 @@ snapshots: is-plain-object: 3.0.1 vue: 3.5.29(typescript@5.9.3) - vue@3.5.20(typescript@5.9.3): - dependencies: - '@vue/compiler-dom': 3.5.20 - '@vue/compiler-sfc': 3.5.20 - '@vue/runtime-dom': 3.5.20 - '@vue/server-renderer': 3.5.20(vue@3.5.20(typescript@5.9.3)) - '@vue/shared': 3.5.20 - optionalDependencies: - typescript: 5.9.3 - vue@3.5.29(typescript@5.9.3): dependencies: '@vue/compiler-dom': 3.5.29 diff --git a/src/data.ts b/src/data.ts index db2c753..eaf97b8 100644 --- a/src/data.ts +++ b/src/data.ts @@ -1,3 +1,5 @@ import { createData } from '@user/entry-data'; +// 逻辑端入口,仅在录像验证时运行 + createData(); diff --git a/src/main.ts b/src/main.ts index 856a345..aef8d47 100644 --- a/src/main.ts +++ b/src/main.ts @@ -3,6 +3,8 @@ import './styles.less'; import { createGame } from '@user/entry-client'; import App from './App.vue'; +// 客户端入口,在玩家游玩时运行 + // 创建游戏实例 createGame(); createApp(App).mount('#root');