mirror of
https://github.com/motajs/template.git
synced 2026-04-12 15:11:10 +08:00
refactor: 加载系统核心移动至数据端
This commit is contained in:
parent
4fc6db3e79
commit
fe67939a05
@ -3,6 +3,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@motajs/audio": "workspace:*",
|
"@motajs/audio": "workspace:*",
|
||||||
"@motajs/render": "workspace:*",
|
"@motajs/render": "workspace:*",
|
||||||
"@motajs/client-base": "workspace:*"
|
"@motajs/client-base": "workspace:*",
|
||||||
|
"@user/data-base": "workspace:*"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,7 +8,7 @@ import {
|
|||||||
} from '@motajs/audio';
|
} from '@motajs/audio';
|
||||||
import { MotaAssetsLoader } from './load/loader';
|
import { MotaAssetsLoader } from './load/loader';
|
||||||
import { AutotileProcessor, MaterialManager } from './material';
|
import { AutotileProcessor, MaterialManager } from './material';
|
||||||
import { loadProgress } from '@user/data-base';
|
import { dataLoader, loadProgress } from '@user/data-base';
|
||||||
|
|
||||||
//#region 音频实例
|
//#region 音频实例
|
||||||
|
|
||||||
@ -35,9 +35,10 @@ export const autotile = new AutotileProcessor(materials);
|
|||||||
|
|
||||||
//#region 加载实例
|
//#region 加载实例
|
||||||
|
|
||||||
/** 全局加载实例 */
|
/** 客户端加载实例 */
|
||||||
export const loader = new MotaAssetsLoader(
|
export const loader = new MotaAssetsLoader(
|
||||||
loadProgress,
|
loadProgress,
|
||||||
|
dataLoader,
|
||||||
audioContext,
|
audioContext,
|
||||||
soundPlayer,
|
soundPlayer,
|
||||||
materials
|
materials
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
export * from './processor';
|
export * from './loader';
|
||||||
|
|||||||
@ -17,26 +17,15 @@ import {
|
|||||||
LoadAudioProcessor,
|
LoadAudioProcessor,
|
||||||
LoadFontProcessor,
|
LoadFontProcessor,
|
||||||
LoadImageProcessor,
|
LoadImageProcessor,
|
||||||
LoadJSONProcessor,
|
|
||||||
LoadTextProcessor,
|
LoadTextProcessor,
|
||||||
LoadZipProcessor
|
LoadZipProcessor
|
||||||
} from './processor';
|
} from '@user/data-base';
|
||||||
import { IMotaAudioContext, ISoundPlayer } from '@motajs/audio';
|
import { IMotaAudioContext, ISoundPlayer } from '@motajs/audio';
|
||||||
import { loading } from '@user/data-base';
|
import { loading } from '@user/data-base';
|
||||||
import { IMaterialManager } from '../material';
|
import { IMaterialManager } from '../material';
|
||||||
import { ITextureSplitter, Texture, TextureRowSplitter } from '@motajs/render';
|
import { ITextureSplitter, Texture, TextureRowSplitter } from '@motajs/render';
|
||||||
import { iconNames } from './data';
|
import { iconNames } from './data';
|
||||||
|
import { IMotaDataLoader } from '@user/data-base';
|
||||||
interface LoadTaskStore<T extends LoadDataType = LoadDataType, R = any> {
|
|
||||||
/** 加载任务对象 */
|
|
||||||
readonly task: ILoadTask<T, R>;
|
|
||||||
/** 当 `onLoaded` 兑现后兑现的 `Promise` */
|
|
||||||
readonly loadPromise: Promise<R>;
|
|
||||||
/** 兑现 `loadPromise` */
|
|
||||||
readonly loadResolve: (data: R) => void;
|
|
||||||
/** 当加载任务完成时执行的函数 */
|
|
||||||
readonly onLoaded: CustomLoadFunc<R>;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class MotaAssetsLoader implements IMotaAssetsLoader {
|
export class MotaAssetsLoader implements IMotaAssetsLoader {
|
||||||
/** 当前是否正在进行加载 */
|
/** 当前是否正在进行加载 */
|
||||||
@ -54,12 +43,8 @@ export class MotaAssetsLoader implements IMotaAssetsLoader {
|
|||||||
FontFace
|
FontFace
|
||||||
>;
|
>;
|
||||||
readonly textProcessor: ILoadTaskProcessor<LoadDataType.Text, string>;
|
readonly textProcessor: ILoadTaskProcessor<LoadDataType.Text, string>;
|
||||||
readonly jsonProcessor: ILoadTaskProcessor<LoadDataType.JSON, any>;
|
|
||||||
readonly zipProcessor: ILoadTaskProcessor<LoadDataType.ArrayBuffer, JSZip>;
|
readonly zipProcessor: ILoadTaskProcessor<LoadDataType.ArrayBuffer, JSZip>;
|
||||||
|
|
||||||
/** 当前已添加的加载任务 */
|
|
||||||
private readonly tasks: Set<LoadTaskStore> = new Set();
|
|
||||||
|
|
||||||
/** 素材索引 */
|
/** 素材索引 */
|
||||||
private materialsCounter: number = 0;
|
private materialsCounter: number = 0;
|
||||||
/** 贴图行分割器,用于处理遗留 `icons.png` */
|
/** 贴图行分割器,用于处理遗留 `icons.png` */
|
||||||
@ -67,6 +52,7 @@ export class MotaAssetsLoader implements IMotaAssetsLoader {
|
|||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
readonly progress: ILoadProgressTotal,
|
readonly progress: ILoadProgressTotal,
|
||||||
|
private readonly dataLoader: IMotaDataLoader,
|
||||||
private readonly ac: IMotaAudioContext,
|
private readonly ac: IMotaAudioContext,
|
||||||
private readonly sounds: ISoundPlayer<SoundIds>,
|
private readonly sounds: ISoundPlayer<SoundIds>,
|
||||||
private readonly materials: IMaterialManager
|
private readonly materials: IMaterialManager
|
||||||
@ -75,7 +61,6 @@ export class MotaAssetsLoader implements IMotaAssetsLoader {
|
|||||||
this.audioProcessor = new LoadAudioProcessor(ac);
|
this.audioProcessor = new LoadAudioProcessor(ac);
|
||||||
this.fontProcessor = new LoadFontProcessor();
|
this.fontProcessor = new LoadFontProcessor();
|
||||||
this.textProcessor = new LoadTextProcessor();
|
this.textProcessor = new LoadTextProcessor();
|
||||||
this.jsonProcessor = new LoadJSONProcessor();
|
|
||||||
this.zipProcessor = new LoadZipProcessor();
|
this.zipProcessor = new LoadZipProcessor();
|
||||||
this.rowSplitter = new TextureRowSplitter();
|
this.rowSplitter = new TextureRowSplitter();
|
||||||
}
|
}
|
||||||
@ -469,7 +454,7 @@ export class MotaAssetsLoader implements IMotaAssetsLoader {
|
|||||||
url: `loadList.json`,
|
url: `loadList.json`,
|
||||||
dataType: LoadDataType.JSON,
|
dataType: LoadDataType.JSON,
|
||||||
identifier: '@system-loadList',
|
identifier: '@system-loadList',
|
||||||
processor: this.jsonProcessor,
|
processor: this.dataLoader.jsonProcessor,
|
||||||
progress: { onProgress() {} }
|
progress: { onProgress() {} }
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -505,27 +490,15 @@ export class MotaAssetsLoader implements IMotaAssetsLoader {
|
|||||||
task: ILoadTask<LoadDataType, R>,
|
task: ILoadTask<LoadDataType, R>,
|
||||||
onLoaded: CustomLoadFunc<R>
|
onLoaded: CustomLoadFunc<R>
|
||||||
): Promise<R> {
|
): Promise<R> {
|
||||||
this.progress.addTask(task);
|
return this.dataLoader.addCustomLoadTask(task, onLoaded);
|
||||||
const { promise, resolve } = Promise.withResolvers<R>();
|
|
||||||
const store: LoadTaskStore<LoadDataType, R> = {
|
|
||||||
task,
|
|
||||||
onLoaded,
|
|
||||||
loadPromise: promise,
|
|
||||||
loadResolve: resolve
|
|
||||||
};
|
|
||||||
this.tasks.add(store);
|
|
||||||
return promise;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
load(): Promise<any[]> {
|
async load(): Promise<void> {
|
||||||
const tasks = [...this.tasks].map(async task => {
|
this.loading = true;
|
||||||
task.task.start();
|
this.loaded = false;
|
||||||
const data = await task.task.loaded();
|
await this.dataLoader.load();
|
||||||
await task.onLoaded(data);
|
this.loading = false;
|
||||||
task.loadResolve(data);
|
this.loaded = true;
|
||||||
return data;
|
|
||||||
});
|
|
||||||
return Promise.all(tasks);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|||||||
@ -57,8 +57,6 @@ export interface IMotaAssetsLoader {
|
|||||||
>;
|
>;
|
||||||
/** 文字处理器 */
|
/** 文字处理器 */
|
||||||
readonly textProcessor: ILoadTaskProcessor<LoadDataType.Text, string>;
|
readonly textProcessor: ILoadTaskProcessor<LoadDataType.Text, string>;
|
||||||
/** JSON 处理器 */
|
|
||||||
readonly jsonProcessor: ILoadTaskProcessor<LoadDataType.JSON, any>;
|
|
||||||
/** `zip` 压缩包处理器 */
|
/** `zip` 压缩包处理器 */
|
||||||
readonly zipProcessor: ILoadTaskProcessor<LoadDataType.ArrayBuffer, JSZip>;
|
readonly zipProcessor: ILoadTaskProcessor<LoadDataType.ArrayBuffer, JSZip>;
|
||||||
|
|
||||||
@ -82,5 +80,5 @@ export interface IMotaAssetsLoader {
|
|||||||
* 开始所有加载任务的加载工作
|
* 开始所有加载任务的加载工作
|
||||||
* @returns 一个 `Promise`,当所有加载任务加载完成后兑现
|
* @returns 一个 `Promise`,当所有加载任务加载完成后兑现
|
||||||
*/
|
*/
|
||||||
load(): Promise<any[]>;
|
load(): Promise<void>;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@user/data-base",
|
"name": "@user/data-base",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@motajs/types": "workspace:*"
|
"@motajs/types": "workspace:*",
|
||||||
|
"@motajs/loader": "workspace:*"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1 +1,4 @@
|
|||||||
|
export * from './load';
|
||||||
|
|
||||||
export * from './game';
|
export * from './game';
|
||||||
|
export * from './ins';
|
||||||
|
|||||||
11
packages-user/data-base/src/ins.ts
Normal file
11
packages-user/data-base/src/ins.ts
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import { LoadProgressTotal } from '@motajs/loader';
|
||||||
|
import { MotaDataLoader } from './load';
|
||||||
|
|
||||||
|
//#region 加载实例
|
||||||
|
|
||||||
|
/** 加载进度 */
|
||||||
|
export const loadProgress = new LoadProgressTotal();
|
||||||
|
/** 数据端加载对象 */
|
||||||
|
export const dataLoader = new MotaDataLoader(loadProgress);
|
||||||
|
|
||||||
|
//#endregion
|
||||||
3
packages-user/data-base/src/load/index.ts
Normal file
3
packages-user/data-base/src/load/index.ts
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
export * from './loader';
|
||||||
|
export * from './processor';
|
||||||
|
export * from './types';
|
||||||
63
packages-user/data-base/src/load/loader.ts
Normal file
63
packages-user/data-base/src/load/loader.ts
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
import {
|
||||||
|
ILoadProgressTotal,
|
||||||
|
LoadDataType,
|
||||||
|
ILoadTask,
|
||||||
|
ILoadTaskProcessor
|
||||||
|
} from '@motajs/loader';
|
||||||
|
import { CustomLoadFunc, IMotaDataLoader } from './types';
|
||||||
|
import { LoadJSONProcessor } from './processor';
|
||||||
|
|
||||||
|
interface LoadTaskStore<T extends LoadDataType = LoadDataType, R = any> {
|
||||||
|
/** 加载任务对象 */
|
||||||
|
readonly task: ILoadTask<T, R>;
|
||||||
|
/** 当 `onLoaded` 兑现后兑现的 `Promise` */
|
||||||
|
readonly loadPromise: Promise<R>;
|
||||||
|
/** 兑现 `loadPromise` */
|
||||||
|
readonly loadResolve: (data: R) => void;
|
||||||
|
/** 当加载任务完成时执行的函数 */
|
||||||
|
readonly onLoaded: CustomLoadFunc<R>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class MotaDataLoader implements IMotaDataLoader {
|
||||||
|
/** 当前已添加的加载任务 */
|
||||||
|
private readonly tasks: Set<LoadTaskStore> = new Set();
|
||||||
|
|
||||||
|
readonly jsonProcessor: ILoadTaskProcessor<LoadDataType.JSON, any>;
|
||||||
|
|
||||||
|
constructor(readonly progress: ILoadProgressTotal) {
|
||||||
|
this.jsonProcessor = new LoadJSONProcessor();
|
||||||
|
}
|
||||||
|
|
||||||
|
//#region 对外接口
|
||||||
|
|
||||||
|
initSystemLoadTask(): void {}
|
||||||
|
|
||||||
|
addCustomLoadTask<R>(
|
||||||
|
task: ILoadTask<LoadDataType, R>,
|
||||||
|
onLoaded: CustomLoadFunc<R>
|
||||||
|
): Promise<R> {
|
||||||
|
this.progress.addTask(task);
|
||||||
|
const { promise, resolve } = Promise.withResolvers<R>();
|
||||||
|
const store: LoadTaskStore<LoadDataType, R> = {
|
||||||
|
task,
|
||||||
|
onLoaded,
|
||||||
|
loadPromise: promise,
|
||||||
|
loadResolve: resolve
|
||||||
|
};
|
||||||
|
this.tasks.add(store);
|
||||||
|
return promise;
|
||||||
|
}
|
||||||
|
|
||||||
|
async load(): Promise<void> {
|
||||||
|
const tasks = [...this.tasks].map(async task => {
|
||||||
|
task.task.start();
|
||||||
|
const data = await task.task.loaded();
|
||||||
|
await task.onLoaded(data);
|
||||||
|
task.loadResolve(data);
|
||||||
|
return data;
|
||||||
|
});
|
||||||
|
await Promise.all(tasks);
|
||||||
|
}
|
||||||
|
|
||||||
|
//#endregion
|
||||||
|
}
|
||||||
38
packages-user/data-base/src/load/types.ts
Normal file
38
packages-user/data-base/src/load/types.ts
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
import {
|
||||||
|
ILoadProgressTotal,
|
||||||
|
ILoadTask,
|
||||||
|
ILoadTaskProcessor,
|
||||||
|
LoadDataType
|
||||||
|
} from '@motajs/loader';
|
||||||
|
|
||||||
|
export type CustomLoadFunc<R> = (data: R) => Promise<void>;
|
||||||
|
|
||||||
|
export interface IMotaDataLoader {
|
||||||
|
/** 加载进度对象 */
|
||||||
|
readonly progress: ILoadProgressTotal;
|
||||||
|
|
||||||
|
/** json 处理器 */
|
||||||
|
readonly jsonProcessor: ILoadTaskProcessor<LoadDataType.JSON, any>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化系统加载任务
|
||||||
|
*/
|
||||||
|
initSystemLoadTask(): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加自定义加载任务
|
||||||
|
* @param task 自定义加载任务
|
||||||
|
* @param onLoad 当任务加载完成时执行
|
||||||
|
* @returns 一个 `Promise`,当添加的任务加载完毕,且 `onLoad` 返回的 `Promise` 兑现后兑现
|
||||||
|
*/
|
||||||
|
addCustomLoadTask<R>(
|
||||||
|
task: ILoadTask<LoadDataType, R>,
|
||||||
|
onLoad: CustomLoadFunc<R>
|
||||||
|
): Promise<R>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 开始所有加载任务的加载工作
|
||||||
|
* @returns 一个 `Promise`,当所有加载任务加载完成后兑现
|
||||||
|
*/
|
||||||
|
load(): Promise<void>;
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user