Skip to content

Commit e41bbdf

Browse files
committed
🧑‍💻 增加了特效机器类
1 parent 8c4ea38 commit e41bbdf

27 files changed

+121
-71
lines changed

src/core/render/canvas2d/renderer.tsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -631,9 +631,7 @@ export namespace Renderer {
631631
if (!isRenderEffect) {
632632
return;
633633
}
634-
for (const effect of Stage.effects) {
635-
effect.render();
636-
}
634+
Stage.effectMachine.renderTick();
637635
}
638636
function renderBackground() {
639637
if (isShowBackgroundDots) {
@@ -670,7 +668,7 @@ export namespace Renderer {
670668
`location: ${Camera.location.x.toFixed(2)}, ${Camera.location.y.toFixed(2)}`,
671669
// `canvas rect: ${canvasRect.toString()}`,
672670
`window: ${w}x${h}`,
673-
`effect count: ${Stage.effects.length}`,
671+
`effect count: ${Stage.effectMachine.effectsCount}`,
674672
`node count: ${renderedNodes} , ${StageManager.getTextNodes().length}`,
675673
`edge count: ${renderedEdges} , ${StageManager.getLineEdges().length}`,
676674
`section count: ${StageManager.getSections().length}`,

src/core/service/RecentFileManager.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ export namespace RecentFileManager {
158158
StageHistoryManager.reset(data);
159159

160160
Camera.reset();
161-
Stage.effects.push(ViewFlashEffect.SaveFile());
161+
Stage.effectMachine.addEffect(ViewFlashEffect.SaveFile());
162162
RecentFileManager.addRecentFile({
163163
path: path,
164164
time: new Date().getTime(),

src/core/service/autoComputeEngine/mainTick.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ export function autoComputeEngineTick(tickNumber: number) {
166166

167167
for (const node of nodes) {
168168
computeTextNode(node);
169-
Stage.effects.push(
169+
Stage.effectMachine.addEffect(
170170
TextRaiseEffectLocated.fromDebugLogicNode(i, node.geometryCenter),
171171
);
172172
i++;
@@ -246,7 +246,9 @@ function computeTextNode(node: TextNode) {
246246
for (const name of Object.keys(MapNameFunction)) {
247247
if (node.text === name) {
248248
// 发现了一个逻辑节点
249-
Stage.effects.push(RectangleLittleNoteEffect.fromUtilsLittleNote(node));
249+
Stage.effectMachine.addEffect(
250+
RectangleLittleNoteEffect.fromUtilsLittleNote(node),
251+
);
250252

251253
const result = MapNameFunction[name](
252254
AutoComputeUtils.getParentTextNodes(node).map((p) => p.text),

src/core/service/controller/concrete/ControllerCutting.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ ControllerCutting.mousemove = (event: MouseEvent) => {
8383
.getCollidePointsWithLine(Stage.cuttingLine);
8484
// 增加两点特效
8585
for (const collidePoint of collidePoints) {
86-
Stage.effects.push(
86+
Stage.effectMachine.addEffect(
8787
new CircleFlameEffect(
8888
new ProgressNumber(0, 5),
8989
collidePoint,
@@ -132,7 +132,7 @@ ControllerCutting.mouseup = (event: MouseEvent) => {
132132
for (const edge of Stage.warningEdges) {
133133
StageManager.deleteEdge(edge);
134134
for (const effect of EdgeRenderer.getCuttingEffects(edge)) {
135-
Stage.effects.push(effect);
135+
Stage.effectMachine.addEffect(effect);
136136
}
137137
}
138138
StageManager.deleteEntities(Stage.warningEntity);
@@ -144,7 +144,7 @@ ControllerCutting.mouseup = (event: MouseEvent) => {
144144

145145
Stage.warningEdges = [];
146146

147-
Stage.effects.push(
147+
Stage.effectMachine.addEffect(
148148
new LineCuttingEffect(
149149
new ProgressNumber(0, 15),
150150
cuttingStartLocation,

src/core/service/controller/concrete/ControllerDragFile.tsx

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ ControllerDragFile.dragEnter = (event: DragEvent) => {
3232
event.preventDefault();
3333
event.stopPropagation();
3434
Stage.isDraggingFile = true;
35-
Stage.effects.push(new TextRiseEffect("正在拖入文件"));
35+
Stage.effectMachine.addEffect(new TextRiseEffect("正在拖入文件"));
3636
Stage.draggingLocation = Renderer.transformView2World(
3737
new Vector(event.clientX, event.clientY),
3838
);
@@ -160,20 +160,20 @@ function dealJsonFileDrop(file: File, mouseWorldLocation: Vector) {
160160
const dataString = fileContent?.toString();
161161
if (dataString === undefined) {
162162
console.error("文件内容为空");
163-
Stage.effects.push(new TextRiseEffect("文件内容为空"));
163+
Stage.effectMachine.addEffect(new TextRiseEffect("文件内容为空"));
164164
} else {
165165
StageManager.addSerializedData(
166166
StageLoader.validate(JSON.parse(dataString)),
167167
mouseWorldLocation,
168168
);
169-
Stage.effects.push(new ViewFlashEffect(Color.White));
169+
Stage.effectMachine.addEffect(new ViewFlashEffect(Color.White));
170170
}
171171
};
172172

173173
reader.onerror = (e) => {
174174
console.error("文件读取错误:", e);
175-
Stage.effects.push(new TextRiseEffect("文件读取错误:" + e));
176-
Stage.effects.push(new ViewFlashEffect(Color.Red));
175+
Stage.effectMachine.addEffect(new TextRiseEffect("文件读取错误:" + e));
176+
Stage.effectMachine.addEffect(new ViewFlashEffect(Color.Red));
177177
};
178178
}
179179

@@ -185,7 +185,9 @@ function dealPngFileDrop(file: File, mouseWorldLocation: Vector) {
185185

186186
if (typeof fileContent !== "string") {
187187
console.error("文件内容为空");
188-
Stage.effects.push(new TextRiseEffect("图片内容不是string类型"));
188+
Stage.effectMachine.addEffect(
189+
new TextRiseEffect("图片内容不是string类型"),
190+
);
189191
return;
190192
}
191193

@@ -207,7 +209,7 @@ function dealPngFileDrop(file: File, mouseWorldLocation: Vector) {
207209
};
208210
reader.onerror = (e) => {
209211
console.error("文件读取错误:", e);
210-
Stage.effects.push(new TextRiseEffect("文件读取错误:" + e));
211-
Stage.effects.push(new ViewFlashEffect(Color.Red));
212+
Stage.effectMachine.addEffect(new TextRiseEffect("文件读取错误:" + e));
213+
Stage.effectMachine.addEffect(new ViewFlashEffect(Color.Red));
212214
};
213215
}

src/core/service/controller/concrete/ControllerDrawing.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ ControllerDrawing.mousemove = (event: MouseEvent) => {
3636
new Vector(event.clientX, event.clientY),
3737
);
3838
// 绘制临时激光笔特效
39-
Stage.effects.push(
39+
Stage.effectMachine.addEffect(
4040
new LineEffect(
4141
new ProgressNumber(0, 50),
4242
ControllerDrawing.lastMoveLocation,

src/core/service/controller/concrete/ControllerEntityLayerMoving.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ ControllerLayerMoving.mouseup = (event: MouseEvent) => {
6868
StageManager.goInSection(selectedEntities, section);
6969
// 特效
7070
for (const entity of selectedEntities) {
71-
Stage.effects.push(
71+
Stage.effectMachine.addEffect(
7272
new RectanglePushInEffect(
7373
entity.collisionBox.getRectangle(),
7474
section.collisionBox.getRectangle(),

src/core/service/controller/concrete/ControllerNodeConnection.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ function isConnecting() {
3232

3333
function addConnectEffect(from: ConnectableEntity, to: ConnectableEntity) {
3434
for (const effect of EdgeRenderer.getConnectedEffects(from, to)) {
35-
Stage.effects.push(effect);
35+
Stage.effectMachine.addEffect(effect);
3636
}
3737
}
3838
/**
@@ -89,7 +89,7 @@ ControllerNodeConnection.mousedown = (event: MouseEvent) => {
8989
for (const node of StageManager.getConnectableEntity()) {
9090
if (node.isSelected) {
9191
// 特效
92-
Stage.effects.push(
92+
Stage.effectMachine.addEffect(
9393
new RectangleNoteEffect(
9494
new ProgressNumber(0, 15),
9595
node.collisionBox.getRectangle().clone(),
@@ -102,7 +102,7 @@ ControllerNodeConnection.mousedown = (event: MouseEvent) => {
102102
// 不触发多重连接
103103
Stage.connectFromEntities = [clickedConnectableEntity];
104104
// 特效
105-
Stage.effects.push(
105+
Stage.effectMachine.addEffect(
106106
new RectangleNoteEffect(
107107
new ProgressNumber(0, 15),
108108
clickedConnectableEntity.collisionBox.getRectangle().clone(),
@@ -167,7 +167,7 @@ ControllerNodeConnection.mouseup = (event: MouseEvent) => {
167167
}
168168
if (isHaveConnectResult) {
169169
// 给连向的那个节点加特效
170-
Stage.effects.push(
170+
Stage.effectMachine.addEffect(
171171
new CircleFlameEffect(
172172
new ProgressNumber(0, 15),
173173
Stage.connectToEntity.collisionBox.getRectangle().center,

src/core/service/controller/concrete/utilsControl.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ function textNodeInEditModeByUUID(uuid: string) {
147147
}
148148
const rect = createNode.collisionBox.getRectangle();
149149
// 整特效
150-
Stage.effects.push(EntityCreateLineEffect.from(rect));
150+
Stage.effectMachine.addEffect(EntityCreateLineEffect.from(rect));
151151
if (isDesktop) {
152152
editTextNode(createNode);
153153
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { EffectObject } from "./effectObject";
2+
3+
/**
4+
* 特效机器
5+
*
6+
* 它将产生一个机器对象,并唯一附着在舞台上。
7+
* 如果有多页签多页面,则每个页面都有自己的唯一特效机器。
8+
*/
9+
export class EffectMachine {
10+
private constructor() {}
11+
12+
static default(): EffectMachine {
13+
return new EffectMachine();
14+
}
15+
16+
private effects: EffectObject[] = [];
17+
18+
public addEffect(effect: EffectObject) {
19+
this.effects.push(effect);
20+
}
21+
22+
public get effectsCount() {
23+
return this.effects.length;
24+
}
25+
26+
public addEffects(effects: EffectObject[]) {
27+
this.effects.push(...effects);
28+
}
29+
30+
/**
31+
* 此函数放在舞台的逻辑循环中,每帧都会被调用。
32+
*/
33+
public logicTick() {
34+
for (const effect of this.effects) {
35+
effect.tick();
36+
}
37+
// 清理过时特效
38+
this.effects = this.effects.filter((effect) => !effect.timeProgress.isFull);
39+
}
40+
41+
/** 渲染所有特效 */
42+
public renderTick() {
43+
for (const effect of this.effects) {
44+
effect.render();
45+
}
46+
}
47+
}

src/core/service/keyboardOnlyEngine/keyboardOnlyEngine.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,8 @@ export namespace KeyboardOnlyEngine {
150150
// 连接到之前的节点
151151
for (const selectedEntity of selectConnectableEntities) {
152152
StageManager.connectEntity(selectedEntity, entity);
153-
Stage.effects.push(
154-
...EdgeRenderer.getConnectedEffects(selectedEntity, entity),
153+
Stage.effectMachine.addEffects(
154+
EdgeRenderer.getConnectedEffects(selectedEntity, entity),
155155
);
156156
}
157157
// 选择到新创建的节点
@@ -179,8 +179,8 @@ export namespace KeyboardOnlyEngine {
179179
// 连接到之前的节点
180180
for (const entity of selectConnectableEntities) {
181181
StageManager.connectEntity(entity, newNode);
182-
Stage.effects.push(
183-
...EdgeRenderer.getConnectedEffects(entity, newNode),
182+
Stage.effectMachine.addEffects(
183+
EdgeRenderer.getConnectedEffects(entity, newNode),
184184
);
185185
}
186186
// 选择到新创建的节点

src/core/stage/Camera.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ export namespace Camera {
100100
// content: "前面的区域以后再来探索吧?",
101101
// type: "error",
102102
// });
103-
Stage.effects.push(
103+
Stage.effectMachine.addEffect(
104104
new TextRiseEffect("派蒙:前面的区域以后再来探索吧?"),
105105
);
106106
speed = Vector.getZero();

src/core/stage/Stage.tsx

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import { autoComputeEngineTick } from "../service/autoComputeEngine/mainTick";
99
import { autoLayoutMainTick } from "../service/autoLayoutEngine/mainTick";
1010
import { Controller } from "../service/controller/Controller";
1111
import { PointDashEffect } from "../service/effectEngine/concrete/PointDashEffect";
12-
import { EffectObject } from "../service/effectEngine/effectObject";
1312
import { KeyboardOnlyEngine } from "../service/keyboardOnlyEngine/keyboardOnlyEngine";
1413
import { Settings } from "../service/Settings";
1514
import { LineEdge } from "../stageObject/association/LineEdge";
@@ -19,6 +18,7 @@ import { ConnectableEntity, Entity } from "../stageObject/StageObject";
1918
import { StageDumper } from "./StageDumper";
2019
import { StageManager } from "./stageManager/StageManager";
2120
import { StageSaveManager } from "./StageSaveManager";
21+
import { EffectMachine } from "../service/effectEngine/effectMachine";
2222
/**
2323
* 舞台对象
2424
* 更广义的舞台,
@@ -71,7 +71,7 @@ export namespace Stage {
7171
}
7272
}
7373

74-
export let effects: EffectObject[] = [];
74+
export const effectMachine = EffectMachine.default();
7575
/**
7676
* 是否正在框选
7777
*/
@@ -207,7 +207,7 @@ export namespace Stage {
207207
}
208208
if (connectTargetNode === null) {
209209
// 如果鼠标位置没有和任何节点相交
210-
effects.push(
210+
effectMachine.addEffect(
211211
PointDashEffect.fromMouseEffect(
212212
Controller.lastMoveLocation,
213213
connectFromEntities.length * 5,
@@ -218,11 +218,8 @@ export namespace Stage {
218218
}
219219
}
220220

221-
for (const effect of effects) {
222-
effect.tick();
223-
}
224-
// 清理过时特效
225-
effects = effects.filter((effect) => !effect.timeProgress.isFull);
221+
// 特效逻辑
222+
effectMachine.logicTick();
226223

227224
// 计算引擎
228225
autoComputeEngineTick(tickNumber);

src/core/stage/StageSaveManager.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export namespace StageSaveManager {
2121
*/
2222
export async function saveHandle(path: string, data: Serialized.File) {
2323
await writeTextFile(path, JSON.stringify(data));
24-
Stage.effects.push(ViewFlashEffect.SaveFile());
24+
Stage.effectMachine.addEffect(ViewFlashEffect.SaveFile());
2525
StageHistoryManager.reset(data); // 重置历史
2626
isCurrentSaved = true;
2727
}
@@ -43,7 +43,7 @@ export namespace StageSaveManager {
4343
}
4444
await writeTextFile(Stage.Path.getFilePath(), JSON.stringify(data));
4545
if (addFlashEffect) {
46-
Stage.effects.push(ViewFlashEffect.SaveFile());
46+
Stage.effectMachine.addEffect(ViewFlashEffect.SaveFile());
4747
}
4848
if (resetHistory) {
4949
StageHistoryManager.reset(data); // 重置历史
@@ -67,7 +67,7 @@ export namespace StageSaveManager {
6767
}
6868

6969
await writeTextFile(path, JSON.stringify(data));
70-
Stage.effects.push(ViewFlashEffect.SaveFile());
70+
Stage.effectMachine.addEffect(ViewFlashEffect.SaveFile());
7171
}
7272
/**
7373
* 备份,会在工程文件夹旁白生成一个类似的json文件
@@ -92,7 +92,7 @@ export namespace StageSaveManager {
9292

9393
await writeTextFile(backupPath, JSON.stringify(data));
9494
if (addFlashEffect) {
95-
Stage.effects.push(ViewFlashEffect.SaveFile());
95+
Stage.effectMachine.addEffect(ViewFlashEffect.SaveFile());
9696
}
9797
}
9898

src/core/stage/stageManager/StageManager.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -857,7 +857,7 @@ export namespace StageManager {
857857
for (const edge of StageManager.getLineEdges()) {
858858
if (edge.isSelected) {
859859
StageManager.deleteEdge(edge);
860-
Stage.effects.push(...EdgeRenderer.getCuttingEffects(edge));
860+
Stage.effectMachine.addEffects(EdgeRenderer.getCuttingEffects(edge));
861861
}
862862
}
863863
}

src/core/stage/stageManager/concreteMethods/StageAutoAlignManager.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,13 +121,13 @@ export namespace StageAutoAlignManager {
121121
moveTargetRectangle.location.x += xMoveDiff;
122122
moveTargetRectangle.location.y += yMoveDiff;
123123

124-
Stage.effects.push(
124+
Stage.effectMachine.addEffect(
125125
RectangleRenderEffect.fromPreAlign(moveTargetRectangle),
126126
);
127127
for (const targetRectangle of xTargetRectangles.concat(
128128
yTargetRectangles,
129129
)) {
130-
Stage.effects.push(
130+
Stage.effectMachine.addEffect(
131131
EntityAlignEffect.fromEntity(moveTargetRectangle, targetRectangle),
132132
);
133133
}
@@ -138,7 +138,7 @@ export namespace StageAutoAlignManager {
138138
}
139139

140140
function _addAlignEffect(selectedEntity: Entity, otherEntity: Entity) {
141-
Stage.effects.push(
141+
Stage.effectMachine.addEffect(
142142
EntityAlignEffect.fromEntity(
143143
selectedEntity.collisionBox.getRectangle(),
144144
otherEntity.collisionBox.getRectangle(),

0 commit comments

Comments
 (0)