From 909c51e5d433b488f1eae191a6334a4b10f4b9a0 Mon Sep 17 00:00:00 2001 From: liuxianghui <519646741@qq.com> Date: Thu, 13 Jan 2022 15:41:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=8B=E4=BB=B6=EF=BC=9Abb?= =?UTF-8?q?l=E5=BC=95=E6=93=8E=E6=B8=B2=E6=9F=93=E5=90=84=E7=A7=8D?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=94=B9=E5=8F=98=E6=97=B6=E3=80=82=20?= =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E6=AD=A4=E4=BA=8B=E4=BB=B6=EF=BC=8C=E5=9C=A8?= =?UTF-8?q?=E6=9A=82=E5=81=9C=E6=B8=B2=E6=9F=93=E6=97=B6=EF=BC=88=E5=8D=B3?= =?UTF-8?q?=E9=80=80=E5=87=BA=E4=B8=89=E7=BB=B4=E5=9C=BA=E6=99=AF=E6=97=B6?= =?UTF-8?q?=EF=BC=89=EF=BC=8C=E6=B8=85=E7=A9=BA=E8=AF=AD=E9=9F=B3=E6=92=AD?= =?UTF-8?q?=E6=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../events/event-engine-status-change.ts | 51 +++++++++++++++++++ src/app/babylon/game.ts | 14 ++--- src/app/babylon/tool/speaking-tool.ts | 23 +++++++-- 3 files changed, 79 insertions(+), 9 deletions(-) create mode 100644 src/app/babylon/controller/event-manager/events/event-engine-status-change.ts diff --git a/src/app/babylon/controller/event-manager/events/event-engine-status-change.ts b/src/app/babylon/controller/event-manager/events/event-engine-status-change.ts new file mode 100644 index 0000000..c7c00fa --- /dev/null +++ b/src/app/babylon/controller/event-manager/events/event-engine-status-change.ts @@ -0,0 +1,51 @@ +import { Event_Base } from "../event-base"; +import { EventManager } from "../event-manager"; + +/** + * 引擎状态发生变化 + */ +export class Event_EngineStatusChange extends Event_Base { + + /** + * 变化的类型 + */ + changeType: EngineStatusChangeType; + + + /** + * 派发事件 + * @param modeleInfo + * @param modelChangeType + */ + static dispatch(changeType: EngineStatusChangeType) { + let eventData = new Event_EngineStatusChange(); + eventData.changeType = changeType; + EventManager.dispatch(Event_EngineStatusChange, eventData); + } + + getTypeKey() { + return "EngineStatusChangeType"; + } +} + +/** + * 引擎状态变化类型 + */ +export enum EngineStatusChangeType { + /** + * 初始化完成 + */ + init, + /** + * 释放前 + */ + dispose, + /** + * 暂停 + */ + pause, + /** + * 开始或继续 + */ + start, +} \ No newline at end of file diff --git a/src/app/babylon/game.ts b/src/app/babylon/game.ts index d0c5f82..f8bb9c5 100644 --- a/src/app/babylon/game.ts +++ b/src/app/babylon/game.ts @@ -1,4 +1,5 @@ import { AbstractMesh, Database, Engine, FileTools, Mesh, RenderingManager, Scene } from "@babylonjs/core"; +import { EngineStatusChangeType, Event_EngineStatusChange } from "./controller/event-manager/events/event-engine-status-change"; import { SceneManager } from "./controller/scene-manager"; import { LoginSatus } from "./controller/status/login-status"; @@ -23,10 +24,6 @@ export class Game { // FileTools.DefaultRetryStrategy = RetryStrategy.ExponentialBackoff(2, 1000); if (Game.instance != null) { - // canvas.setAttribute("touch-action", "none"); - // canvas.style.touchAction = "none"; - // canvas.tabIndex = 1; - this.startRender(); this.scene.detachControl(); let view = this.engine.registerView(canvas, SceneManager.Instance.defaultCamera); this.canvas = canvas; @@ -35,11 +32,12 @@ export class Game { this.canvas.addEventListener('contextmenu', function (e) { e.preventDefault(); }) + this.startRender(); SceneManager.Instance.defaultCamera.attachControl(canvas, true); } else { - this.startRender(); + Game.instance = this; this.canvas = canvas; this.engine = new Engine(canvas, null, { stencil: true }); @@ -50,6 +48,8 @@ export class Game { this.createScene(); UIManager.Instance.init(); let scene = this.scene; + Event_EngineStatusChange.dispatch(EngineStatusChangeType.init); + this.startRender(); //最后,将场景渲染出来 (重要,不可缺少) this.engine.runRenderLoop(function () { if (Game.instance != null && Game.instance.isRender) { @@ -86,7 +86,7 @@ export class Game { } dispose() { - SpeakingTool.Instance.clear(); + Event_EngineStatusChange.dispatch(EngineStatusChangeType.dispose); SceneManager.Instance.dispose(); StatusManager.dispose(); this.scene.dispose() @@ -101,6 +101,7 @@ export class Game { pauseRender() { this.engine.unRegisterView(this.canvas); this.isRender = false; + Event_EngineStatusChange.dispatch(EngineStatusChangeType.pause); } /** @@ -108,6 +109,7 @@ export class Game { */ startRender() { this.isRender = true; + Event_EngineStatusChange.dispatch(EngineStatusChangeType.start); } diff --git a/src/app/babylon/tool/speaking-tool.ts b/src/app/babylon/tool/speaking-tool.ts index 54ca515..93ddcf9 100644 --- a/src/app/babylon/tool/speaking-tool.ts +++ b/src/app/babylon/tool/speaking-tool.ts @@ -1,4 +1,5 @@ import { EventManager } from "../controller/event-manager/event-manager"; +import { EngineStatusChangeType, Event_EngineStatusChange } from "../controller/event-manager/events/event-engine-status-change"; import { Event_LoadingChange } from "../controller/event-manager/events/event-loading-change"; /** @@ -11,10 +12,26 @@ export class SpeakingTool { static get Instance() { if (SpeakingTool.instance == null) { SpeakingTool.instance = new SpeakingTool(); + EventManager.addListener(Event_LoadingChange, (eventInfo) => { + SpeakingTool.instance.onChangeLoading(eventInfo); + }); + + EventManager.addListener(Event_EngineStatusChange, (eventData) => { + switch (eventData.changeType) { + //退出三维时,清空语音播报 + case EngineStatusChangeType.pause: + SpeakingTool.instance.clear(); + break; + case EngineStatusChangeType.dispose: + SpeakingTool.instance.clear(); + break; + } + + }) + } - EventManager.addListener(Event_LoadingChange, (eventInfo) => { - SpeakingTool.instance.onChangeLoading(eventInfo); - }); + + return SpeakingTool.instance; }