feat: 动画系统激励源 & refactor: 部分接口变动

This commit is contained in:
unanmed 2026-03-09 13:52:47 +08:00
parent 5d6f40a469
commit feb6abb5bb
14 changed files with 447 additions and 181 deletions

View File

@ -1,6 +1,7 @@
{ {
"name": "@user/client-modules", "name": "@user/client-modules",
"dependencies": { "dependencies": {
"@motajs/animate": "workspace:*",
"@motajs/client-base": "workspace:*", "@motajs/client-base": "workspace:*",
"@motajs/common": "workspace:*", "@motajs/common": "workspace:*",
"@motajs/render": "workspace:*", "@motajs/render": "workspace:*",

View File

@ -6,6 +6,7 @@ import {
IBlockSplitter, IBlockSplitter,
IBlockSplitterConfig IBlockSplitterConfig
} from './types'; } from './types';
import { ISearchable8Dir } from '@motajs/common';
export class BlockSplitter<T> implements IBlockSplitter<T> { export class BlockSplitter<T> implements IBlockSplitter<T> {
blockWidth: number = 0; blockWidth: number = 0;
@ -288,7 +289,7 @@ export class BlockSplitter<T> implements IBlockSplitter<T> {
} }
} }
class SplittedBlockData<T> implements IBlockData<T> { class SplittedBlockData<T> implements IBlockData<T>, ISearchable8Dir {
width: number; width: number;
height: number; height: number;
x: number; x: number;

View File

@ -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<T> implements IExcitation<T> {
protected readonly excitables: Set<IExcitable<T>> = new Set();
protected destroyed: boolean = false;
/**
*
*/
abstract payload(): T;
/**
*
*/
excite(payload: T): void {
this.excitables.forEach(ex => ex.excited(payload));
}
/**
*
*/
add(object: IExcitable<T>): IExcitableController<T> | null {
if (this.destroyed) {
logger.error(48, 'add');
return null;
}
this.excitables.add(object);
const controller: IExcitableController<T> = {
excitable: object,
revoke: () => this.remove(object),
excite: (payload: T) => object.excited(payload)
};
return controller;
}
/**
*
*/
remove(object: IExcitable<T>): 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<number> {
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<number>
implements IExcitationVariator
{
/** 当前绑定的激励源 */
source: IExcitation<number> | null = null;
/** 当前速度 */
speed: number = 1;
/** 在源中添加的被激励对象的控制器 */
private sourceController: IExcitableController<number> | 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<number>): 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<number> = 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<void> {
if (this.source === null) {
logger.error(49, 'curve speed');
return Promise.resolve();
}
return new Promise<void>(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();
}
}

View File

@ -1 +1,3 @@
export * from './excitation';
export * from './types'; export * from './types';
export * from './utils';

View File

@ -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<T> { export interface IExcitable<T> {
/** /**
* *
@ -39,7 +60,7 @@ export interface IExcitation<T> {
* @param object * @param object
* @returns * @returns
*/ */
add(object: IExcitable<T>): IExcitableController<T>; add(object: IExcitable<T>): IExcitableController<T> | null;
/** /**
* *
@ -53,3 +74,56 @@ export interface IExcitation<T> {
*/ */
destroy(): void; destroy(): void;
} }
export const enum VariatorCurveMode {
/**
*
*/
SourceRelated,
/**
* 线
*/
SelfRelated
}
export interface IExcitationVariator extends IExcitation<number> {
/** 变速器当前的速度值 */
readonly speed: number;
/** 当前绑定的激励源 */
readonly source: IExcitation<number> | null;
/**
*
* @param excitation
*/
bindExcitation(excitation: IExcitation<number>): void;
/**
*
*/
unbindExcitation(): void;
/**
*
* @param speed 1
*/
setSpeed(speed: number): void;
/**
* 使线线线
* @param curve 线
* @param time 线
* @param mode 线
*/
curveSpeed(
curve: ExcitationCurve,
time: number,
mode?: VariatorCurveMode
): Promise<void>;
/**
* 线线
*/
endAllCurves(): void;
}

View File

@ -1,5 +1,6 @@
export * from './utils';
export * from './dirtyTracker'; export * from './dirtyTracker';
export * from './hook'; export * from './hook';
export * from './logger'; export * from './logger';
export * from './utils';
export * from './types'; export * from './types';

View File

@ -47,6 +47,8 @@
"45": "Cannot add $1 map renderer extension, since $1 already exists for the given state.", "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.", "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.", "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." "1201": "Floor-damage extension needs 'floor-binder' extension as dependency."
}, },
"warn": { "warn": {

View File

@ -0,0 +1,2 @@
export * from './func';
export * from './types';

View File

@ -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;
}

View File

@ -1,41 +1,3 @@
{ {
"name": "@motajs/render", "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"
} }

View File

@ -228,6 +228,9 @@ importers:
packages-user/client-modules: packages-user/client-modules:
dependencies: dependencies:
'@motajs/animate':
specifier: workspace:*
version: link:../../packages/animate
'@motajs/client-base': '@motajs/client-base':
specifier: workspace:* specifier: workspace:*
version: link:../../packages/client-base version: link:../../packages/client-base
@ -453,23 +456,7 @@ importers:
specifier: workspace:* specifier: workspace:*
version: link:../system version: link:../system
packages/render: 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-vue: packages/render-vue:
dependencies: dependencies:
@ -2461,27 +2448,15 @@ packages:
peerDependencies: peerDependencies:
'@babel/core': ^7.0.0-0 '@babel/core': ^7.0.0-0
'@vue/compiler-core@3.5.20':
resolution: {integrity: sha512-8TWXUyiqFd3GmP4JTX9hbiTFRwYHgVL/vr3cqhr4YQ258+9FADwvj7golk2sWNGHR67QgmCZ8gz80nQcMokhwg==}
'@vue/compiler-core@3.5.29': '@vue/compiler-core@3.5.29':
resolution: {integrity: sha512-cuzPhD8fwRHk8IGfmYaR4eEe4cAyJEL66Ove/WZL7yWNL134nqLddSLwNRIsFlnnW1kK+p8Ck3viFnC0chXCXw==} resolution: {integrity: sha512-cuzPhD8fwRHk8IGfmYaR4eEe4cAyJEL66Ove/WZL7yWNL134nqLddSLwNRIsFlnnW1kK+p8Ck3viFnC0chXCXw==}
'@vue/compiler-dom@3.5.20':
resolution: {integrity: sha512-whB44M59XKjqUEYOMPYU0ijUV0G+4fdrHVKDe32abNdX/kJe1NUEMqsi4cwzXa9kyM9w5S8WqFsrfo1ogtBZGQ==}
'@vue/compiler-dom@3.5.29': '@vue/compiler-dom@3.5.29':
resolution: {integrity: sha512-n0G5o7R3uBVmVxjTIYcz7ovr8sy7QObFG8OQJ3xGCDNhbG60biP/P5KnyY8NLd81OuT1WJflG7N4KWYHaeeaIg==} resolution: {integrity: sha512-n0G5o7R3uBVmVxjTIYcz7ovr8sy7QObFG8OQJ3xGCDNhbG60biP/P5KnyY8NLd81OuT1WJflG7N4KWYHaeeaIg==}
'@vue/compiler-sfc@3.5.20':
resolution: {integrity: sha512-SFcxapQc0/feWiSBfkGsa1v4DOrnMAQSYuvDMpEaxbpH5dKbnEM5KobSNSgU+1MbHCl+9ftm7oQWxvwDB6iBfw==}
'@vue/compiler-sfc@3.5.29': '@vue/compiler-sfc@3.5.29':
resolution: {integrity: sha512-oJZhN5XJs35Gzr50E82jg2cYdZQ78wEwvRO6Y63TvLVTc+6xICzJHP1UIecdSPPYIbkautNBanDiWYa64QSFIA==} resolution: {integrity: sha512-oJZhN5XJs35Gzr50E82jg2cYdZQ78wEwvRO6Y63TvLVTc+6xICzJHP1UIecdSPPYIbkautNBanDiWYa64QSFIA==}
'@vue/compiler-ssr@3.5.20':
resolution: {integrity: sha512-RSl5XAMc5YFUXpDQi+UQDdVjH9FnEpLDHIALg5J0ITHxkEzJ8uQLlo7CIbjPYqmZtt6w0TsIPbo1izYXwDG7JA==}
'@vue/compiler-ssr@3.5.29': '@vue/compiler-ssr@3.5.29':
resolution: {integrity: sha512-Y/ARJZE6fpjzL5GH/phJmsFwx3g6t2KmHKHx5q+MLl2kencADKIrhH5MLF6HHpRMmlRAYBRSvv347Mepf1zVNw==} resolution: {integrity: sha512-Y/ARJZE6fpjzL5GH/phJmsFwx3g6t2KmHKHx5q+MLl2kencADKIrhH5MLF6HHpRMmlRAYBRSvv347Mepf1zVNw==}
@ -2513,37 +2488,20 @@ packages:
typescript: typescript:
optional: true optional: true
'@vue/reactivity@3.5.20':
resolution: {integrity: sha512-hS8l8x4cl1fmZpSQX/NXlqWKARqEsNmfkwOIYqtR2F616NGfsLUm0G6FQBK6uDKUCVyi1YOL8Xmt/RkZcd/jYQ==}
'@vue/reactivity@3.5.29': '@vue/reactivity@3.5.29':
resolution: {integrity: sha512-zcrANcrRdcLtmGZETBxWqIkoQei8HaFpZWx/GHKxx79JZsiZ8j1du0VUJtu4eJjgFvU/iKL5lRXFXksVmI+5DA==} 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': '@vue/runtime-core@3.5.29':
resolution: {integrity: sha512-8DpW2QfdwIWOLqtsNcds4s+QgwSaHSJY/SUe04LptianUQ/0xi6KVsu/pYVh+HO3NTVvVJjIPL2t6GdeKbS4Lg==} 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': '@vue/runtime-dom@3.5.29':
resolution: {integrity: sha512-AHvvJEtcY9tw/uk+s/YRLSlxxQnqnAkjqvK25ZiM4CllCZWzElRAoQnCM42m9AHRLNJ6oe2kC5DCgD4AUdlvXg==} 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': '@vue/server-renderer@3.5.29':
resolution: {integrity: sha512-G/1k6WK5MusLlbxSE2YTcqAAezS+VuwHhOvLx2KnQU7G2zCH6KIb+5Wyt6UjMq7a3qPzNEjJXs1hvAxDclQH+g==} resolution: {integrity: sha512-G/1k6WK5MusLlbxSE2YTcqAAezS+VuwHhOvLx2KnQU7G2zCH6KIb+5Wyt6UjMq7a3qPzNEjJXs1hvAxDclQH+g==}
peerDependencies: peerDependencies:
vue: 3.5.29 vue: 3.5.29
'@vue/shared@3.5.20':
resolution: {integrity: sha512-SoRGP596KU/ig6TfgkCMbXkr4YJ91n/QSdMuqeP5r3hVIYA3CPHUBCc7Skak0EAKV+5lL4KyIh61VA/pK1CIAA==}
'@vue/shared@3.5.29': '@vue/shared@3.5.29':
resolution: {integrity: sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg==} resolution: {integrity: sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg==}
@ -3213,9 +3171,6 @@ packages:
engines: {node: '>=4'} engines: {node: '>=4'}
hasBin: true hasBin: true
csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
csstype@3.2.3: csstype@3.2.3:
resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
@ -3567,10 +3522,6 @@ packages:
entities@2.2.0: entities@2.2.0:
resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
entities@4.5.0:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'}
entities@7.0.1: entities@7.0.1:
resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==}
engines: {node: '>=0.12'} engines: {node: '>=0.12'}
@ -3754,9 +3705,6 @@ packages:
resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
engines: {node: '>=6'} engines: {node: '>=6'}
eventemitter3@5.0.1:
resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
eventemitter3@5.0.4: eventemitter3@5.0.4:
resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==}
@ -4476,9 +4424,6 @@ packages:
resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
engines: {node: '>=10'} engines: {node: '>=10'}
lodash-es@4.17.21:
resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
lodash-es@4.17.23: lodash-es@4.17.23:
resolution: {integrity: sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==} resolution: {integrity: sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==}
@ -6074,14 +6019,6 @@ packages:
peerDependencies: peerDependencies:
vue: ^3.0.0 vue: ^3.0.0
vue@3.5.20:
resolution: {integrity: sha512-2sBz0x/wis5TkF1XZ2vH25zWq3G1bFEPOfkBcx2ikowmphoQsPH6X0V3mmPCXA2K1N/XGTnifVyDQP4GfDDeQw==}
peerDependencies:
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
vue@3.5.29: vue@3.5.29:
resolution: {integrity: sha512-BZqN4Ze6mDQVNAni0IHeMJ5mwr8VAJ3MQC9FmprRhcBYENw+wOAAjRj8jfmN6FLl0j96OXbR+CjWhmAmM+QGnA==} resolution: {integrity: sha512-BZqN4Ze6mDQVNAni0IHeMJ5mwr8VAJ3MQC9FmprRhcBYENw+wOAAjRj8jfmN6FLl0j96OXbR+CjWhmAmM+QGnA==}
peerDependencies: peerDependencies:
@ -8330,14 +8267,6 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - 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': '@vue/compiler-core@3.5.29':
dependencies: dependencies:
'@babel/parser': 7.29.0 '@babel/parser': 7.29.0
@ -8346,28 +8275,11 @@ snapshots:
estree-walker: 2.0.2 estree-walker: 2.0.2
source-map-js: 1.2.1 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': '@vue/compiler-dom@3.5.29':
dependencies: dependencies:
'@vue/compiler-core': 3.5.29 '@vue/compiler-core': 3.5.29
'@vue/shared': 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': '@vue/compiler-sfc@3.5.29':
dependencies: dependencies:
'@babel/parser': 7.29.0 '@babel/parser': 7.29.0
@ -8380,11 +8292,6 @@ snapshots:
postcss: 8.5.8 postcss: 8.5.8
source-map-js: 1.2.1 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': '@vue/compiler-ssr@3.5.29':
dependencies: dependencies:
'@vue/compiler-dom': 3.5.29 '@vue/compiler-dom': 3.5.29
@ -8439,31 +8346,15 @@ snapshots:
optionalDependencies: optionalDependencies:
typescript: 5.9.3 typescript: 5.9.3
'@vue/reactivity@3.5.20':
dependencies:
'@vue/shared': 3.5.20
'@vue/reactivity@3.5.29': '@vue/reactivity@3.5.29':
dependencies: dependencies:
'@vue/shared': 3.5.29 '@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': '@vue/runtime-core@3.5.29':
dependencies: dependencies:
'@vue/reactivity': 3.5.29 '@vue/reactivity': 3.5.29
'@vue/shared': 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': '@vue/runtime-dom@3.5.29':
dependencies: dependencies:
'@vue/reactivity': 3.5.29 '@vue/reactivity': 3.5.29
@ -8471,20 +8362,12 @@ snapshots:
'@vue/shared': 3.5.29 '@vue/shared': 3.5.29
csstype: 3.2.3 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))': '@vue/server-renderer@3.5.29(vue@3.5.29(typescript@5.9.3))':
dependencies: dependencies:
'@vue/compiler-ssr': 3.5.29 '@vue/compiler-ssr': 3.5.29
'@vue/shared': 3.5.29 '@vue/shared': 3.5.29
vue: 3.5.29(typescript@5.9.3) vue: 3.5.29(typescript@5.9.3)
'@vue/shared@3.5.20': {}
'@vue/shared@3.5.29': {} '@vue/shared@3.5.29': {}
'@vueuse/core@12.8.2(typescript@5.9.3)': '@vueuse/core@12.8.2(typescript@5.9.3)':
@ -9213,8 +9096,6 @@ snapshots:
cssesc@3.0.0: {} cssesc@3.0.0: {}
csstype@3.1.3: {}
csstype@3.2.3: {} csstype@3.2.3: {}
cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.1): cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.1):
@ -9602,8 +9483,6 @@ snapshots:
entities@2.2.0: {} entities@2.2.0: {}
entities@4.5.0: {}
entities@7.0.1: {} entities@7.0.1: {}
env-paths@2.2.1: {} env-paths@2.2.1: {}
@ -9925,8 +9804,6 @@ snapshots:
event-target-shim@5.0.1: {} event-target-shim@5.0.1: {}
eventemitter3@5.0.1: {}
eventemitter3@5.0.4: {} eventemitter3@5.0.4: {}
events-universal@1.0.1: events-universal@1.0.1:
@ -10722,8 +10599,6 @@ snapshots:
dependencies: dependencies:
p-locate: 5.0.0 p-locate: 5.0.0
lodash-es@4.17.21: {}
lodash-es@4.17.23: {} lodash-es@4.17.23: {}
lodash.debounce@4.0.8: {} lodash.debounce@4.0.8: {}
@ -12611,16 +12486,6 @@ snapshots:
is-plain-object: 3.0.1 is-plain-object: 3.0.1
vue: 3.5.29(typescript@5.9.3) 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): vue@3.5.29(typescript@5.9.3):
dependencies: dependencies:
'@vue/compiler-dom': 3.5.29 '@vue/compiler-dom': 3.5.29

View File

@ -1,3 +1,5 @@
import { createData } from '@user/entry-data'; import { createData } from '@user/entry-data';
// 逻辑端入口,仅在录像验证时运行
createData(); createData();

View File

@ -3,6 +3,8 @@ import './styles.less';
import { createGame } from '@user/entry-client'; import { createGame } from '@user/entry-client';
import App from './App.vue'; import App from './App.vue';
// 客户端入口,在玩家游玩时运行
// 创建游戏实例 // 创建游戏实例
createGame(); createGame();
createApp(App).mount('#root'); createApp(App).mount('#root');