创建新工程
This commit is contained in:
711
.kiro/specs/godot-ai-town-game/design.md
Normal file
711
.kiro/specs/godot-ai-town-game/design.md
Normal file
@@ -0,0 +1,711 @@
|
||||
# 设计文档
|
||||
|
||||
## 概述
|
||||
|
||||
本项目是一款基于 Godot 4.x 引擎开发的 2D 多人在线 AI 小镇游戏,采用客户端-服务器架构。游戏的核心特性是持久化的多人世界,玩家创建的角色在玩家离线时会作为 NPC 继续存在于游戏世界中。游戏优先支持网页端(HTML5 导出),并预留移动端适配接口。
|
||||
|
||||
### 技术栈
|
||||
|
||||
- **游戏引擎**: Godot 4.x
|
||||
- **编程语言**: GDScript
|
||||
- **网络协议**: WebSocket (用于实时通信)
|
||||
- **数据格式**: JSON (用于数据序列化)
|
||||
- **导出平台**: HTML5 (Web), 预留 Android/iOS 支持
|
||||
- **后端服务**: 简单的 WebSocket 服务器 (可使用 Node.js + ws 或 Python + websockets)
|
||||
|
||||
## 架构
|
||||
|
||||
### 整体架构
|
||||
|
||||
游戏采用客户端-服务器架构,分为以下主要层次:
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────┐
|
||||
│ 客户端 (Godot HTML5) │
|
||||
├─────────────────────────────────────────┤
|
||||
│ 表现层 (UI/Rendering) │
|
||||
│ ├─ 场景渲染 │
|
||||
│ ├─ UI 界面 │
|
||||
│ └─ 动画系统 │
|
||||
├─────────────────────────────────────────┤
|
||||
│ 游戏逻辑层 │
|
||||
│ ├─ 角色控制器 │
|
||||
│ ├─ 对话系统 │
|
||||
│ ├─ 输入处理 │
|
||||
│ └─ 状态管理 │
|
||||
├─────────────────────────────────────────┤
|
||||
│ 网络层 │
|
||||
│ ├─ WebSocket 客户端 │
|
||||
│ ├─ 消息序列化/反序列化 │
|
||||
│ └─ 状态同步 │
|
||||
└─────────────────────────────────────────┘
|
||||
↕ WebSocket
|
||||
┌─────────────────────────────────────────┐
|
||||
│ 服务器 (WebSocket Server) │
|
||||
├─────────────────────────────────────────┤
|
||||
│ 连接管理 │
|
||||
│ ├─ 客户端连接池 │
|
||||
│ ├─ 身份验证 │
|
||||
│ └─ 心跳检测 │
|
||||
├─────────────────────────────────────────┤
|
||||
│ 游戏状态管理 │
|
||||
│ ├─ 世界状态 │
|
||||
│ ├─ 角色状态 │
|
||||
│ └─ 消息广播 │
|
||||
├─────────────────────────────────────────┤
|
||||
│ 数据持久化 │
|
||||
│ ├─ 角色数据存储 │
|
||||
│ ├─ 世界状态存储 │
|
||||
│ └─ JSON 文件系统 │
|
||||
└─────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 客户端架构
|
||||
|
||||
客户端采用 Godot 的场景树结构,主要节点组织如下:
|
||||
|
||||
```
|
||||
Main (Node)
|
||||
├─ NetworkManager (Node) - 网络连接管理
|
||||
├─ GameStateManager (Node) - 游戏状态管理
|
||||
├─ UILayer (CanvasLayer) - UI 层
|
||||
│ ├─ LoginScreen (Control) - 登录界面
|
||||
│ ├─ CharacterCreation (Control) - 角色创建界面
|
||||
│ ├─ HUD (Control) - 游戏内 UI
|
||||
│ └─ DialogueBox (Control) - 对话框
|
||||
└─ GameWorld (Node2D) - 游戏世界
|
||||
├─ TileMap (TileMap) - 场景地图
|
||||
├─ Characters (Node2D) - 角色容器
|
||||
│ ├─ PlayerCharacter (CharacterBody2D) - 本地玩家
|
||||
│ └─ RemoteCharacter (CharacterBody2D) - 其他角色
|
||||
└─ Camera (Camera2D) - 摄像机
|
||||
```
|
||||
|
||||
### 服务器架构
|
||||
|
||||
服务器采用事件驱动架构,主要模块包括:
|
||||
|
||||
- **ConnectionManager**: 管理 WebSocket 连接
|
||||
- **AuthenticationService**: 处理玩家身份验证
|
||||
- **WorldState**: 维护游戏世界状态
|
||||
- **CharacterManager**: 管理所有角色(在线/离线)
|
||||
- **MessageRouter**: 路由和广播消息
|
||||
- **PersistenceService**: 数据持久化服务
|
||||
|
||||
## 组件和接口
|
||||
|
||||
### 1. 网络管理器 (NetworkManager)
|
||||
|
||||
**职责**: 管理客户端与服务器的 WebSocket 连接
|
||||
|
||||
**接口**:
|
||||
```gdscript
|
||||
class_name NetworkManager extends Node
|
||||
|
||||
signal connected_to_server()
|
||||
signal disconnected_from_server()
|
||||
signal connection_error(error: String)
|
||||
signal message_received(message: Dictionary)
|
||||
|
||||
func connect_to_server(url: String) -> void
|
||||
func disconnect_from_server() -> void
|
||||
func send_message(message: Dictionary) -> void
|
||||
func is_connected() -> bool
|
||||
```
|
||||
|
||||
**消息协议**:
|
||||
所有消息使用 JSON 格式,包含以下字段:
|
||||
```json
|
||||
{
|
||||
"type": "message_type",
|
||||
"data": {},
|
||||
"timestamp": 1234567890
|
||||
}
|
||||
```
|
||||
|
||||
消息类型包括:
|
||||
- `auth_request`: 身份验证请求
|
||||
- `auth_response`: 身份验证响应
|
||||
- `character_create`: 创建角色
|
||||
- `character_move`: 角色移动
|
||||
- `character_state`: 角色状态更新
|
||||
- `dialogue_send`: 发送对话
|
||||
- `world_state`: 世界状态同步
|
||||
|
||||
### 2. 角色控制器 (CharacterController)
|
||||
|
||||
**职责**: 处理角色的移动、动画和状态
|
||||
|
||||
**接口**:
|
||||
```gdscript
|
||||
class_name CharacterController extends CharacterBody2D
|
||||
|
||||
var character_id: String
|
||||
var character_name: String
|
||||
var is_online: bool
|
||||
var move_speed: float = 200.0
|
||||
|
||||
func move_to(direction: Vector2) -> void
|
||||
func set_position_smooth(target_pos: Vector2) -> void
|
||||
func play_animation(anim_name: String) -> void
|
||||
func set_online_status(online: bool) -> void
|
||||
```
|
||||
|
||||
**状态**:
|
||||
- `idle`: 静止状态
|
||||
- `walking`: 行走状态
|
||||
- `talking`: 对话状态
|
||||
|
||||
### 3. 对话系统 (DialogueSystem)
|
||||
|
||||
**职责**: 管理角色之间的对话交互
|
||||
|
||||
**接口**:
|
||||
```gdscript
|
||||
class_name DialogueSystem extends Node
|
||||
|
||||
signal dialogue_started(character_id: String)
|
||||
signal dialogue_ended()
|
||||
signal message_received(sender: String, message: String)
|
||||
|
||||
func start_dialogue(target_character_id: String) -> void
|
||||
func send_message(message: String) -> void
|
||||
func end_dialogue() -> void
|
||||
func show_bubble(character_id: String, message: String, duration: float) -> void
|
||||
```
|
||||
|
||||
**对话模式**:
|
||||
- **直接对话**: 玩家与另一个角色一对一对话
|
||||
- **气泡对话**: 附近角色的对话以气泡形式显示
|
||||
|
||||
### 4. 输入处理器 (InputHandler)
|
||||
|
||||
**职责**: 处理多平台输入(键盘、触摸、虚拟摇杆)
|
||||
|
||||
**接口**:
|
||||
```gdscript
|
||||
class_name InputHandler extends Node
|
||||
|
||||
signal move_input(direction: Vector2)
|
||||
signal interact_input()
|
||||
signal ui_input(action: String)
|
||||
|
||||
func get_move_direction() -> Vector2
|
||||
func is_interact_pressed() -> bool
|
||||
func setup_virtual_controls() -> void
|
||||
```
|
||||
|
||||
**输入映射**:
|
||||
- **桌面端**: WASD/方向键移动,E 键交互
|
||||
- **移动端**: 虚拟摇杆移动,交互按钮
|
||||
|
||||
### 5. 游戏状态管理器 (GameStateManager)
|
||||
|
||||
**职责**: 管理游戏的全局状态和场景切换
|
||||
|
||||
**接口**:
|
||||
```gdscript
|
||||
class_name GameStateManager extends Node
|
||||
|
||||
enum GameState {
|
||||
LOGIN,
|
||||
CHARACTER_CREATION,
|
||||
IN_GAME,
|
||||
DISCONNECTED
|
||||
}
|
||||
|
||||
var current_state: GameState
|
||||
var player_data: Dictionary
|
||||
|
||||
func change_state(new_state: GameState) -> void
|
||||
func save_player_data() -> void
|
||||
func load_player_data() -> Dictionary
|
||||
```
|
||||
|
||||
### 6. 世界管理器 (WorldManager)
|
||||
|
||||
**职责**: 管理游戏世界中的所有角色和对象
|
||||
|
||||
**接口**:
|
||||
```gdscript
|
||||
class_name WorldManager extends Node
|
||||
|
||||
var characters: Dictionary = {} # character_id -> CharacterController
|
||||
|
||||
func spawn_character(character_data: Dictionary) -> void
|
||||
func remove_character(character_id: String) -> void
|
||||
func update_character_state(character_id: String, state: Dictionary) -> void
|
||||
func get_nearby_characters(position: Vector2, radius: float) -> Array
|
||||
```
|
||||
|
||||
## 数据模型
|
||||
|
||||
### 角色数据 (Character Data)
|
||||
|
||||
```gdscript
|
||||
{
|
||||
"id": "unique_character_id",
|
||||
"name": "角色名称",
|
||||
"owner_id": "player_account_id",
|
||||
"position": {
|
||||
"x": 100.0,
|
||||
"y": 200.0
|
||||
},
|
||||
"is_online": true,
|
||||
"appearance": {
|
||||
"sprite": "character_01",
|
||||
"color": "#FFFFFF"
|
||||
},
|
||||
"created_at": 1234567890,
|
||||
"last_seen": 1234567890
|
||||
}
|
||||
```
|
||||
|
||||
### 世界状态 (World State)
|
||||
|
||||
```gdscript
|
||||
{
|
||||
"scene_id": "datawhale_office",
|
||||
"characters": [
|
||||
// 角色数据数组
|
||||
],
|
||||
"timestamp": 1234567890
|
||||
}
|
||||
```
|
||||
|
||||
### 对话消息 (Dialogue Message)
|
||||
|
||||
```gdscript
|
||||
{
|
||||
"sender_id": "character_id",
|
||||
"receiver_id": "character_id", // 可选,为空表示广播
|
||||
"message": "对话内容",
|
||||
"timestamp": 1234567890
|
||||
}
|
||||
```
|
||||
|
||||
## 正确性属性
|
||||
|
||||
*属性是一个特征或行为,应该在系统的所有有效执行中保持为真——本质上是关于系统应该做什么的正式陈述。属性作为人类可读规范和机器可验证正确性保证之间的桥梁。*
|
||||
|
||||
### 属性 1: 角色创建唯一性
|
||||
*对于任意*两个成功创建的角色,它们的角色 ID 应该是唯一的,不会发生冲突
|
||||
**验证需求: 1.5**
|
||||
|
||||
### 属性 2: 角色移动能力
|
||||
*对于任意*创建或加载到场景的角色,该角色应该具有基础移动能力(可以响应移动指令)
|
||||
**验证需求: 2.1**
|
||||
|
||||
### 属性 3: 位置更新同步
|
||||
*对于任意*角色的移动操作,执行移动后角色的位置坐标应该被更新,并且该更新应该同步到所有连接的客户端
|
||||
**验证需求: 2.2**
|
||||
|
||||
### 属性 4: 碰撞检测
|
||||
*对于任意*角色和障碍物,当角色尝试移动到障碍物位置时,系统应该阻止该移动,角色位置保持不变
|
||||
**验证需求: 2.4**
|
||||
|
||||
### 属性 5: 并发移动独立性
|
||||
*对于任意*多个同时移动的角色,每个角色的移动应该独立处理,一个角色的移动不应影响其他角色的移动逻辑
|
||||
**验证需求: 2.5**
|
||||
|
||||
### 属性 6: 对话触发
|
||||
*对于任意*两个角色,当一个角色接近另一个角色并触发交互时,系统应该显示对话界面
|
||||
**验证需求: 3.1**
|
||||
|
||||
### 属性 7: 消息传递完整性
|
||||
*对于任意*对话消息,当玩家发送消息时,该消息应该被传递给接收方,并在发送方和接收方的界面上都正确显示
|
||||
**验证需求: 3.3**
|
||||
|
||||
### 属性 8: 对话状态恢复
|
||||
*对于任意*进行中的对话,当对话结束时,系统应该关闭对话界面并将游戏状态恢复到对话前的正常状态
|
||||
**验证需求: 3.4**
|
||||
|
||||
### 属性 9: 对话可见性
|
||||
*对于任意*两个角色之间的对话,附近的其他角色应该能够看到对话气泡显示在对话角色上方
|
||||
**验证需求: 3.5**
|
||||
|
||||
### 属性 10: 场景碰撞检测
|
||||
*对于任意*玩家角色和场景元素(如桌椅、墙壁),当玩家尝试移动到场景元素位置时,系统应该正确处理碰撞并阻止穿透
|
||||
**验证需求: 4.5**
|
||||
|
||||
### 属性 11: 键盘输入响应
|
||||
*对于任意*有效的键盘移动输入(方向键或 WASD),系统应该将玩家角色移动到相应方向,并将移动数据同步到服务器
|
||||
**验证需求: 5.1**
|
||||
|
||||
### 属性 12: 触摸输入响应
|
||||
*对于任意*有效的触摸移动输入(虚拟摇杆),系统应该将玩家角色移动到指定方向,并将移动数据同步到服务器
|
||||
**验证需求: 5.2**
|
||||
|
||||
### 属性 13: 移动动画同步
|
||||
*对于任意*角色的移动操作,系统应该播放相应的移动动画,并在所有客户端同步显示该动画
|
||||
**验证需求: 5.5**
|
||||
|
||||
### 属性 14: 响应式布局适配
|
||||
*对于任意*不同分辨率的浏览器窗口,游戏画面应该自动调整尺寸以适应窗口大小,保持可玩性
|
||||
**验证需求: 6.3, 7.2**
|
||||
|
||||
### 属性 15: 窗口动态调整
|
||||
*对于任意*浏览器窗口大小的改变,游戏系统应该动态调整游戏画面比例,保持界面元素的可访问性
|
||||
**验证需求: 6.4**
|
||||
|
||||
### 属性 16: 数据序列化往返
|
||||
*对于任意*游戏数据对象,序列化为 JSON 后再反序列化应该得到等价的对象(往返一致性)
|
||||
**验证需求: 7.3, 9.5**
|
||||
|
||||
### 属性 17: 设备类型检测
|
||||
*对于任意*设备类型(桌面或移动),系统应该正确检测设备类型并应用相应的控制方案(键盘或触摸)
|
||||
**验证需求: 7.5**
|
||||
|
||||
### 属性 18: 角色数据持久化
|
||||
*对于任意*创建的角色,角色数据应该被保存到服务器,后续登录时应该能够恢复相同的角色数据
|
||||
**验证需求: 9.1, 9.2**
|
||||
|
||||
### 属性 19: 状态同步
|
||||
*对于任意*角色位置或状态的改变,系统应该将更新同步到服务器,确保数据一致性
|
||||
**验证需求: 9.4**
|
||||
|
||||
### 属性 20: 移动设备 UI 适配
|
||||
*对于任意*在移动设备上运行的游戏,UI 元素大小应该调整以适应触摸操作(按钮足够大,间距合理)
|
||||
**验证需求: 10.4**
|
||||
|
||||
### 属性 21: 错误提示显示
|
||||
*对于任意*操作失败的情况,系统应该显示明确的错误提示信息,告知用户失败原因
|
||||
**验证需求: 10.5**
|
||||
|
||||
### 属性 22: 在线角色显示
|
||||
*对于任意*玩家进入游戏场景时,系统应该显示所有当前在线玩家的角色
|
||||
**验证需求: 11.1**
|
||||
|
||||
### 属性 23: 离线角色显示
|
||||
*对于任意*玩家进入游戏场景时,系统应该显示所有离线玩家的角色作为 NPC
|
||||
**验证需求: 11.2**
|
||||
|
||||
### 属性 24: 上线状态切换
|
||||
*对于任意*玩家上线事件,系统应该在场景中显示该玩家的角色,并将其标记为在线状态
|
||||
**验证需求: 11.3**
|
||||
|
||||
### 属性 25: 下线状态切换
|
||||
*对于任意*玩家下线事件,系统应该将该玩家的角色转换为离线 NPC 状态,但角色继续存在于场景中
|
||||
**验证需求: 11.4**
|
||||
|
||||
### 属性 26: 角色状态视觉区分
|
||||
*对于任意*显示的角色,系统应该通过视觉标识(如颜色、图标)区分在线玩家和离线角色
|
||||
**验证需求: 11.5**
|
||||
|
||||
### 属性 27: 网络连接建立
|
||||
*对于任意*玩家登录操作,系统应该尝试建立与服务器的网络连接
|
||||
**验证需求: 12.1**
|
||||
|
||||
### 属性 28: 断线重连
|
||||
*对于任意*网络连接中断事件,系统应该显示断线提示并自动尝试重新连接到服务器
|
||||
**验证需求: 12.3**
|
||||
|
||||
### 属性 29: 操作确认
|
||||
*对于任意*玩家执行的操作,系统应该将操作数据发送到服务器并等待接收确认响应
|
||||
**验证需求: 12.4**
|
||||
|
||||
### 属性 30: 服务器更新同步
|
||||
*对于任意*服务器推送的更新消息,客户端应该实时更新本地游戏状态以反映服务器的变化
|
||||
**验证需求: 12.5**
|
||||
|
||||
## 错误处理
|
||||
|
||||
### 网络错误处理
|
||||
|
||||
**连接失败**:
|
||||
- 显示友好的错误提示
|
||||
- 提供重试按钮
|
||||
- 记录错误日志用于调试
|
||||
|
||||
**连接中断**:
|
||||
- 自动尝试重连(最多 3 次)
|
||||
- 显示断线状态指示器
|
||||
- 缓存未发送的操作,重连后重新发送
|
||||
|
||||
**消息发送失败**:
|
||||
- 重试机制(指数退避)
|
||||
- 超时后通知用户
|
||||
- 保持本地状态一致性
|
||||
|
||||
### 数据验证错误
|
||||
|
||||
**角色创建验证**:
|
||||
- 名称长度限制(2-20 字符)
|
||||
- 禁止特殊字符和空白字符
|
||||
- 检查名称唯一性
|
||||
|
||||
**输入验证**:
|
||||
- 对话消息长度限制(1-500 字符)
|
||||
- 过滤恶意输入
|
||||
- 防止注入攻击
|
||||
|
||||
### 状态不一致处理
|
||||
|
||||
**客户端-服务器状态不一致**:
|
||||
- 定期同步状态(每 5 秒)
|
||||
- 服务器状态为权威状态
|
||||
- 客户端预测 + 服务器校正
|
||||
|
||||
**角色位置冲突**:
|
||||
- 服务器检测位置冲突
|
||||
- 强制回退到有效位置
|
||||
- 通知客户端更新
|
||||
|
||||
## 测试策略
|
||||
|
||||
### 单元测试
|
||||
|
||||
使用 Godot 的 GUT (Godot Unit Test) 框架进行单元测试。
|
||||
|
||||
**测试覆盖范围**:
|
||||
- 数据模型的序列化/反序列化
|
||||
- 输入处理逻辑
|
||||
- 状态管理器的状态转换
|
||||
- 消息协议的编码/解码
|
||||
|
||||
**示例测试**:
|
||||
```gdscript
|
||||
# test_character_data.gd
|
||||
extends GutTest
|
||||
|
||||
func test_character_serialization():
|
||||
var character = {
|
||||
"id": "test_123",
|
||||
"name": "测试角色",
|
||||
"position": {"x": 100.0, "y": 200.0}
|
||||
}
|
||||
var json_str = JSON.stringify(character)
|
||||
var parsed = JSON.parse_string(json_str)
|
||||
assert_eq(parsed["id"], character["id"])
|
||||
assert_eq(parsed["name"], character["name"])
|
||||
```
|
||||
|
||||
### 属性基础测试
|
||||
|
||||
使用 GDScript 实现简单的属性测试框架,或使用社区提供的属性测试库。
|
||||
|
||||
**测试库**: 自定义实现或使用 Godot 社区的属性测试工具
|
||||
|
||||
**测试配置**: 每个属性测试至少运行 100 次迭代
|
||||
|
||||
**测试标注格式**: `# Feature: godot-ai-town-game, Property X: [属性描述]`
|
||||
|
||||
**属性测试覆盖**:
|
||||
|
||||
1. **属性 1: 角色创建唯一性**
|
||||
- 生成多个随机角色
|
||||
- 验证所有角色 ID 唯一
|
||||
|
||||
2. **属性 2: 角色移动能力**
|
||||
- 生成随机角色
|
||||
- 验证角色可以响应移动指令
|
||||
|
||||
3. **属性 3: 位置更新同步**
|
||||
- 生成随机移动操作
|
||||
- 验证位置正确更新
|
||||
|
||||
4. **属性 4: 碰撞检测**
|
||||
- 生成随机障碍物和移动路径
|
||||
- 验证碰撞正确阻止移动
|
||||
|
||||
5. **属性 16: 数据序列化往返**
|
||||
- 生成随机游戏数据对象
|
||||
- 验证序列化后反序列化得到等价对象
|
||||
|
||||
6. **属性 18: 角色数据持久化**
|
||||
- 生成随机角色数据
|
||||
- 验证保存后加载得到相同数据
|
||||
|
||||
**示例属性测试**:
|
||||
```gdscript
|
||||
# test_properties.gd
|
||||
extends GutTest
|
||||
|
||||
# Feature: godot-ai-town-game, Property 16: 数据序列化往返
|
||||
func test_property_serialization_roundtrip():
|
||||
for i in range(100):
|
||||
var random_data = generate_random_character_data()
|
||||
var serialized = JSON.stringify(random_data)
|
||||
var deserialized = JSON.parse_string(serialized)
|
||||
assert_eq_deep(deserialized, random_data,
|
||||
"序列化往返应该保持数据一致性")
|
||||
|
||||
func generate_random_character_data() -> Dictionary:
|
||||
return {
|
||||
"id": "char_" + str(randi()),
|
||||
"name": "角色" + str(randi() % 1000),
|
||||
"position": {
|
||||
"x": randf_range(0, 1000),
|
||||
"y": randf_range(0, 1000)
|
||||
},
|
||||
"is_online": randi() % 2 == 0
|
||||
}
|
||||
```
|
||||
|
||||
### 集成测试
|
||||
|
||||
**场景加载测试**:
|
||||
- 测试 Datawhale 办公室场景正确加载
|
||||
- 验证所有必需的节点存在
|
||||
- 检查碰撞层设置正确
|
||||
|
||||
**网络集成测试**:
|
||||
- 启动测试服务器
|
||||
- 测试客户端连接流程
|
||||
- 验证消息收发正确
|
||||
|
||||
**多客户端测试**:
|
||||
- 模拟多个客户端连接
|
||||
- 测试状态同步
|
||||
- 验证角色互动
|
||||
|
||||
### 性能测试
|
||||
|
||||
**帧率测试**:
|
||||
- 测试不同数量角色时的帧率
|
||||
- 目标: 30+ FPS (10 个角色)
|
||||
|
||||
**网络延迟测试**:
|
||||
- 测试不同网络条件下的响应时间
|
||||
- 目标: 操作响应 < 200ms
|
||||
|
||||
**内存使用测试**:
|
||||
- 监控长时间运行的内存使用
|
||||
- 检测内存泄漏
|
||||
|
||||
### 跨平台测试
|
||||
|
||||
**浏览器兼容性**:
|
||||
- Chrome (最新版本)
|
||||
- Firefox (最新版本)
|
||||
- Safari (最新版本)
|
||||
- Edge (最新版本)
|
||||
|
||||
**设备测试**:
|
||||
- 桌面 (1920x1080, 1366x768)
|
||||
- 平板 (iPad, Android 平板)
|
||||
- 手机 (iOS, Android)
|
||||
|
||||
**输入测试**:
|
||||
- 键盘输入
|
||||
- 鼠标输入
|
||||
- 触摸输入
|
||||
- 虚拟摇杆
|
||||
|
||||
## 场景设计
|
||||
|
||||
### Datawhale 办公室场景
|
||||
|
||||
**场景尺寸**: 2000x1500 像素
|
||||
|
||||
**主要区域**:
|
||||
1. **入口区域**: 门、欢迎标识
|
||||
2. **工作区**: 办公桌、电脑、椅子
|
||||
3. **会议区**: 会议桌、白板
|
||||
4. **休息区**: 沙发、茶水间
|
||||
5. **展示区**: Datawhale logo、成就墙
|
||||
|
||||
**碰撞层设置**:
|
||||
- Layer 1: 墙壁和固定障碍物
|
||||
- Layer 2: 家具(可选择性碰撞)
|
||||
- Layer 3: 角色
|
||||
- Layer 4: 交互区域
|
||||
|
||||
**视觉风格**:
|
||||
- 2D 俯视角(45度等距视角可选)
|
||||
- 简洁的像素艺术或矢量风格
|
||||
- Datawhale 品牌色: 蓝色系为主
|
||||
|
||||
### 资源需求
|
||||
|
||||
**图像资源**:
|
||||
- 角色精灵图(4 方向行走动画)
|
||||
- 场景瓦片集(地板、墙壁、家具)
|
||||
- UI 元素(按钮、对话框、图标)
|
||||
- Datawhale logo 和品牌元素
|
||||
|
||||
**音频资源** (可选):
|
||||
- 背景音乐
|
||||
- 脚步声
|
||||
- UI 交互音效
|
||||
- 对话提示音
|
||||
|
||||
## 部署和构建
|
||||
|
||||
### Web 导出配置
|
||||
|
||||
**Godot 导出设置**:
|
||||
- 目标平台: HTML5
|
||||
- 导出模板: Godot 4.x Web
|
||||
- 线程支持: 启用(如果浏览器支持)
|
||||
- VRAM 压缩: 启用
|
||||
|
||||
**Web 服务器要求**:
|
||||
- 支持 WebSocket
|
||||
- HTTPS (用于生产环境)
|
||||
- CORS 配置正确
|
||||
|
||||
### 服务器部署
|
||||
|
||||
**推荐部署方案**:
|
||||
- 静态文件: Nginx/Apache 或 CDN
|
||||
- WebSocket 服务器: Node.js 或 Python
|
||||
- 数据存储: JSON 文件或轻量级数据库
|
||||
|
||||
**环境变量**:
|
||||
- `SERVER_URL`: WebSocket 服务器地址
|
||||
- `PORT`: 服务器端口
|
||||
- `DATA_DIR`: 数据存储目录
|
||||
|
||||
### 移动端预留
|
||||
|
||||
**响应式设计**:
|
||||
- 使用 Godot 的 Viewport 缩放
|
||||
- UI 元素使用相对定位
|
||||
- 字体大小动态调整
|
||||
|
||||
**输入抽象**:
|
||||
- 统一的输入接口
|
||||
- 自动检测输入设备
|
||||
- 虚拟控制器自动显示/隐藏
|
||||
|
||||
**跨端数据同步**:
|
||||
- 统一的数据格式
|
||||
- 服务器端状态管理
|
||||
- 客户端无状态设计
|
||||
|
||||
## 扩展性考虑
|
||||
|
||||
### 未来功能预留
|
||||
|
||||
**AI 对话系统**:
|
||||
- 预留 AI 接口(如 OpenAI API)
|
||||
- 对话历史记录
|
||||
- 角色个性设置
|
||||
|
||||
**更多场景**:
|
||||
- 场景管理器支持多场景
|
||||
- 场景切换机制
|
||||
- 场景间传送
|
||||
|
||||
**社交功能**:
|
||||
- 好友系统
|
||||
- 私聊功能
|
||||
- 角色关系网络
|
||||
|
||||
### 性能优化预留
|
||||
|
||||
**对象池**:
|
||||
- 角色对象复用
|
||||
- UI 元素复用
|
||||
- 减少内存分配
|
||||
|
||||
**网络优化**:
|
||||
- 消息批处理
|
||||
- 状态差异同步
|
||||
- 区域兴趣管理(AOI)
|
||||
|
||||
**渲染优化**:
|
||||
- 视锥剔除
|
||||
- LOD (细节层次)
|
||||
- 纹理压缩
|
||||
166
.kiro/specs/godot-ai-town-game/requirements.md
Normal file
166
.kiro/specs/godot-ai-town-game/requirements.md
Normal file
@@ -0,0 +1,166 @@
|
||||
# 需求文档
|
||||
|
||||
## 简介
|
||||
|
||||
本项目旨在使用 Godot 引擎开发一款 2D 多人在线 AI 小镇网页版游戏,核心功能是让现实用户创建自己的角色并在 Datawhale 办公室场景中与其他玩家角色实现自由交流和对话交互。当玩家在线时,角色由玩家操控;当玩家离线时,角色作为 NPC 继续存在于游戏世界中。游戏需优先支持网页端运行,并预留手机端适配接口,为后续跨端联动功能做准备。
|
||||
|
||||
## 术语表
|
||||
|
||||
- **游戏系统 (Game System)**: 指整个 Godot 游戏应用程序及其所有组件
|
||||
- **角色 (Character)**: 游戏中的可交互实体,可以是在线玩家操控或离线 NPC 状态
|
||||
- **在线角色 (Online Character)**: 当前由真实玩家操控的角色
|
||||
- **离线角色 (Offline Character)**: 玩家离线时,其角色作为 NPC 继续存在于游戏世界中
|
||||
- **对话系统 (Dialogue System)**: 处理角色之间文本对话交互的系统组件
|
||||
- **场景 (Scene)**: 游戏中的 2D 环境,本项目首个场景为 Datawhale 办公室
|
||||
- **Datawhale**: AI 组织名称,游戏场景的主题背景
|
||||
- **网页版 (Web Version)**: 通过浏览器运行的游戏版本
|
||||
- **跨端联动 (Cross-Platform Sync)**: 手机端与电脑端之间的数据互通和协同操控功能
|
||||
- **移动端适配 (Mobile Adaptation)**: 针对手机设备的界面和操控优化
|
||||
- **多人在线 (Multiplayer Online)**: 支持多个玩家同时在线并在共享游戏世界中交互
|
||||
- **持久化世界 (Persistent World)**: 游戏世界状态持续存在,不因玩家离线而消失
|
||||
|
||||
## 需求
|
||||
|
||||
### 需求 1
|
||||
|
||||
**用户故事:** 作为新玩家,我希望能够创建自己的角色,以便在游戏世界中与其他玩家交互。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 新玩家首次进入游戏 THEN 游戏系统 SHALL 显示角色创建界面,包含角色名称输入字段
|
||||
2. WHEN 玩家提交有效的角色名称 THEN 游戏系统 SHALL 创建新的角色实例并将其绑定到该玩家账户
|
||||
3. WHEN 玩家提交空白或仅包含空格的角色名称 THEN 游戏系统 SHALL 拒绝创建并显示错误提示信息
|
||||
4. WHEN 角色创建成功 THEN 游戏系统 SHALL 在场景中的默认位置生成该角色的可视化表示
|
||||
5. WHEN 角色创建完成 THEN 游戏系统 SHALL 为该角色分配唯一标识符并保存到服务器
|
||||
|
||||
### 需求 2
|
||||
|
||||
**用户故事:** 作为游戏玩家,我希望所有角色(包括在线和离线)能够在场景中移动,以便游戏世界更加生动和真实。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 角色被创建或加载到场景 THEN 游戏系统 SHALL 为该角色启用基础移动能力
|
||||
2. WHEN 角色执行移动操作 THEN 游戏系统 SHALL 更新角色的位置坐标并在所有客户端同步显示
|
||||
3. WHEN 角色移动到场景边界 THEN 游戏系统 SHALL 阻止角色超出场景可行走区域
|
||||
4. WHEN 角色遇到障碍物(如墙壁、家具)THEN 游戏系统 SHALL 阻止角色穿过障碍物
|
||||
5. WHEN 多个角色同时移动 THEN 游戏系统 SHALL 独立处理每个角色的移动逻辑并在所有客户端保持同步
|
||||
|
||||
### 需求 3
|
||||
|
||||
**用户故事:** 作为游戏玩家,我希望能够与其他角色进行对话交互,以便体验社交和交流功能。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 玩家角色接近另一个角色并触发交互 THEN 游戏系统 SHALL 显示对话界面
|
||||
2. WHEN 对话界面显示 THEN 游戏系统 SHALL 展示对方角色的文本对话内容
|
||||
3. WHEN 玩家输入对话内容并发送 THEN 游戏系统 SHALL 将消息传递给对方并在双方界面显示
|
||||
4. WHEN 对话结束 THEN 游戏系统 SHALL 关闭对话界面并恢复正常游戏状态
|
||||
5. WHEN 玩家观察其他角色之间的对话 THEN 游戏系统 SHALL 在附近角色上方显示对话气泡
|
||||
|
||||
### 需求 4
|
||||
|
||||
**用户故事:** 作为游戏玩家,我希望在 Datawhale 办公室场景中游玩,以便体验具有品牌特色的游戏环境。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 游戏启动 THEN 游戏系统 SHALL 加载 Datawhale 办公室场景作为默认场景
|
||||
2. WHEN Datawhale 办公室场景加载 THEN 游戏系统 SHALL 显示办公室基础布局元素,包括桌椅、门窗和过道
|
||||
3. WHEN 场景渲染 THEN 游戏系统 SHALL 展示 Datawhale 品牌标识,包括 logo 和组织相关标志性元素
|
||||
4. WHEN 场景渲染 THEN 游戏系统 SHALL 应用 Datawhale 品牌色彩方案到场景视觉元素中
|
||||
5. WHEN 玩家在场景中移动 THEN 游戏系统 SHALL 正确处理与办公室元素的碰撞检测
|
||||
|
||||
### 需求 5
|
||||
|
||||
**用户故事:** 作为在线玩家,我希望能够操控自己的角色在场景中移动,以便探索游戏世界和与其他角色互动。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 玩家使用键盘方向键或 WASD 键 THEN 游戏系统 SHALL 移动玩家角色到相应方向并同步到服务器
|
||||
2. WHEN 玩家在触摸设备上使用虚拟摇杆或触摸控制 THEN 游戏系统 SHALL 移动玩家角色到指定方向并同步到服务器
|
||||
3. WHEN 玩家角色移动到场景边界 THEN 游戏系统 SHALL 阻止角色超出可行走区域
|
||||
4. WHEN 玩家角色与障碍物碰撞 THEN 游戏系统 SHALL 阻止角色穿过障碍物
|
||||
5. WHEN 玩家角色移动 THEN 游戏系统 SHALL 播放相应的移动动画并在所有客户端显示
|
||||
|
||||
### 需求 6
|
||||
|
||||
**用户故事:** 作为网页用户,我希望能够在浏览器中直接运行游戏,以便无需安装额外软件即可游玩。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 用户在主流浏览器(Chrome、Firefox、Safari、Edge)中访问游戏网页 THEN 游戏系统 SHALL 成功加载并运行
|
||||
2. WHEN 游戏在网页中加载 THEN 游戏系统 SHALL 在 10 秒内完成初始化并显示游戏界面
|
||||
3. WHEN 游戏在不同分辨率的浏览器窗口中运行 THEN 游戏系统 SHALL 自动调整画面尺寸以适应窗口大小
|
||||
4. WHEN 用户调整浏览器窗口大小 THEN 游戏系统 SHALL 动态调整游戏画面比例保持可玩性
|
||||
5. WHEN 游戏在网页中运行 THEN 游戏系统 SHALL 保持稳定的帧率(至少 30 FPS)
|
||||
|
||||
### 需求 7
|
||||
|
||||
**用户故事:** 作为项目开发者,我希望游戏架构预留手机端适配接口,以便后续能够实现跨端联动功能。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 游戏架构设计完成 THEN 游戏系统 SHALL 包含独立的输入处理模块以支持多种输入方式
|
||||
2. WHEN 游戏 UI 设计完成 THEN 游戏系统 SHALL 使用响应式布局以适应不同屏幕尺寸
|
||||
3. WHEN 游戏数据结构设计完成 THEN 游戏系统 SHALL 支持数据序列化和反序列化以便跨端数据同步
|
||||
4. WHEN 游戏网络模块设计完成 THEN 游戏系统 SHALL 预留网络通信接口以支持未来的跨端数据传输
|
||||
5. WHEN 游戏在移动设备浏览器中运行 THEN 游戏系统 SHALL 检测设备类型并应用相应的控制方案
|
||||
|
||||
### 需求 8
|
||||
|
||||
**用户故事:** 作为项目维护者,我希望项目代码结构清晰且文档完善,以便后续能够轻松扩展功能。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 项目文件组织完成 THEN 游戏系统 SHALL 按照功能模块划分目录结构(场景、角色、UI、数据等)
|
||||
2. WHEN 代码编写完成 THEN 游戏系统 SHALL 为关键函数和类添加注释说明其用途和参数
|
||||
3. WHEN 项目交付 THEN 游戏系统 SHALL 包含 README 文档说明项目结构、运行方法和扩展指南
|
||||
4. WHEN 新功能需要添加 THEN 游戏系统 SHALL 提供清晰的模块接口以便集成新组件
|
||||
5. WHEN 资源文件添加到项目 THEN 游戏系统 SHALL 按照资源类型(图像、音频、场景)组织文件路径
|
||||
|
||||
### 需求 9
|
||||
|
||||
**用户故事:** 作为游戏玩家,我希望我的角色和游戏进度能够被持久化保存,以便下次登录时能够继续游戏。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 玩家创建新角色 THEN 游戏系统 SHALL 将角色数据保存到服务器
|
||||
2. WHEN 玩家重新登录游戏 THEN 游戏系统 SHALL 从服务器读取并恢复该玩家的角色数据
|
||||
3. WHEN 游戏数据保存失败 THEN 游戏系统 SHALL 显示错误提示并保持当前游戏状态
|
||||
4. WHEN 玩家角色位置或状态改变 THEN 游戏系统 SHALL 定期将更新同步到服务器
|
||||
5. WHEN 游戏数据序列化 THEN 游戏系统 SHALL 使用 JSON 格式以便跨平台兼容
|
||||
|
||||
### 需求 10
|
||||
|
||||
**用户故事:** 作为游戏玩家,我希望游戏具有友好的用户界面,以便我能够轻松理解和使用各项功能。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 游戏启动 THEN 游戏系统 SHALL 显示登录界面,包含登录和创建角色选项
|
||||
2. WHEN 玩家与 UI 元素交互 THEN 游戏系统 SHALL 提供视觉反馈(如按钮高亮、点击效果)
|
||||
3. WHEN 游戏显示文本信息 THEN 游戏系统 SHALL 使用清晰可读的字体和适当的字号
|
||||
4. WHEN 游戏在移动设备上运行 THEN 游戏系统 SHALL 调整 UI 元素大小以适应触摸操作
|
||||
5. WHEN 玩家执行操作失败 THEN 游戏系统 SHALL 显示明确的错误提示信息
|
||||
|
||||
### 需求 11
|
||||
|
||||
**用户故事:** 作为游戏玩家,我希望能够看到其他在线玩家和离线角色,以便了解游戏世界中的其他参与者。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 玩家进入游戏场景 THEN 游戏系统 SHALL 显示所有当前在线玩家的角色
|
||||
2. WHEN 玩家进入游戏场景 THEN 游戏系统 SHALL 显示所有离线玩家的角色作为 NPC
|
||||
3. WHEN 其他玩家上线 THEN 游戏系统 SHALL 在场景中显示该玩家的角色并标记为在线状态
|
||||
4. WHEN 其他玩家下线 THEN 游戏系统 SHALL 将该玩家的角色转换为离线 NPC 状态
|
||||
5. WHEN 显示角色 THEN 游戏系统 SHALL 通过视觉标识区分在线玩家和离线角色
|
||||
|
||||
### 需求 12
|
||||
|
||||
**用户故事:** 作为游戏玩家,我希望能够与服务器保持连接,以便实现实时多人交互。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 玩家登录游戏 THEN 游戏系统 SHALL 建立与服务器的网络连接
|
||||
2. WHEN 网络连接建立 THEN 游戏系统 SHALL 在 5 秒内完成身份验证并加载角色数据
|
||||
3. WHEN 网络连接中断 THEN 游戏系统 SHALL 显示断线提示并尝试自动重连
|
||||
4. WHEN 玩家执行操作 THEN 游戏系统 SHALL 将操作数据发送到服务器并接收确认
|
||||
5. WHEN 服务器推送更新 THEN 游戏系统 SHALL 实时更新本地游戏状态
|
||||
802
.kiro/specs/godot-ai-town-game/tasks.md
Normal file
802
.kiro/specs/godot-ai-town-game/tasks.md
Normal file
@@ -0,0 +1,802 @@
|
||||
# 实施计划
|
||||
|
||||
## 任务列表
|
||||
|
||||
- [x] 1. 项目初始化和基础架构
|
||||
|
||||
|
||||
- 创建 Godot 4.x 项目结构
|
||||
- 配置项目设置(分辨率、导出选项)
|
||||
- 设置版本控制 (.gitignore)
|
||||
- _需求: 8.1, 8.5_
|
||||
|
||||
- [x] 1.1 创建核心场景树结构
|
||||
|
||||
|
||||
- 创建 Main.tscn 主场景
|
||||
- 添加 NetworkManager、GameStateManager 节点
|
||||
- 创建 UILayer 和 GameWorld 节点
|
||||
- _需求: 8.1_
|
||||
|
||||
- [x] 1.2 配置输入映射
|
||||
|
||||
- 设置键盘输入动作(ui_up, ui_down, ui_left, ui_right, interact)
|
||||
- 配置 WASD 和方向键映射
|
||||
- _需求: 5.1_
|
||||
|
||||
|
||||
- [x] 2. 实现网络管理器
|
||||
|
||||
|
||||
- 创建 NetworkManager.gd 脚本
|
||||
- 实现 WebSocket 客户端连接逻辑
|
||||
- 实现消息发送和接收功能
|
||||
- 添加连接状态管理(连接、断开、错误处理)
|
||||
- _需求: 12.1, 12.2_
|
||||
|
||||
|
||||
- [x] 2.1 实现消息协议
|
||||
|
||||
- 定义消息类型常量
|
||||
- 实现 JSON 消息序列化/反序列化
|
||||
- 创建消息构建辅助函数
|
||||
- _需求: 12.4_
|
||||
|
||||
- [x] 2.2 编写属性测试:数据序列化往返
|
||||
|
||||
|
||||
- **属性 16: 数据序列化往返**
|
||||
- **验证需求: 7.3, 9.5**
|
||||
|
||||
- [x] 2.3 实现断线重连机制
|
||||
|
||||
- 添加自动重连逻辑(最多3次)
|
||||
- 实现指数退避算法
|
||||
- 显示重连状态提示
|
||||
- _需求: 12.3_
|
||||
|
||||
- [x] 3. 实现游戏状态管理器
|
||||
|
||||
|
||||
|
||||
- 创建 GameStateManager.gd 脚本
|
||||
- 实现状态枚举(LOGIN, CHARACTER_CREATION, IN_GAME, DISCONNECTED)
|
||||
- 实现状态切换逻辑
|
||||
- 添加状态变化信号
|
||||
- _需求: 10.1_
|
||||
|
||||
- [x] 3.1 实现数据持久化
|
||||
|
||||
- 实现玩家数据保存功能(JSON 格式)
|
||||
- 实现玩家数据加载功能
|
||||
- 添加数据验证逻辑
|
||||
- _需求: 9.1, 9.2, 9.5_
|
||||
|
||||
- [x] 3.2 编写单元测试:状态转换
|
||||
|
||||
|
||||
- 测试各种状态转换场景
|
||||
- 验证状态转换的正确性
|
||||
- _需求: 8.2_
|
||||
|
||||
- [x] 4. 创建角色数据模型
|
||||
|
||||
|
||||
|
||||
- 定义角色数据结构(Dictionary)
|
||||
- 实现角色数据验证函数
|
||||
- 创建角色 ID 生成器(UUID)
|
||||
- _需求: 1.5_
|
||||
|
||||
- [x] 4.1 编写属性测试:角色创建唯一性
|
||||
|
||||
|
||||
- **属性 1: 角色创建唯一性**
|
||||
- **验证需求: 1.5**
|
||||
|
||||
- [x] 5. 实现角色控制器
|
||||
|
||||
|
||||
|
||||
- 创建 CharacterController.gd 脚本
|
||||
- 继承 CharacterBody2D
|
||||
- 实现基础移动逻辑(move_to 方法)
|
||||
- 添加角色属性(id, name, is_online, move_speed)
|
||||
- _需求: 2.1, 2.2_
|
||||
|
||||
- [x] 5.1 实现角色动画系统
|
||||
|
||||
|
||||
- 创建 AnimationPlayer 节点
|
||||
- 添加 idle 和 walking 动画
|
||||
- 实现动画状态切换逻辑
|
||||
- _需求: 5.5_
|
||||
|
||||
- [x] 5.2 实现碰撞检测
|
||||
|
||||
|
||||
- 配置碰撞形状(CollisionShape2D)
|
||||
- 实现障碍物碰撞检测
|
||||
- 实现场景边界检测
|
||||
- _需求: 2.3, 2.4, 4.5_
|
||||
|
||||
- [x] 5.3 编写属性测试:碰撞检测
|
||||
|
||||
|
||||
- **属性 4: 碰撞检测**
|
||||
- **验证需求: 2.4**
|
||||
|
||||
- [x] 5.4 实现平滑位置插值
|
||||
|
||||
|
||||
- 实现 set_position_smooth 方法
|
||||
- 使用 Tween 实现平滑移动
|
||||
- 处理网络延迟的位置同步
|
||||
- _需求: 2.2_
|
||||
|
||||
- [x] 5.5 编写属性测试:位置更新同步
|
||||
|
||||
- **属性 3: 位置更新同步**
|
||||
- **验证需求: 2.2**
|
||||
|
||||
- [x] 5.6 实现在线/离线状态视觉标识
|
||||
|
||||
|
||||
- 添加状态指示器(Sprite 或 Label)
|
||||
- 实现 set_online_status 方法
|
||||
- 使用颜色或图标区分在线/离线
|
||||
- _需求: 11.5_
|
||||
|
||||
- [x] 5.7 编写属性测试:角色移动能力
|
||||
|
||||
- **属性 2: 角色移动能力**
|
||||
- **验证需求: 2.1**
|
||||
|
||||
- [x] 6. 实现输入处理器
|
||||
|
||||
|
||||
|
||||
- 创建 InputHandler.gd 脚本
|
||||
- 实现 get_move_direction 方法(键盘输入)
|
||||
- 实现 is_interact_pressed 方法
|
||||
- 发射输入信号(move_input, interact_input)
|
||||
- _需求: 5.1_
|
||||
|
||||
- [x] 6.1 实现设备检测
|
||||
|
||||
- 检测当前设备类型(桌面/移动)
|
||||
- 根据设备类型选择输入方案
|
||||
- _需求: 7.5_
|
||||
|
||||
- [x] 6.2 编写属性测试:设备类型检测
|
||||
|
||||
|
||||
- **属性 17: 设备类型检测**
|
||||
- **验证需求: 7.5**
|
||||
|
||||
- [x] 6.3 实现虚拟摇杆(移动端)
|
||||
|
||||
|
||||
- 创建虚拟摇杆 UI 场景
|
||||
- 实现触摸输入处理
|
||||
- 实现 setup_virtual_controls 方法
|
||||
- 根据设备自动显示/隐藏
|
||||
- _需求: 5.2, 7.5_
|
||||
|
||||
- [x] 6.4 编写属性测试:触摸输入响应
|
||||
|
||||
- **属性 12: 触摸输入响应**
|
||||
- **验证需求: 5.2**
|
||||
|
||||
- [x] 7. 创建 UI 系统基础
|
||||
|
||||
|
||||
|
||||
- 创建 UILayer.tscn 场景
|
||||
- 设置 CanvasLayer 属性
|
||||
- 创建响应式布局容器
|
||||
- _需求: 10.1_
|
||||
|
||||
- [x] 7.1 实现登录界面
|
||||
|
||||
|
||||
- 创建 LoginScreen.tscn
|
||||
- 添加输入框(用户名)
|
||||
- 添加登录和创建角色按钮
|
||||
- 实现按钮点击事件
|
||||
- _需求: 10.1_
|
||||
|
||||
- [x] 7.2 实现角色创建界面
|
||||
|
||||
|
||||
- 创建 CharacterCreation.tscn
|
||||
- 添加角色名称输入框
|
||||
- 实现名称验证(2-20字符,非空白)
|
||||
- 添加创建按钮和返回按钮
|
||||
- _需求: 1.1, 1.2, 1.3_
|
||||
|
||||
- [x] 7.3 编写单元测试:角色名称验证
|
||||
|
||||
- 测试有效名称
|
||||
- 测试空白名称(边界情况)
|
||||
- 测试长度限制
|
||||
- _需求: 1.3_
|
||||
|
||||
- [x] 7.4 实现游戏内 HUD
|
||||
|
||||
|
||||
- 创建 HUD.tscn
|
||||
- 添加在线玩家数量显示
|
||||
- 添加网络状态指示器
|
||||
- 添加交互提示
|
||||
- _需求: 10.1_
|
||||
|
||||
- [x] 7.5 实现响应式 UI 适配
|
||||
|
||||
- 使用 Container 节点实现自适应布局
|
||||
- 实现窗口大小变化监听
|
||||
- 动态调整 UI 元素大小
|
||||
- _需求: 6.3, 6.4, 7.2_
|
||||
|
||||
- [x] 7.6 编写属性测试:响应式布局适配
|
||||
|
||||
- **属性 14: 响应式布局适配**
|
||||
- **验证需求: 6.3, 7.2**
|
||||
|
||||
- [x] 7.7 实现移动端 UI 适配
|
||||
|
||||
- 增大触摸按钮尺寸
|
||||
- 调整元素间距
|
||||
- 优化字体大小
|
||||
- _需求: 10.4_
|
||||
|
||||
- [x] 7.8 编写属性测试:移动设备 UI 适配
|
||||
|
||||
- **属性 20: 移动设备 UI 适配**
|
||||
- **验证需求: 10.4**
|
||||
|
||||
- [x] 8. 实现对话系统
|
||||
|
||||
|
||||
|
||||
- 创建 DialogueSystem.gd 脚本
|
||||
- 实现 start_dialogue 方法
|
||||
- 实现 send_message 方法
|
||||
- 实现 end_dialogue 方法
|
||||
- 添加对话信号(dialogue_started, dialogue_ended, message_received)
|
||||
- _需求: 3.1, 3.3, 3.4_
|
||||
|
||||
- [x] 8.1 创建对话框 UI
|
||||
|
||||
|
||||
- 创建 DialogueBox.tscn
|
||||
- 添加消息显示区域(RichTextLabel)
|
||||
- 添加输入框和发送按钮
|
||||
- 实现消息历史滚动
|
||||
- _需求: 3.2_
|
||||
|
||||
- [x] 8.2 编写属性测试:消息传递完整性
|
||||
|
||||
- **属性 7: 消息传递完整性**
|
||||
- **验证需求: 3.3**
|
||||
|
||||
- [x] 8.3 实现对话气泡
|
||||
|
||||
|
||||
- 创建 ChatBubble.tscn 场景
|
||||
- 实现 show_bubble 方法
|
||||
- 添加自动消失计时器
|
||||
- 实现气泡位置跟随角色
|
||||
- _需求: 3.5_
|
||||
|
||||
- [x] 8.4 编写属性测试:对话可见性
|
||||
|
||||
- **属性 9: 对话可见性**
|
||||
- **验证需求: 3.5**
|
||||
|
||||
- [x] 8.5 实现对话触发检测
|
||||
|
||||
|
||||
- 检测角色之间的距离
|
||||
- 实现交互范围判定
|
||||
- 显示交互提示
|
||||
- _需求: 3.1_
|
||||
|
||||
- [x] 8.6 编写属性测试:对话触发
|
||||
|
||||
- **属性 6: 对话触发**
|
||||
- **验证需求: 3.1**
|
||||
|
||||
- [x] 9. 实现世界管理器
|
||||
|
||||
|
||||
|
||||
- 创建 WorldManager.gd 脚本
|
||||
- 实现角色字典管理(characters)
|
||||
- 实现 spawn_character 方法
|
||||
- 实现 remove_character 方法
|
||||
- 实现 update_character_state 方法
|
||||
- _需求: 11.1, 11.2_
|
||||
|
||||
- [x] 9.1 实现附近角色查询
|
||||
|
||||
- 实现 get_nearby_characters 方法
|
||||
- 使用空间查询优化性能
|
||||
- _需求: 3.5_
|
||||
|
||||
- [x] 9.2 实现角色上线/下线处理
|
||||
|
||||
|
||||
- 处理玩家上线事件
|
||||
- 处理玩家下线事件
|
||||
- 更新角色在线状态
|
||||
- _需求: 11.3, 11.4_
|
||||
|
||||
- [x] 9.3 编写属性测试:上线状态切换
|
||||
|
||||
- **属性 24: 上线状态切换**
|
||||
- **验证需求: 11.3**
|
||||
|
||||
- [x] 9.4 编写属性测试:下线状态切换
|
||||
|
||||
- **属性 25: 下线状态切换**
|
||||
- **验证需求: 11.4**
|
||||
|
||||
- [x] 10. 创建 Datawhale 办公室场景
|
||||
|
||||
|
||||
|
||||
- 创建 DatawhaleOffice.tscn 场景
|
||||
- 设置场景尺寸(2000x1500)
|
||||
- 创建 TileMap 节点
|
||||
- _需求: 4.1, 4.2_
|
||||
|
||||
- [x] 10.1 设计和导入瓦片集
|
||||
|
||||
- 创建或导入地板瓦片
|
||||
- 创建或导入墙壁瓦片
|
||||
- 创建或导入家具瓦片
|
||||
- 配置瓦片碰撞形状
|
||||
- _需求: 4.2_
|
||||
|
||||
- [x] 10.2 绘制办公室布局
|
||||
|
||||
- 绘制入口区域(门、欢迎标识)
|
||||
- 绘制工作区(办公桌、电脑、椅子)
|
||||
- 绘制会议区(会议桌、白板)
|
||||
- 绘制休息区(沙发、茶水间)
|
||||
- 绘制展示区(Datawhale logo、成就墙)
|
||||
- _需求: 4.2_
|
||||
|
||||
- [x] 10.3 配置碰撞层
|
||||
|
||||
- 设置 Layer 1: 墙壁和固定障碍物
|
||||
- 设置 Layer 2: 家具
|
||||
- 设置 Layer 3: 角色
|
||||
- 设置 Layer 4: 交互区域
|
||||
- _需求: 4.5_
|
||||
|
||||
- [x] 10.4 编写属性测试:场景碰撞检测
|
||||
|
||||
- **属性 10: 场景碰撞检测**
|
||||
- **验证需求: 4.5**
|
||||
|
||||
|
||||
- [x] 10.5 添加 Datawhale 品牌元素
|
||||
|
||||
|
||||
|
||||
- 添加 Datawhale logo Sprite
|
||||
- 应用品牌色彩方案(蓝色系)
|
||||
|
||||
|
||||
- 添加品牌标志性元素
|
||||
- _需求: 4.3, 4.4_
|
||||
|
||||
- [x] 11. 创建角色精灵和动画
|
||||
|
||||
|
||||
|
||||
- 创建或导入角色精灵图
|
||||
- 创建 4 方向行走帧动画
|
||||
- 创建 idle 动画
|
||||
- 配置 AnimatedSprite2D 节点
|
||||
- _需求: 5.5_
|
||||
|
||||
- [x] 11.1 创建玩家角色场景
|
||||
|
||||
|
||||
- 创建 PlayerCharacter.tscn
|
||||
- 继承 CharacterController
|
||||
- 添加 Camera2D(跟随玩家)
|
||||
- 配置输入处理
|
||||
- _需求: 5.1_
|
||||
|
||||
- [x] 11.2 创建远程角色场景
|
||||
|
||||
|
||||
- 创建 RemoteCharacter.tscn
|
||||
- 继承 CharacterController
|
||||
- 配置网络同步
|
||||
- 添加名称标签
|
||||
- _需求: 11.1, 11.2_
|
||||
|
||||
- [x] 12. 实现客户端游戏逻辑集成
|
||||
|
||||
|
||||
- 连接 NetworkManager 和 GameStateManager
|
||||
- 实现登录流程
|
||||
- 实现角色创建流程
|
||||
- 实现进入游戏流程
|
||||
- _需求: 1.1, 1.2, 10.1, 12.1_
|
||||
|
||||
- [x] 12.1 实现玩家角色控制
|
||||
|
||||
- 连接 InputHandler 和 PlayerCharacter
|
||||
- 实现移动输入处理
|
||||
- 实现交互输入处理
|
||||
- 发送移动数据到服务器
|
||||
- _需求: 5.1, 5.2_
|
||||
|
||||
- [x] 12.2 编写属性测试:键盘输入响应
|
||||
|
||||
|
||||
- **属性 11: 键盘输入响应**
|
||||
- **验证需求: 5.1**
|
||||
|
||||
- [x] 12.3 实现网络消息处理
|
||||
|
||||
- 处理 auth_response 消息
|
||||
- 处理 character_create 响应
|
||||
- 处理 character_move 消息
|
||||
- 处理 character_state 更新
|
||||
- 处理 world_state 同步
|
||||
- _需求: 12.5_
|
||||
|
||||
- [x] 12.4 编写属性测试:服务器更新同步
|
||||
|
||||
|
||||
- **属性 30: 服务器更新同步**
|
||||
- **验证需求: 12.5**
|
||||
|
||||
- [x] 12.5 实现角色生成和管理
|
||||
|
||||
|
||||
- 接收服务器角色列表
|
||||
- 生成本地玩家角色
|
||||
- 生成远程角色(在线和离线)
|
||||
- 更新角色状态
|
||||
- _需求: 11.1, 11.2_
|
||||
|
||||
- [x] 12.6 编写属性测试:在线角色显示
|
||||
|
||||
|
||||
- **属性 22: 在线角色显示**
|
||||
- **验证需求: 11.1**
|
||||
|
||||
- [x] 12.7 编写属性测试:离线角色显示
|
||||
|
||||
|
||||
|
||||
- **属性 23: 离线角色显示**
|
||||
- **验证需求: 11.2**
|
||||
|
||||
- [x] 13. 实现错误处理和用户反馈
|
||||
|
||||
|
||||
|
||||
- 实现网络错误提示 UI
|
||||
- 实现重连提示和按钮
|
||||
- 实现操作失败提示
|
||||
- 实现加载状态指示器
|
||||
- _需求: 10.5, 12.3_
|
||||
|
||||
- [x] 13.1 编写属性测试:错误提示显示
|
||||
|
||||
|
||||
- **属性 21: 错误提示显示**
|
||||
- **验证需求: 10.5**
|
||||
|
||||
- [x] 13.2 编写属性测试:断线重连
|
||||
|
||||
|
||||
- **属性 28: 断线重连**
|
||||
- **验证需求: 12.3**
|
||||
|
||||
- [x] 14. 开发 WebSocket 服务器(Node.js)
|
||||
|
||||
- 创建 server 目录
|
||||
- 初始化 Node.js 项目(package.json)
|
||||
- 安装 ws 库和相关依赖
|
||||
- 创建基础服务器文件(server.ts)
|
||||
- 配置 TypeScript 编译
|
||||
- _需求: 12.1_
|
||||
|
||||
- [x] 14.1 实现连接管理
|
||||
|
||||
- 实现 WebSocket 连接处理
|
||||
- 实现客户端连接池
|
||||
- 实现心跳检测
|
||||
- 实现连接断开处理
|
||||
- _需求: 12.1, 12.2_
|
||||
|
||||
- [x] 14.2 编写属性测试:网络连接建立
|
||||
- **属性 27: 网络连接建立**
|
||||
- **验证需求: 12.1**
|
||||
|
||||
- [x] 14.3 实现身份验证服务
|
||||
|
||||
- 实现简单的用户名验证
|
||||
- 生成会话 token
|
||||
- 维护用户会话
|
||||
- _需求: 12.2_
|
||||
|
||||
- [x] 14.4 实现角色管理
|
||||
|
||||
- 实现角色创建逻辑
|
||||
- 验证角色名称唯一性
|
||||
- 生成唯一角色 ID
|
||||
- 存储角色数据
|
||||
- _需求: 1.2, 1.5_
|
||||
|
||||
- [x] 14.5 实现世界状态管理
|
||||
|
||||
- 维护所有角色状态
|
||||
- 处理角色移动更新
|
||||
- 广播状态变化
|
||||
- 实现状态同步
|
||||
- _需求: 2.2, 9.4_
|
||||
|
||||
- [x] 14.6 编写属性测试:状态同步
|
||||
- **属性 19: 状态同步**
|
||||
- **验证需求: 9.4**
|
||||
|
||||
- [x] 14.7 实现消息路由
|
||||
|
||||
- 处理不同类型的消息
|
||||
- 实现点对点消息
|
||||
- 实现广播消息
|
||||
- 实现消息确认机制
|
||||
- _需求: 12.4_
|
||||
|
||||
- [x] 14.8 编写属性测试:操作确认
|
||||
- **属性 29: 操作确认**
|
||||
- **验证需求: 12.4**
|
||||
|
||||
- [x] 14.9 实现数据持久化
|
||||
|
||||
|
||||
- 实现 JSON 文件存储
|
||||
- 保存角色数据
|
||||
- 保存世界状态
|
||||
- 实现数据加载
|
||||
- _需求: 9.1, 9.2_
|
||||
|
||||
- [x] 14.10 编写属性测试:角色数据持久化
|
||||
- **属性 18: 角色数据持久化**
|
||||
- **验证需求: 9.1, 9.2**
|
||||
|
||||
- [x] 15. 测试和优化
|
||||
- 运行所有单元测试
|
||||
- 运行所有属性测试
|
||||
- 修复发现的 bug
|
||||
- 修复角色移动问题
|
||||
- 优化相机控制体验
|
||||
- 修复网络连接超时问题
|
||||
- 优化UI通知系统
|
||||
- _需求: 所有_
|
||||
|
||||
- [x] 15.1 性能测试
|
||||
- 测试 10 个角色时的帧率
|
||||
- 测试网络延迟
|
||||
- 优化性能瓶颈
|
||||
- _需求: 6.5_
|
||||
|
||||
- [x] 15.2 跨浏览器测试
|
||||
- 测试 Chrome 兼容性
|
||||
- 测试 Firefox 兼容性
|
||||
- 测试 Safari 兼容性
|
||||
- 测试 Edge 兼容性
|
||||
- _需求: 6.1_
|
||||
|
||||
- [x] 15.3 集成测试
|
||||
- 测试完整的登录流程
|
||||
- 测试角色创建流程
|
||||
- 测试多客户端交互
|
||||
- 测试对话系统
|
||||
- _需求: 所有_
|
||||
|
||||
- [x] 16. Web 导出和部署准备
|
||||
- 配置 Godot HTML5 导出设置
|
||||
- 导出 Web 版本
|
||||
- 测试导出的 Web 版本
|
||||
- _需求: 6.1, 6.2_
|
||||
|
||||
- [x] 16.1 创建部署文档
|
||||
- 编写 README.md
|
||||
- 说明项目结构
|
||||
- 说明运行方法
|
||||
- 说明扩展指南
|
||||
- _需求: 8.3_
|
||||
|
||||
- [x] 16.2 配置服务器部署
|
||||
- 配置环境变量
|
||||
- 设置 WebSocket 服务器
|
||||
- 配置静态文件服务
|
||||
- _需求: 12.1_
|
||||
|
||||
- [x] 17. 用户体验优化和修复
|
||||
|
||||
- [x] 17.1 修复角色移动问题
|
||||
- 诊断角色自动向左移动问题
|
||||
- 添加调试信息和日志
|
||||
- 修复初始化时的速度设置
|
||||
- 防止网络回环导致的移动
|
||||
- _需求: 2.1, 2.2_
|
||||
|
||||
- [x] 17.2 优化相机控制系统
|
||||
- 修复相机重置时的闪现问题
|
||||
- 实现平滑的重置动画(缓动效果)
|
||||
- 修复相机缩放时的卡顿问题
|
||||
- 优化相机边界限制
|
||||
- 调整缩放和重置的响应速度
|
||||
- _需求: 5.3, 5.4_
|
||||
|
||||
- [x] 17.3 完善网络连接处理
|
||||
- 添加连接超时机制(10秒)
|
||||
- 优化错误提示信息
|
||||
- 移除无效的重试按钮
|
||||
- 统一UI通知的字体样式和布局
|
||||
- _需求: 12.1, 12.3, 10.5_
|
||||
|
||||
- [x] 17.4 UI系统优化
|
||||
- 统一所有通知的字体大小(18px)
|
||||
- 确保文字在通知框中居中显示
|
||||
- 优化加载指示器的样式一致性
|
||||
- 调整自动隐藏时间(网络错误8秒,普通错误5秒)
|
||||
- _需求: 10.1, 10.5_
|
||||
|
||||
- [x] 18. 最终检查点
|
||||
- 确保所有测试通过
|
||||
- 验证所有需求已实现
|
||||
- 检查代码质量和注释
|
||||
- 验证用户体验流畅性
|
||||
- 准备交付
|
||||
- _需求: 所有_
|
||||
|
||||
- [x] 19. 项目优化和完善
|
||||
|
||||
|
||||
- [x] 19.1 代码重构和优化
|
||||
|
||||
|
||||
|
||||
- 重构重复代码,提高代码复用性
|
||||
- 优化性能瓶颈,确保流畅运行
|
||||
- 统一代码风格和命名规范
|
||||
- 添加详细的代码注释和文档
|
||||
- _需求: 8.2, 8.3_
|
||||
|
||||
- [x] 19.2 用户体验优化
|
||||
|
||||
|
||||
|
||||
- 优化加载时间和响应速度
|
||||
- 改进错误提示的用户友好性
|
||||
- 增强视觉反馈和动画效果
|
||||
- 优化移动端触摸体验
|
||||
- _需求: 6.2, 10.1, 10.4, 10.5_
|
||||
|
||||
- [x] 19.3 安全性增强
|
||||
|
||||
|
||||
|
||||
- 实现输入验证和过滤
|
||||
- 添加防止恶意攻击的保护措施
|
||||
- 实现会话管理和超时机制
|
||||
- 加强数据传输安全性
|
||||
- _需求: 12.2, 12.4_
|
||||
|
||||
- [ ] 20. 扩展功能开发
|
||||
|
||||
- [x] 20.1 增强对话系统
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
- 实现对话历史记录功能
|
||||
- 添加表情符号支持
|
||||
- 实现群组对话功能
|
||||
- 添加对话过滤和审核机制
|
||||
- _需求: 3.2, 3.3_
|
||||
|
||||
- [x] 20.2 角色个性化
|
||||
|
||||
|
||||
|
||||
- 实现角色外观自定义
|
||||
- 添加角色状态和心情系统
|
||||
- 实现角色技能和属性系统
|
||||
- 添加角色成就和等级系统
|
||||
- _需求: 1.4, 5.5_
|
||||
|
||||
- [x] 20.3 社交功能扩展
|
||||
|
||||
|
||||
|
||||
- 实现好友系统
|
||||
- 添加私聊功能
|
||||
- 实现角色关系网络
|
||||
- 添加社区活动和事件系统
|
||||
- _需求: 3.1, 11.1, 11.2_
|
||||
|
||||
- [ ] 21. AI 集成准备
|
||||
|
||||
- [ ] 21.1 AI 对话接口设计
|
||||
- 设计 AI 对话 API 接口
|
||||
- 实现 AI 响应处理机制
|
||||
- 添加 AI 角色行为模式
|
||||
- 预留 AI 学习和训练接口
|
||||
- _需求: 3.3, 11.2_
|
||||
|
||||
- [ ] 21.2 智能 NPC 系统
|
||||
- 实现离线角色的智能行为
|
||||
- 添加 NPC 自动对话功能
|
||||
- 实现基于上下文的响应系统
|
||||
- 添加 NPC 学习和记忆功能
|
||||
- _需求: 11.2, 11.4_
|
||||
|
||||
- [-] 22. 数据分析和监控
|
||||
|
||||
|
||||
- [x] 22.1 用户行为分析
|
||||
|
||||
|
||||
- 实现用户行为数据收集
|
||||
- 添加游戏统计和分析功能
|
||||
- 实现性能监控和报警系统
|
||||
- 添加用户反馈收集机制
|
||||
- _需求: 6.5, 8.3_
|
||||
|
||||
- [x] 22.2 系统监控和维护
|
||||
|
||||
|
||||
|
||||
- 实现服务器健康检查
|
||||
- 添加自动备份和恢复机制
|
||||
- 实现日志管理和分析系统
|
||||
- 添加系统更新和维护工具
|
||||
- _需求: 9.1, 9.2, 12.1_
|
||||
|
||||
- [x] 23. 最终交付准备
|
||||
|
||||
|
||||
|
||||
|
||||
- [x] 23.1 文档完善
|
||||
|
||||
|
||||
- 完善用户使用手册
|
||||
- 编写开发者技术文档
|
||||
- 创建部署和运维指南
|
||||
- 准备项目演示材料
|
||||
- _需求: 8.3_
|
||||
|
||||
|
||||
|
||||
- [ ] 23.2 质量保证
|
||||
- 进行全面的回归测试
|
||||
- 执行压力测试和负载测试
|
||||
- 验证所有功能的完整性
|
||||
- 确保跨平台兼容性
|
||||
|
||||
|
||||
- _需求: 6.1, 6.5_
|
||||
|
||||
- [ ] 23.3 发布准备
|
||||
- 准备生产环境部署
|
||||
- 配置 CDN 和负载均衡
|
||||
- 设置监控和告警系统
|
||||
- 准备用户支持和维护计划
|
||||
- _需求: 6.1, 6.2, 12.1_
|
||||
Reference in New Issue
Block a user