Electron + Vue 搭建桌面 TTS 工具的技术选型
MiMo TTS Studio 是一个桌面配音工作台,集成小米 MiMo-V2.5-TTS 引擎,支持多角色音色管理、批量并发生成、波形可视化和 WAV/MP3 导出。本文记录技术选型的核心考量。 架构概览 graph TD subgraph "Electron 主进程" M["main.js"] --> C["Controller/tts.js"] C --> S["Service/tts.js"] S --> API["小米 TTS API"] S --> FS["文件系统"] end subgraph "Vue 渲染进程" UI["Vue 3 + Naive UI"] --> IPC["IPC Bridge"] ...
从标题到结算:场景切换驱动的游戏循环
godot-game-one 的游戏循环没有传统的 FSM enum——“状态”由场景切换驱动。标题是一个场景,大厅是一个场景,战斗是一个场景,结算是一个场景。场景之间的切换就是状态之间的转移。 graph TD A["TitleScreen"] -->|"单机"| B["Main 战斗场景"] A -->|"联机"| C["Lobby 大厅"] C -->|"房主开始"| B B -->|"game_running = false"| D["GameOver 结算"] D -->|"按 R / 点击"| B Autoload 单例:跨场景的状态容器场景切换会清空场景树,但 Autoload 单例不会。GameState 作为全局 Autoload,在场景切换间保持存活: 1234567891...
不用 AnimationPlayer:代码驱动的游戏动画
godot-game-one 里没有一个 .tres 动画资源文件。所有动画——角色行走摆动、屏幕震动、受击闪光、受击特效——全部在 _process / _physics_process 或 Tween 回调里用数学函数驱动。 graph TD A["程序化动画"] --> B["玩家行走"] A --> C["屏幕震动"] A --> D["受击闪光"] A --> E["引擎呼吸"] A --> F["受击特效"] B --> B1["sin 波驱动 rotation"] B --> B2["abs(sin) 驱动 position.y"] C --> C1["线性衰减随机偏移"] D --> D1["modulate 过曝 + scale...
精英怪四阶段:护盾→破盾→裂隙→濒死的隐式状态机
Boss 有显式的 enum BossPhase 三阶段,精英怪则走了另一条路:不用 enum,用护盾值 + 血量比例 + 计时器三个维度隐式判定阶段。509 行的 elite.gd 里,同一个函数 _handle_attacks() 根据当前状态自动分流到不同攻击模式。 graph TD A["精英怪出现"] --> B{"护盾 > 0?"} B -->|"是"| C["Phase A 护盾压制"] B -->|"否"| D{"phase_b_timer 激活?"} D -->|"是"| E["Phase B 破盾易伤"] D -->|"否"| F{"血量 > 35%?"} F -->|"是"| G["Phase C 裂隙召唤"] ...
鸿蒙近场联机:ENet + Harmony 双栈架构
godot-game-one 的联机模式目标是:鸿蒙设备间通过近场发现配对,进入实时协作射击。但 Godot 4 原生不支持鸿蒙,ENet 也无法做设备发现。解决方案是:大厅用 Harmony,战斗用 ENet。 graph TD A["玩家打开游戏"] --> B{"鸿蒙插件可用?"} B -->|"是"| C["Harmony 近场发现"] B -->|"否"| D["UDP 广播发现"] C --> E["大厅配对"] D --> E E --> F["房主创建 ENet Server"] F --> G["客户端连接 ENet"] G --> H["战斗开始"] H --> I["ENet 实时同步"] H -...
Boss 多阶段战斗:两层状态机的设计
godot-game-one 的 Boss 是一艘”裂隙母舰”,战斗从压制阶段打到核心过载,全程大约 42 秒。914 行的 boss.gd 里,核心问题只有一个:怎么用最少的代码做出有节奏感的多阶段 AI? 答案是两层状态机。 stateDiagram-v2 [*] --> IDLE IDLE --> CIRCLE: 太远 IDLE --> ATTACK: 50 权重 IDLE --> RETREAT: 太近 CIRCLE --> ATTACK: 计时器到期 CIRCLE --> RETREAT: 太近 ATTACK --> CIRCLE: 计时器到期 ATTACK --> RETREAT: 太近 RETREAT --> CIRCLE: 安全距离 RETREAT --> ATTACK: 计时器到期 IDLE --> ENRAGED: Phase3 激活 ENRAGED --> ATTACK: 复用逻...
零音频文件:用纯代码生成 8-bit 游戏音效
godot-game-one 里没有任何 .wav、.ogg、.mp3 文件。所有音效——射击、爆炸、受击、UI 提示——全部在运行时用 GDScript 计算生成。两个脚本 sfx_manager.gd 和 bgm_manager.gd 承担了全部音频职责。 graph TD A[游戏启动] --> B[SFX 单例初始化] A --> C[BGM 单例初始化] B --> D[预生成 6 个音效] D --> D1[play_shoot - Sweep] D --> D2[play_explosion - Noise] D --> D3[play_enemy_death - Sweep] D --> D4[play_player_hurt - Tone] D --> D5[play_ui_confirm - Tone] D --> D6[play_ui_select - Tone] C --> E[生成 BGM 音频] ...
Godot 4 做复古弹幕游戏:代码即美术
做独立游戏最头疼的往往不是代码,是美术。godot-game-one 项目一开始也卡在这里——没有美术资源,没有美术师,只有代码。 最终的解法是:所有视觉素材全部用 GDScript 程序化生成。整个 sprite_factory.gd 文件 898 行,承担了传统项目里原画师 + 精灵图集 + 动画师的全部职责。 graph LR A["游戏启动"] --> B["SpriteFactory 初始化"] B --> C["生成玩家飞船"] B --> D["生成敌人 x3 类型"] B --> E["生成 Boss x5 变体"] B --> F["生成子弹/爆炸/陨石"] C --> G["缓存为 ImageTexture"] D --> G E --> G F --> G ...
技术博客写作计划
前言这个博客会持续记录我在多个项目中的技术实践。以下是当前阶段的写作计划,覆盖源码项目 + 学习问答两类内容。 🏗️ UE5 构建工程 — Horde 分布式编译独立技术调研,不绑定具体项目。内容涵盖 UE5 分布式编译的三代方案、FASTBuild vs Horde 选型、BuildGraph 流水线设计,以及 UE5.7 DDC/Zen Server 缓存架构与最佳实践。 已完成文章: # 文章 核心话题 状态 01 UE5 分布式编译选型:FASTBuild 还是 Horde? FASTBuild / Horde / XGE 三代方案对比、BuildGraph XML 模板、Agent Pool 设计、DDC 冷启动陷阱 ✅ 02 UE5.7 DDC 配置实践:Zen Server 部署指南 Zen Server 三层架构、DDC Graph 配置、冷启动种子策略、CI 环境 DDC 设计 ✅ 📘 Golang 学习 — 从零到实战(完结 ✅ 11篇)基于真实对话的 Go 语言学习问答,Q&A 格式,每篇...
你好,我是 Izzy
开场白这是我的个人博客的第一篇文章。简单打个招呼。⚡ 我叫 Izzy。 我是谁?如果用一句话形容自己: 一个在代码世界里打了 15 年仗、现在开始用 AI 重装上阵的老兵。 我的日常目前并行推进几个方向: 游戏服务器开发 — slg-go 项目,Go + Rust 架构的 SLG 手游服务端 独立游戏制作 — godot-game-one,Godot 4.x 的 3D 微叙事游戏 鸿蒙原生应用 — 背单词 App、Authenticator,追求上线发布标准 一人公司启动 — 从零搭建,定位游戏团队的技术基建服务商 AI Agent 探索 — 研究 AI 在游戏研发中的实际落地场景 这个博客的定位不追热点,不灌水文。这里主要记录: 📝 技术深度文章 — 架构设计、性能优化、踩坑复盘 🎮 游戏开发日志 — 项目进展、设计决策、开发感悟 🤖 AI 实践笔记 — Agent 工作流、多模态应用、效率工具 💡 一人公司思考 — 创业过程、商业模式、资源整合 写在最后感谢你来到这里。 如果你对游戏开发、AI 应用或者鸿蒙原生开发感兴趣,欢迎交流。这个博客会持续更新,...