Skip to content

Commit 6edd8f3

Browse files
committed
✨ 添加自定义特效开关页面
1 parent 6aa02eb commit 6edd8f3

11 files changed

Lines changed: 137 additions & 23 deletions

File tree

src/core/render/canvas2d/renderer.tsx

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ export namespace Renderer {
9696
let isShowBackgroundDots = false;
9797
let isShowBackgroundCartesian = false;
9898
export let isAlwaysShowDetails = false;
99-
let isRenderEffect = true;
10099
export let protectingPrivacy = false;
101100
let isRenderCenterPointer = true;
102101

@@ -120,7 +119,6 @@ export namespace Renderer {
120119
"alwaysShowDetails",
121120
(value) => (isAlwaysShowDetails = value),
122121
);
123-
Settings.watch("renderEffect", (value) => (isRenderEffect = value));
124122
Settings.watch("protectingPrivacy", (value) => (protectingPrivacy = value));
125123
Settings.watch(
126124
"isRenderCenterPointer",
@@ -631,9 +629,6 @@ export namespace Renderer {
631629

632630
/** 渲染所有特效 */
633631
function renderEffects() {
634-
if (!isRenderEffect) {
635-
return;
636-
}
637632
Stage.effectMachine.renderTick();
638633
}
639634
function renderBackground() {

src/core/service/Settings.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export namespace Settings {
3131
cameraCycleSpaceSizeY: number;
3232
// 性能相关
3333
historySize: number; // 暂无
34-
renderEffect: boolean;
34+
effectsPerferences: Record<string, boolean>;
3535
isEnableEntityCollision: boolean;
3636
// 自动化相关
3737
autoNamerTemplate: string;
@@ -89,7 +89,7 @@ export namespace Settings {
8989
cameraCycleSpaceSizeY: 1000,
9090
// 性能相关
9191
historySize: 20,
92-
renderEffect: true,
92+
effectsPerferences: {},
9393
isEnableEntityCollision: false,
9494
// 自动相关
9595
autoNamerTemplate: "...",
@@ -129,6 +129,7 @@ export namespace Settings {
129129

130130
export async function init() {
131131
store = await createStore("settings.json");
132+
console.log("settings init");
132133
}
133134

134135
export async function get<K extends keyof Settings>(

src/core/service/effectEngine/effectMachine.tsx

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { Settings } from "../Settings";
12
import { EffectObject } from "./effectObject";
23

34
/**
@@ -7,7 +8,15 @@ import { EffectObject } from "./effectObject";
78
* 如果有多页签多页面,则每个页面都有自己的唯一特效机器。
89
*/
910
export class EffectMachine {
10-
private constructor() {}
11+
private effectsPerferences: Record<string, boolean> = {};
12+
13+
private constructor() {
14+
setTimeout(() => {
15+
Settings.watch("effectsPerferences", (value) => {
16+
this.effectsPerferences = value;
17+
});
18+
}, 10);
19+
}
1120

1221
static default(): EffectMachine {
1322
return new EffectMachine();
@@ -16,6 +25,9 @@ export class EffectMachine {
1625
private effects: EffectObject[] = [];
1726

1827
public addEffect(effect: EffectObject) {
28+
if (!(this.effectsPerferences[effect.constructor.name] ?? true)) {
29+
return;
30+
}
1931
this.effects.push(effect);
2032
}
2133

@@ -24,7 +36,11 @@ export class EffectMachine {
2436
}
2537

2638
public addEffects(effects: EffectObject[]) {
27-
this.effects.push(...effects);
39+
this.effects.push(
40+
...effects.filter(
41+
(effect) => this.effectsPerferences[effect.constructor.name] ?? true,
42+
),
43+
);
2844
}
2945

3046
/**

src/locales/zh-CN.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,10 @@ settings:
7272
visual: 显示
7373
physical: 物理
7474
performance: 性能
75+
effects: 特效
7576
automation: 自动化
7677
control: 控制
78+
keybinds: 快捷键
7779
ai: AI
7880
github: GitHub
7981
sounds: 声音

src/main.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { Color } from "./core/dataStruct/Color";
99
import { Vector } from "./core/dataStruct/Vector";
1010
import { EdgeRenderer } from "./core/render/canvas2d/entityRenderer/edge/EdgeRenderer";
1111
import { Renderer } from "./core/render/canvas2d/renderer";
12+
import { InputElement } from "./core/render/domElement/inputElement";
1213
import { PromptManager } from "./core/service/ai/PromptManager";
1314
import { ColorManager } from "./core/service/ColorManager";
1415
import {
@@ -40,7 +41,6 @@ import { exists } from "./utils/fs";
4041
import { exit, openDevtools, writeStderr, writeStdout } from "./utils/otherApi";
4142
import { getCurrentWindow, isDesktop, isWeb } from "./utils/platform";
4243
import { Popup } from "./utils/popup";
43-
import { InputElement } from "./core/render/domElement/inputElement";
4444

4545
const router = createMemoryRouter(routes);
4646
const Routes = () => <RouterProvider router={router} />;

src/pages/settings/_languages.tsx

Lines changed: 0 additions & 5 deletions
This file was deleted.

src/pages/settings/_layout.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import {
22
Bot,
33
Brain,
4+
Command,
45
Eye,
56
Info,
67
Keyboard,
78
Plug,
89
Settings,
910
Sparkles,
1011
Speaker,
12+
Zap,
1113
} from "lucide-react";
1214
import { useTranslation } from "react-i18next";
1315
import { NavLink, Outlet } from "react-router-dom";
@@ -33,9 +35,13 @@ export default function SettingsLayout() {
3335
{t("tabs.visual")}
3436
</NavLink>
3537
<NavLink to="/settings/performance">
36-
<Sparkles />
38+
<Zap />
3739
{t("tabs.performance")}
3840
</NavLink>
41+
<NavLink to="/settings/effects">
42+
<Sparkles />
43+
{t("tabs.effects")}
44+
</NavLink>
3945
<NavLink to="/settings/automation">
4046
<Bot />
4147
{t("tabs.automation")}
@@ -44,6 +50,10 @@ export default function SettingsLayout() {
4450
<Keyboard />
4551
{t("tabs.control")}
4652
</NavLink>
53+
<NavLink to="/settings/keybinds">
54+
<Command />
55+
{t("tabs.keybinds")}
56+
</NavLink>
4757
<NavLink to="/settings/ai">
4858
<Brain />
4959
{t("tabs.ai")}
@@ -61,7 +71,7 @@ export default function SettingsLayout() {
6171
{t("tabs.plugins")}
6272
</NavLink>
6373
</div>
64-
<div className="container mx-auto flex-1 overflow-auto">
74+
<div className="mx-auto w-[1024px] overflow-auto">
6575
<Outlet />
6676
</div>
6777
</div>

src/pages/settings/effects.tsx

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import { Stars } from "lucide-react";
2+
import { useEffect, useState } from "react";
3+
import { useTranslation } from "react-i18next";
4+
import Switch from "../../components/ui/Switch";
5+
import { Settings } from "../../core/service/Settings";
6+
import { Field } from "./_field";
7+
8+
export default function EffectsPage() {
9+
const { t } = useTranslation("effects");
10+
const [effectsPerferences, setEffectsPerferences] = useState<
11+
Record<string, boolean>
12+
>({});
13+
14+
useEffect(() => {
15+
console.log("effectsPerferences", effectsPerferences);
16+
Settings.get("effectsPerferences").then((preferences) => {
17+
Settings.set("effectsPerferences", {
18+
...preferences,
19+
...effectsPerferences,
20+
});
21+
});
22+
}, [effectsPerferences]);
23+
24+
return Object.keys(
25+
import.meta.glob("../../core/service/effectEngine/concrete/*.tsx", {
26+
eager: true,
27+
}),
28+
)
29+
.map((path) =>
30+
path
31+
.replace("../../core/service/effectEngine/concrete/", "")
32+
.replace(".tsx", ""),
33+
)
34+
.map((effectName) => (
35+
<Field
36+
key={effectName}
37+
icon={<Stars />}
38+
title={t(`${effectName}.title`)}
39+
description={t(`${effectName}.description`)}
40+
>
41+
<Switch
42+
value={effectsPerferences[effectName] ?? true}
43+
onChange={(value) => {
44+
setEffectsPerferences((prev) => ({
45+
...prev,
46+
[effectName]: value,
47+
}));
48+
}}
49+
/>
50+
</Field>
51+
));
52+
}

src/pages/settings/keybinds.tsx

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { Keyboard } from "lucide-react";
2+
import React from "react";
3+
import { useTranslation } from "react-i18next";
4+
import KeyBind from "../../components/ui/KeyBind";
5+
import { KeyBinds } from "../../core/service/KeyBinds";
6+
import { Field } from "./_field";
7+
8+
export default function KeyBindsPage() {
9+
const [keyBinds, setKeyBinds] = React.useState<
10+
[id: string, { key: string; modifiers: KeyBinds.KeyModifiers }][]
11+
>([]);
12+
13+
React.useEffect(() => {
14+
KeyBinds.entries().then((entries) => {
15+
setKeyBinds(entries);
16+
});
17+
}, []);
18+
19+
const { t } = useTranslation("keyBinds");
20+
21+
return keyBinds
22+
.map(([id, bind]) => (
23+
<Field
24+
key={id}
25+
icon={<Keyboard />}
26+
title={t(`${id}.title`, { defaultValue: id })}
27+
description={t(`${id}.description`, { defaultValue: "" })}
28+
>
29+
<KeyBind
30+
value={bind}
31+
onChange={(value) => {
32+
KeyBinds.set(id, value.key, value.modifiers);
33+
setKeyBinds((prev) =>
34+
prev.map((item) => (item[0] === id ? [item[0], value] : item)),
35+
);
36+
}}
37+
/>
38+
</Field>
39+
))
40+
.sort((a, b) => {
41+
if (a.key === null && b.key === null) return 0; // 两者均为 null,相等
42+
if (a.key === null) return 1; // a.key 为 null,把它排到后面
43+
if (b.key === null) return -1; // b.key 为 null,把它排到后面
44+
return a.key.localeCompare(b.key); // 正常比较
45+
});
46+
}

src/pages/settings/performance.tsx

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
1-
import { Sparkles, Undo, Ungroup } from "lucide-react";
1+
import { Undo, Ungroup } from "lucide-react";
22
import { SettingField } from "./_field";
33

44
export default function Performance() {
55
return (
66
<>
7-
<SettingField
8-
icon={<Sparkles />}
9-
settingKey="renderEffect"
10-
type="switch"
11-
/>
127
<SettingField
138
icon={<Undo />}
149
settingKey="historySize"

0 commit comments

Comments
 (0)