墨影剑心:用 Java Swing 写一个水墨武侠练功房小游戏
墨影剑心:用 Java Swing 写一个水墨武侠练功房小游戏
Java Swing + Java2D + Maven,从角色状态机、技能时间线,到水墨粒子、屏幕震动和 8-bit 音效,一个可以直接运行的武侠练功房小游戏。
GitHub: https://github.com/zhchoice123/javaCall
前言
这段时间我一直在做一个很小但很有意思的 Java 项目:把一个武侠练功房做成真正能玩的小游戏。
它不是一个完整商业游戏,更像是一个技术练习场:我想验证 Java Swing 能不能做出还算顺手的动作反馈,能不能在没有外部游戏引擎的情况下,把移动、跳跃、闪避、招架、连击、技能冷却、粒子特效和音效全部串起来。
最后做出来的东西叫「墨影剑心」。玩家在水墨风格的训练房里操控角色,面对会反击的木桩练习连段。当前版本已经支持双角色:墨衣剑客和孤刀·裴渊。一个偏剑气、招架和飞剑,一个偏怒气、重刀和爆发。
先看效果
训练房的基础画面如下:

剑客的 J 技能「沧海三叠浪」是起手招式,强调连续斩击和命中反馈:

K 技能「太极化万物」承担防反功能,木桩反击时如果抓住前段窗口,可以打出完美招架:

U 技能「御剑诀」会引动飞剑从天而降,视觉粒子和伤害结算是分离的:

Q/E 是左右侧闪身,不只是位移,也给了短暂无敌帧,用来躲木桩横扫:

切换到第二角色「孤刀·裴渊」后,HUD 会从内力/剑意切换成怒气资源:

刀客的招式读感更重,比如 H「碾步」和后续重刀连段:

项目里还预留了训练房到 Boss 房的切换入口:

