1
This commit is contained in:
399
backend/PROJECT_DOCUMENTATION.md
Normal file
399
backend/PROJECT_DOCUMENTATION.md
Normal file
@@ -0,0 +1,399 @@
|
||||
# Zombie Crisis 3 - 项目技术文档
|
||||
|
||||
## 1. 项目概述
|
||||
|
||||
Zombie Crisis 3 是一款多人在线僵尸射击游戏,采用客户端-服务器架构,支持最多 4 名玩家同时游戏。
|
||||
|
||||
### 1.1 技术栈
|
||||
|
||||
| 层级 | 技术 | 说明 |
|
||||
|------|------|------|
|
||||
| 后端 | Java + Maven | 游戏逻辑服务器 |
|
||||
| 前端 | JavaScript + Vite | Web 客户端 |
|
||||
| 渲染 | Three.js | 3D 图形渲染 |
|
||||
| 通信 | WebSocket | 实时双向通信 |
|
||||
| 协议 | JSON | 消息序列化 |
|
||||
|
||||
### 1.2 项目结构
|
||||
|
||||
```
|
||||
zp1/
|
||||
├── backend/ # Java 游戏服务器
|
||||
│ ├── pom.xml # Maven 配置
|
||||
│ └── src/main/java/com/zombie/game/
|
||||
│ ├── GameServerMain.java # 程序入口
|
||||
│ ├── model/ # 数据模型
|
||||
│ │ ├── GameWorld.java # 游戏世界主类
|
||||
│ │ ├── GameMap.java # 地图与流向场
|
||||
│ │ ├── Zombie.java # 僵尸实体
|
||||
│ │ ├── Player.java # 玩家实体
|
||||
│ │ ├── Bullet.java # 子弹实体
|
||||
│ │ ├── Loot.java # 掉落物
|
||||
│ │ ├── Room.java # 游戏房间
|
||||
│ │ └── Constants.java # 常量定义
|
||||
│ └── server/
|
||||
│ ├── GameWebSocketServer.java # WebSocket 服务器
|
||||
│ └── GameLoop.java # 游戏循环
|
||||
│
|
||||
├── frontend/ # JavaScript 客户端
|
||||
│ ├── package.json
|
||||
│ ├── vite.config.js
|
||||
│ ├── index.html
|
||||
│ └── src/
|
||||
│ ├── main.js # 应用入口
|
||||
│ ├── game/
|
||||
│ │ ├── engine.js # 游戏引擎
|
||||
│ │ └── scene.js # Three.js 场景
|
||||
│ ├── network/
|
||||
│ │ └── client.js # WebSocket 客户端
|
||||
│ ├── ui/
|
||||
│ │ ├── lobby.js # 大厅界面
|
||||
│ │ ├── hud.js # 游戏 HUD
|
||||
│ │ └── settings.js # 设置界面
|
||||
│ └── utils/
|
||||
│ ├── constants.js # 前端常量
|
||||
│ ├── input.js # 输入管理
|
||||
│ └── grid.js # 网格工具
|
||||
│
|
||||
└── FLOW_FIELD_NAVIGATION.md # 流向场寻路文档
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. 系统架构
|
||||
|
||||
### 2.1 整体架构图
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 客户端 │
|
||||
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
|
||||
│ │ LobbyUI │ │ HUD │ │ Scene │ │ Network │ │
|
||||
│ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ │
|
||||
│ └────────────┴────────────┴────────────┘ │
|
||||
│ │ │
|
||||
│ ┌─────┴─────┐ │
|
||||
│ │GameEngine │ │
|
||||
│ └─────┬─────┘ │
|
||||
└──────────────────────────┼──────────────────────────────────┘
|
||||
│ WebSocket (ws://:8080)
|
||||
│
|
||||
┌──────────────────────────┼──────────────────────────────────┐
|
||||
│ │ 服务器 │
|
||||
│ ┌─────┴─────┐ │
|
||||
│ │GameWebSocketServer│ │
|
||||
│ └─────┬─────┘ │
|
||||
│ ┌──────────────────┼──────────────────┐ │
|
||||
│ ┌────┴────┐ ┌─────┴─────┐ ┌────┴────┐ │
|
||||
│ │ Room │ │ GameLoop │ │ GameWorld│ │
|
||||
│ │ Manager │ │ (30 TPS) │ │ │ │
|
||||
│ └─────────┘ └─────┬─────┘ └────┬────┘ │
|
||||
│ │ │ │
|
||||
│ ┌─────┴─────────────────┴─────┐ │
|
||||
│ │ Model Entities │ │
|
||||
│ │ Player | Zombie | Bullet │ │
|
||||
│ └──────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 2.2 游戏循环
|
||||
|
||||
服务器以固定 30 TPS (Tick Per Second) 运行游戏逻辑:
|
||||
|
||||
```
|
||||
每帧 (约33ms):
|
||||
1. updateFlowField() - 更新流向场
|
||||
2. updateZombies() - 更新所有僵尸
|
||||
3. updateBullets() - 更新所有子弹
|
||||
4. updateZombieBullets() - 更新僵尸子弹
|
||||
5. checkBulletCollisions()- 子弹碰撞检测
|
||||
6. checkZombieAttacks() - 僵尸攻击检测
|
||||
7. checkLootCollection() - 拾取物收集
|
||||
8. broadcastGameState() - 广播游戏状态
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. 核心模块详解
|
||||
|
||||
### 3.1 GameWorld
|
||||
|
||||
游戏世界主类,管理所有游戏实体和逻辑。
|
||||
|
||||
**主要职责**:
|
||||
- 管理玩家、僵尸、子弹、掉落物集合
|
||||
- 每帧调用所有实体的更新方法
|
||||
- 处理实体间的碰撞检测
|
||||
- 生成僵尸和管理难度
|
||||
|
||||
**关键方法**:
|
||||
```java
|
||||
public void update(float dt)
|
||||
private void updateFlowField() // 更新流向场
|
||||
private void updateZombies(float dt) // 更新僵尸
|
||||
private void updateBullets(float dt) // 更新子弹
|
||||
private void checkBulletCollisions() // 子弹碰撞
|
||||
private void checkZombieAttacks() // 僵尸攻击
|
||||
private void fireWeapon(Player, aimX, aimY) // 武器射击
|
||||
```
|
||||
|
||||
### 3.2 GameMap
|
||||
|
||||
地图类,包含 32×32 格子地图和流向场寻路系统。
|
||||
|
||||
**流向场算法优势**:
|
||||
- 一次计算,所有僵尸共享
|
||||
- 自动适应多个玩家目标
|
||||
- O(m) 复杂度,m=地图格子数
|
||||
|
||||
### 3.3 Zombie
|
||||
|
||||
僵尸实体,采用流向场移动 + 碰撞解决机制。
|
||||
|
||||
**移动系统**:
|
||||
1. 查询流向场获取移动方向
|
||||
2. 选择目标网格中心
|
||||
3. 检查格子预留/占用
|
||||
4. 移动并处理碰撞分离
|
||||
|
||||
### 3.4 Player
|
||||
|
||||
玩家实体,支持客户端预测和服务器校验。
|
||||
|
||||
**输入处理**:
|
||||
```java
|
||||
applyMovement(dx, dy, map) // 移动
|
||||
setAngle(aimX, aimY) // 瞄准方向
|
||||
fireWeapon(player, aimX, aimY) // 射击
|
||||
```
|
||||
|
||||
### 3.5 Bullet
|
||||
|
||||
子弹实体,支持两种模式:
|
||||
|
||||
| 模式 | 武器 | 特点 |
|
||||
|------|------|------|
|
||||
| 弹道 | 手枪/机枪/霰弹枪 | 直线飞行,有射程限制 |
|
||||
| 抛物线 | 手雷 | 弧线弹道,触地爆炸 |
|
||||
|
||||
### 3.6 Room
|
||||
|
||||
游戏房间,管理玩家列表和游戏状态。
|
||||
|
||||
**房间状态**:
|
||||
- 等待中:玩家加入、准备
|
||||
- 游戏中:所有玩家加载游戏
|
||||
- 结束:所有玩家离开或游戏结束
|
||||
|
||||
---
|
||||
|
||||
## 4. 通信协议
|
||||
|
||||
### 4.1 消息格式
|
||||
|
||||
所有消息使用 JSON 格式:
|
||||
```json
|
||||
{
|
||||
"type": "MESSAGE_TYPE",
|
||||
"data": { ... }
|
||||
}
|
||||
```
|
||||
|
||||
### 4.2 消息类型
|
||||
|
||||
#### 客户端 → 服务器
|
||||
|
||||
| 消息类型 | 说明 | 数据 |
|
||||
|---------|------|------|
|
||||
| `create_room` | 创建房间 | `{playerName}` |
|
||||
| `join_room` | 加入房间 | `{roomId, playerName}` |
|
||||
| `leave_room` | 离开房间 | - |
|
||||
| `ready` | 准备状态切换 | - |
|
||||
| `start_game` | 开始游戏 | - |
|
||||
| `player_input` | 玩家输入 | `{dx, dy, aimX, aimY, firing, weaponIndex, seq}` |
|
||||
|
||||
#### 服务器 → 客户端
|
||||
|
||||
| 消息类型 | 说明 | 数据 |
|
||||
|---------|------|------|
|
||||
| `room_list` | 房间列表 | `{rooms: [{id, hostName, playerCount}]}` |
|
||||
| `room_state` | 房间状态 | `{roomId, hostId, players: [...]}` |
|
||||
| `game_started` | 游戏开始 | `{playerId, mapData, players: [...]}` |
|
||||
| `game_state` | 游戏状态 | `{players, zombies, bullets, ...}` |
|
||||
| `error` | 错误消息 | `{message}` |
|
||||
|
||||
### 4.3 游戏状态同步
|
||||
|
||||
每帧广播的游戏状态包含:
|
||||
```java
|
||||
{
|
||||
"players": [{id, x, y, angle, health, weaponIndex}],
|
||||
"zombies": [{id, x, y, angle, health, isElite}],
|
||||
"bullets": [{id, x, y, z, angle, weapon, ownerId}],
|
||||
"zombieBullets": [...],
|
||||
"loots": [{id, x, y, type}],
|
||||
"explosions": [{x, y, radius}],
|
||||
"removedBullets": [id1, id2, ...],
|
||||
"gameTime": 120.5,
|
||||
"waveNumber": 3,
|
||||
"score": 1250
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. 武器系统
|
||||
|
||||
### 5.1 武器配置
|
||||
|
||||
| 武器 | 伤害 | 射速 | 弹药 | 特点 |
|
||||
|------|------|------|------|------|
|
||||
| 手枪 | 50 | 400ms | ∞ | 单发,精准 |
|
||||
| 机枪 | 15 | 100ms | 100 | 自动,略微散布 |
|
||||
| 霰弹枪 | 20×6 | 800ms | 20 | 6发弹丸,高散布 |
|
||||
| 手雷 | 120 | 1500ms | 10 | 可蓄力,范围伤害 |
|
||||
|
||||
### 5.2 手雷机制
|
||||
|
||||
- **蓄力**:长按射击键蓄力(最多2秒)
|
||||
- **射程**:蓄力0-100%对应3-15格距离
|
||||
- **弹道**:抛物线飞行
|
||||
- **爆炸**:范围3格伤害
|
||||
|
||||
---
|
||||
|
||||
## 6. 僵尸系统
|
||||
|
||||
### 6.1 僵尸类型
|
||||
|
||||
| 类型 | 生命值 | 速度 | 特殊能力 |
|
||||
|------|--------|------|----------|
|
||||
| 普通 | 100+ | 2.0+ | 近战攻击 |
|
||||
| 精英 | 800 | 1.5 | 远程射击 |
|
||||
|
||||
### 6.2 精英僵尸攻击
|
||||
|
||||
- **攻击范围**:8格
|
||||
- **攻击间隔**:2秒
|
||||
- **子弹伤害**:30
|
||||
- **子弹速度**:6
|
||||
|
||||
### 6.3 难度递增
|
||||
|
||||
每30秒波次增加:
|
||||
- 僵尸生命值 +20
|
||||
- 僵尸速度 +0.1
|
||||
- 生成间隔 -0.3秒(最低0.8秒)
|
||||
|
||||
---
|
||||
|
||||
## 7. 前端渲染
|
||||
|
||||
### 7.1 Three.js 场景
|
||||
|
||||
**摄像机**:
|
||||
- 透视摄像机,45度FOV
|
||||
- 偏移量 (0, 25, 18)
|
||||
- 平滑跟随玩家
|
||||
|
||||
**光照**:
|
||||
- 环境光:0x404060
|
||||
- 方向光:0xffeedd(带阴影)
|
||||
- 点光源:0xff4400
|
||||
|
||||
### 7.2 实体模型
|
||||
|
||||
| 实体 | 几何体 | 颜色 |
|
||||
|------|--------|------|
|
||||
| 玩家 | 圆柱体+球头 | 蓝/红/绿/黄 |
|
||||
| 普通僵尸 | 圆柱体+球头 | 0x446633 |
|
||||
| 精英僵尸 | 同上+发光球 | 0x882222 |
|
||||
| 墙体 | 立方体 | 0x555577 |
|
||||
|
||||
### 7.3 特效系统
|
||||
|
||||
- **爆炸**:白色闪光 + 多层球体 + 碎片
|
||||
- **枪口火焰**:黄色球体 + 光点
|
||||
- **击中效果**:红色球体 + 火花粒子
|
||||
- **掉落物**:旋转立方体
|
||||
|
||||
---
|
||||
|
||||
## 8. 客户端预测
|
||||
|
||||
### 8.1 预测机制
|
||||
|
||||
1. 客户端发送输入(含序列号)
|
||||
2. 客户端立即本地预测执行
|
||||
3. 服务器执行并返回 `lastProcessedSeq`
|
||||
4. 客户端回滚并重放未确认输入
|
||||
|
||||
### 8.2 输入结构
|
||||
|
||||
```javascript
|
||||
{
|
||||
dx: -1~1, // 移动方向 X
|
||||
dy: -1~1, // 移动方向 Y
|
||||
aimX: worldX, // 瞄准位置 X
|
||||
aimY: worldY, // 瞄准位置 Y
|
||||
firing: boolean, // 是否射击
|
||||
weaponIndex: 0-3, // 武器索引
|
||||
grenadeCharge: 0-1, // 手雷蓄力
|
||||
grenadeReleased: boolean,
|
||||
seq: number // 序列号
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 9. 常量配置
|
||||
|
||||
### 9.1 服务器常量 (Java)
|
||||
|
||||
```java
|
||||
GRID_SIZE = 32 // 地图尺寸
|
||||
PLAYER_SIZE = 0.8f // 玩家碰撞半径
|
||||
ZOMBIE_SIZE = 0.8f // 僵尸碰撞半径
|
||||
PLAYER_SPEED = 5.0f // 玩家移动速度
|
||||
ZOMBIE_BASE_SPEED = 2.0f // 僵尸基础速度
|
||||
TICK_RATE = 30 // 服务器Tick率
|
||||
```
|
||||
|
||||
### 9.2 客户端常量 (JavaScript)
|
||||
|
||||
与服务器保持一致的定义在 `constants.js`。
|
||||
|
||||
---
|
||||
|
||||
## 10. 启动与部署
|
||||
|
||||
### 10.1 服务器启动
|
||||
|
||||
```bash
|
||||
cd backend
|
||||
mvn package
|
||||
java -jar target/zombie-crisis-server-1.0.0.jar [port]
|
||||
# 默认端口 8080
|
||||
```
|
||||
|
||||
### 10.2 客户端启动
|
||||
|
||||
```bash
|
||||
cd frontend
|
||||
npm install
|
||||
npm run dev
|
||||
# 访问 http://localhost:5173
|
||||
```
|
||||
|
||||
### 10.3 依赖版本
|
||||
|
||||
- **Java**: 17+
|
||||
- **Maven**: 3.6+
|
||||
- **Node.js**: 16+
|
||||
- **Three.js**: (通过 npm)
|
||||
|
||||
---
|
||||
|
||||
## 11. 相关文档
|
||||
|
||||
- [流向场寻路系统技术文档](./FLOW_FIELD_NAVIGATION.md) - 僵尸AI寻路详细说明
|
||||
Reference in New Issue
Block a user