功能一览
当前版本已经完成了这些核心功能:
- Java Swing 窗口、游戏循环和 Java2D 绘制。
- 角色移动、跳跃、侧闪、短暂无敌帧。
- 木桩血量、受击、击退、眩晕、死亡重生。
- 木桩反击循环:预警、横扫、命中、被招架、被闪避。
- 剑客技能:J、K、L、I、U、H、O、P。
- 刀客技能:J、H、K、I、U、O。
- 连击系统:15 连击进入「人剑合一」,30 连击触发「天人合一」。
- 刀客怒气系统:满怒进入「狂战」爆发。
- 粒子系统:火花、木屑、伤害数字、太极符号、飞剑、落叶、墨迹拖尾。
- 屏幕反馈:hit-stop、震屏、闪白、慢动作感。
- 8-bit 程序化音效:挥砍、命中、招架、预警、眩晕等。
- F3 调试覆盖层和伤害统计。
安装与启动
项目没有引入第三方依赖,使用 Maven 管理构建。
前置条件:
- JDK 8 或更高版本
- Maven 3.x
拉取项目:
git clone https://github.com/zhchoice123/javaCall.git
cd javaCall
编译:
mvn clean compile
运行:
mvn exec:java
这里有一个小细节:运行命令需要在项目根目录执行。因为游戏目前会从相对路径读取图片资源,比如:
assets/hero.png
assets/dummy.png
assets/ink_background.png
如果在其他目录执行,Swing 窗口可以启动,但图片资源可能找不到。
接入框架与技术栈
这个项目刻意保持得很轻:
- 构建框架:Maven
- GUI 框架:Java Swing
- 绘图方式:Java2D / Graphics2D
- 输入方式:KeyListener
- 音频方式:javax.sound.sampled
- 资源加载:本地 PNG 图片
- 外部依赖:无
整体结构大概是这样:
assets/ 图片资源
src/ Java 源码
docs/ 设计文档、优化记录、素材说明
docs/blog-assets/ 博客配图
pom.xml Maven 构建配置
关键类分工:
| 类 | 作用 |
|---|---|
| GameLauncher | 程序入口,创建 JFrame 并启动游戏 |
| GamePanel | 游戏主循环、输入、渲染、HUD、全局效果 |
| Player | 玩家状态机、技能释放、资源、残影和绘制 |
| Dummy | 木桩敌人、反击、受击、眩晕和重生 |
| SkillTimeline | 用帧事件描述技能命中、结束、取消窗口 |
| Particle | 统一粒子系统 |
| ImageUtils | 图片加载、缩放、去背景 |
| SoundManager | 程序化 8-bit 音效和异步播放 |
设计上最有意思的地方
我觉得这个项目最有价值的地方,不是画面多复杂,而是它把一个动作游戏的“手感问题”拆成了很多小机制。
第一,所有战斗时间都按帧计算。60 帧约等于 1 秒,技能命中帧、后摇、冷却、木桩预警、反击窗口都统一用帧数表示。这样做的好处是,调动作节奏时非常直观。
第二,技能不能用 Thread.sleep 去做停顿。早期动作游戏最容易犯的错误是“命中后睡一下”,结果窗口直接卡住。现在项目里的冲击停顿改成了 hit-stop:角色和木桩暂停,粒子、闪白和震屏仍然继续渲染,所以打击感更重,但画面不会死掉。
第三,粒子只负责表现,不负责伤害。比如「御剑诀」的飞剑粒子是视觉效果,真正的命中结算仍然在 Player 的时间线里完成。这样后续调特效时,不会把战斗判定搞乱。
第四,项目正在从“写死技能”演进到“数据驱动技能”。现在已经有 Fighter、Moveset、Skill、ResourceModel 这些结构,第二角色就是在这个方向上接进去的。虽然还有一部分分支留在 Player 里,但路线已经比较清晰。
最后:怎么玩
基础移动:
| 按键 | 作用 |
|---|---|
| A / D 或 左右方向键 | 左右移动 |
| Space | 跳跃,可躲避木桩横扫 |
| Q | 闪到木桩左侧 |
| E | 闪到木桩右侧 |
| C | 切换角色 |
| R | 重置伤害统计 |
| F3 | 显示/隐藏调试信息 |
木桩模式:
| 按键 | 模式 |
|---|---|
| 1 | 演武木桩 |
| 2 | 精铁木桩,血量更高、反击更快 |
| 3 | 静止木桩,不反击 |
剑客技能:
| 按键 | 技能 |
|---|---|
| J | 沧海三叠浪 |
| K | 太极化万物 |
| L | 飞影多重瞬斩 |
| I | 墨影瞬杀 |
| U | 御剑诀 |
| H | 踏雪穿花步 |
| O | 万剑归宗 |
| P | 剑罡·崩 |
刀客技能:
| 按键 | 技能 |
|---|---|
| J | 劈山斩 |
| H | 碾步 |
| K | 铁山式 |
| I | 崩刀 |
| U | 拔刀·一闪 |
| O | 裂地斩 |
实际玩的时候,可以先用 3 档静止木桩熟悉技能距离,再切到 1 档练招架和闪避。剑客适合练节奏,刀客适合练怒气爆发。等连击打到 15 以后进入伤害强化状态,再尝试把终结技接出来。
总结
这个项目对我来说,更像是一次“把 Java 基础能力做成手感”的练习。
Swing、Java2D、线程、输入监听、资源加载、音频播放,这些东西单独看都不复杂。但把它们放在一个 60 FPS 的小游戏里,就会暴露很多真实问题:哪里会卡顿,哪里会分配太多对象,哪里状态机太硬,哪里动画和判定对不上。
所以我会继续把它往两个方向推进:一是把技能系统继续数据化,让新增角色更容易;二是把 Boss 房和关卡结构补起来,让它从“练功房”慢慢变成一个真正的小型动作游戏。
写作说明:本文基于项目源码、README、运行截图和本次构建验证整理,使用 AI 辅助成文;项目地址和构建命令已在本机验证。

浙公网安备 33010602011771号