创建新工程
This commit is contained in:
634
.kiro/specs/character-appearance-customization/design.md
Normal file
634
.kiro/specs/character-appearance-customization/design.md
Normal file
@@ -0,0 +1,634 @@
|
||||
# 角色外观自定义系统设计文档
|
||||
|
||||
## 概述
|
||||
|
||||
本设计文档描述了为现有 Godot AI 小镇游戏添加角色外观自定义功能的完整方案。该系统将在现有角色创建流程的基础上,添加一个专门的外观自定义界面,允许用户自定义角色的头部、身体、脚部颜色,并通过流畅的UI动效提升用户体验。
|
||||
|
||||
### 技术栈
|
||||
|
||||
- **游戏引擎**: Godot 4.x
|
||||
- **编程语言**: GDScript
|
||||
- **UI框架**: Godot Control 节点系统
|
||||
- **动画系统**: Godot Tween 和 AnimationPlayer
|
||||
- **数据格式**: Dictionary (GDScript 原生)
|
||||
- **颜色系统**: Godot Color 类
|
||||
|
||||
## 架构
|
||||
|
||||
### 整体架构
|
||||
|
||||
角色外观自定义系统采用模块化设计,与现有的角色创建系统集成:
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────┐
|
||||
│ 角色创建流程 (CharacterCreation) │
|
||||
├─────────────────────────────────────────┤
|
||||
│ 1. 默认外观生成 │
|
||||
│ 2. 角色名称输入 │
|
||||
│ 3. 自定义外观按钮 │
|
||||
│ 4. 创建角色按钮 │
|
||||
└─────────────────────────────────────────┘
|
||||
↓ 点击自定义外观
|
||||
┌─────────────────────────────────────────┐
|
||||
│ 外观自定义界面 (AppearanceCustomizer) │
|
||||
├─────────────────────────────────────────┤
|
||||
│ ┌─────────────────────────────────────┐ │
|
||||
│ │ 头部颜色调整区域 │ │
|
||||
│ │ ┌─────────────┐ ┌─────────────┐ │ │
|
||||
│ │ │ 颜色选择器 │ │ 预设颜色 │ │ │
|
||||
│ │ └─────────────┘ └─────────────┘ │ │
|
||||
│ └─────────────────────────────────────┘ │
|
||||
│ ┌─────────────────────────────────────┐ │
|
||||
│ │ 身体颜色调整区域 │ │
|
||||
│ │ ┌─────────────┐ ┌─────────────┐ │ │
|
||||
│ │ │ 颜色选择器 │ │ 预设颜色 │ │ │
|
||||
│ │ └─────────────┘ └─────────────┘ │ │
|
||||
│ └─────────────────────────────────────┘ │
|
||||
│ ┌─────────────────────────────────────┐ │
|
||||
│ │ 脚部颜色调整区域 │ │
|
||||
│ │ ┌─────────────┐ ┌─────────────┐ │ │
|
||||
│ │ │ 颜色选择器 │ │ 预设颜色 │ │ │
|
||||
│ │ └─────────────┘ └─────────────┘ │ │
|
||||
│ └─────────────────────────────────────┘ │
|
||||
│ ┌─────────────────────────────────────┐ │
|
||||
│ │ 角色预览区域 │ │
|
||||
│ │ ┌─────────────────────────────┐ │ │
|
||||
│ │ │ 实时预览显示 │ │ │
|
||||
│ │ └─────────────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────┘ │
|
||||
│ ┌─────────────────────────────────────┐ │
|
||||
│ │ 操作按钮区域 │ │
|
||||
│ │ [返回] [重置] [随机生成] [保存] │ │
|
||||
│ └─────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────┘
|
||||
↓ 点击返回/保存
|
||||
┌─────────────────────────────────────────┐
|
||||
│ 角色创建流程 (更新后) │
|
||||
├─────────────────────────────────────────┤
|
||||
│ 1. 显示自定义外观预览 │
|
||||
│ 2. 角色名称输入 │
|
||||
│ 3. 创建角色按钮 (应用自定义外观) │
|
||||
└─────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 组件架构
|
||||
|
||||
系统主要包含以下核心组件:
|
||||
|
||||
```
|
||||
AppearanceCustomizer (主控制器)
|
||||
├─ DefaultAppearanceGenerator (默认外观生成器)
|
||||
├─ ColorAdjustmentPanel (颜色调整面板)
|
||||
│ ├─ HeadColorAdjuster (头部颜色调整器)
|
||||
│ ├─ BodyColorAdjuster (身体颜色调整器)
|
||||
│ └─ FootColorAdjuster (脚部颜色调整器)
|
||||
├─ AppearancePreview (外观预览器)
|
||||
├─ UIAnimationController (UI动画控制器)
|
||||
└─ AppearanceDataManager (外观数据管理器)
|
||||
```
|
||||
|
||||
## 组件和接口
|
||||
|
||||
### 1. 默认外观生成器 (DefaultAppearanceGenerator)
|
||||
|
||||
**职责**: 为新角色生成协调的默认外观
|
||||
|
||||
**接口**:
|
||||
```gdscript
|
||||
class_name DefaultAppearanceGenerator
|
||||
|
||||
static func generate_default_appearance() -> Dictionary
|
||||
static func generate_coordinated_colors() -> Dictionary
|
||||
static func get_fallback_appearance() -> Dictionary
|
||||
static func validate_appearance_data(appearance: Dictionary) -> bool
|
||||
```
|
||||
|
||||
**生成规则**:
|
||||
- 头部颜色:使用肤色色调范围
|
||||
- 身体颜色:使用服装色调范围,与头部形成对比
|
||||
- 脚部颜色:使用鞋子色调范围,与身体协调
|
||||
- 确保颜色对比度适中,视觉效果和谐
|
||||
|
||||
### 2. 颜色调整器 (ColorAdjuster)
|
||||
|
||||
**职责**: 处理单个身体部位的颜色调整
|
||||
|
||||
**接口**:
|
||||
```gdscript
|
||||
class_name ColorAdjuster extends Control
|
||||
|
||||
signal color_changed(new_color: Color)
|
||||
|
||||
var current_color: Color
|
||||
var preset_colors: Array[Color]
|
||||
var color_picker: ColorPicker
|
||||
var preset_buttons: Array[Button]
|
||||
|
||||
func set_color(color: Color) -> void
|
||||
func get_color() -> Color
|
||||
func setup_presets(colors: Array[Color]) -> void
|
||||
func reset_to_default() -> void
|
||||
```
|
||||
|
||||
**预设颜色方案**:
|
||||
- 头部:5种肤色选项
|
||||
- 身体:8种服装颜色选项
|
||||
- 脚部:6种鞋子颜色选项
|
||||
|
||||
### 3. 外观预览器 (AppearancePreview)
|
||||
|
||||
**职责**: 实时显示角色外观预览
|
||||
|
||||
**接口**:
|
||||
```gdscript
|
||||
class_name AppearancePreview extends Control
|
||||
|
||||
var character_sprite: CharacterSprite
|
||||
var head_sprite: Sprite2D
|
||||
var body_sprite: Sprite2D
|
||||
var foot_sprite: Sprite2D
|
||||
|
||||
func update_appearance(appearance_data: Dictionary) -> void
|
||||
func set_head_color(color: Color) -> void
|
||||
func set_body_color(color: Color) -> void
|
||||
func set_foot_color(color: Color) -> void
|
||||
func animate_color_change(part: String, color: Color) -> void
|
||||
```
|
||||
|
||||
**预览特性**:
|
||||
- 实时颜色更新(延迟 < 100ms)
|
||||
- 平滑的颜色过渡动画
|
||||
- 支持不同身体部位的独立渲染
|
||||
|
||||
### 4. UI动画控制器 (UIAnimationController)
|
||||
|
||||
**职责**: 管理界面切换和元素动画
|
||||
|
||||
**接口**:
|
||||
```gdscript
|
||||
class_name UIAnimationController
|
||||
|
||||
static func hide_creation_elements(elements: Array[Control], duration: float = 0.5) -> void
|
||||
static func show_creation_elements(elements: Array[Control], duration: float = 0.5) -> void
|
||||
static func slide_in_customizer(customizer: Control, direction: String = "right") -> void
|
||||
static func slide_out_customizer(customizer: Control, direction: String = "left") -> void
|
||||
static func fade_transition(from_scene: Control, to_scene: Control) -> void
|
||||
```
|
||||
|
||||
**动画类型**:
|
||||
- 淡出动画:透明度从1.0到0.0
|
||||
- 滑动动画:位置偏移动画
|
||||
- 缩放动画:大小变化动画
|
||||
- 组合动画:多种效果结合
|
||||
|
||||
### 5. 外观数据管理器 (AppearanceDataManager)
|
||||
|
||||
**职责**: 管理外观数据的存储、加载和验证
|
||||
|
||||
**接口**:
|
||||
```gdscript
|
||||
class_name AppearanceDataManager
|
||||
|
||||
static func create_appearance_data(head: Color, body: Color, foot: Color) -> Dictionary
|
||||
static func validate_appearance_data(data: Dictionary) -> bool
|
||||
static func serialize_appearance(data: Dictionary) -> String
|
||||
static func deserialize_appearance(json_str: String) -> Dictionary
|
||||
static func merge_with_defaults(custom_data: Dictionary) -> Dictionary
|
||||
```
|
||||
|
||||
**数据结构**:
|
||||
```gdscript
|
||||
{
|
||||
"head_color": "#F5DEB3", # 头部颜色 (十六进制)
|
||||
"body_color": "#4169E1", # 身体颜色
|
||||
"foot_color": "#8B4513", # 脚部颜色
|
||||
"created_at": 1234567890, # 创建时间戳
|
||||
"version": "1.0" # 数据版本
|
||||
}
|
||||
```
|
||||
|
||||
## 数据模型
|
||||
|
||||
### 外观数据结构
|
||||
|
||||
```gdscript
|
||||
# 完整的外观数据模型
|
||||
{
|
||||
"appearance": {
|
||||
"head_color": "#F5DEB3",
|
||||
"body_color": "#4169E1",
|
||||
"foot_color": "#8B4513",
|
||||
"style": "default",
|
||||
"created_at": 1234567890,
|
||||
"version": "1.0"
|
||||
},
|
||||
"metadata": {
|
||||
"is_custom": true,
|
||||
"last_modified": 1234567890,
|
||||
"modification_count": 3
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 颜色预设数据
|
||||
|
||||
```gdscript
|
||||
# 预设颜色方案
|
||||
const COLOR_PRESETS = {
|
||||
"head": [
|
||||
Color("#F5DEB3"), # 浅肤色
|
||||
Color("#DEB887"), # 中等肤色
|
||||
Color("#D2B48C"), # 小麦色
|
||||
Color("#CD853F"), # 深肤色
|
||||
Color("#A0522D") # 棕色肤色
|
||||
],
|
||||
"body": [
|
||||
Color("#FF6B6B"), # 红色
|
||||
Color("#4ECDC4"), # 青色
|
||||
Color("#45B7D1"), # 蓝色
|
||||
Color("#96CEB4"), # 绿色
|
||||
Color("#FFEAA7"), # 黄色
|
||||
Color("#DDA0DD"), # 紫色
|
||||
Color("#F0E68C"), # 卡其色
|
||||
Color("#FFB6C1") # 粉色
|
||||
],
|
||||
"foot": [
|
||||
Color("#8B4513"), # 棕色
|
||||
Color("#000000"), # 黑色
|
||||
Color("#FFFFFF"), # 白色
|
||||
Color("#FF0000"), # 红色
|
||||
Color("#0000FF"), # 蓝色
|
||||
Color("#008000") # 绿色
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## 正确性属性
|
||||
|
||||
*属性是一个特征或行为,应该在系统的所有有效执行中保持为真——本质上是关于系统应该做什么的正式陈述。属性作为人类可读规范和机器可验证正确性保证之间的桥梁。*
|
||||
|
||||
### 属性反思
|
||||
|
||||
在编写正确性属性之前,我需要识别和消除冗余:
|
||||
|
||||
**识别的冗余属性**:
|
||||
1. 属性3、4、5(头部、身体、脚部颜色调整控件)可以合并为一个通用属性
|
||||
2. 属性6、7(外观数据保存和预览更新)在逻辑上相关,可以合并
|
||||
3. 属性8、9(重置和随机生成按钮存在性)可以合并为操作按钮完整性属性
|
||||
|
||||
**合并后的属性**:
|
||||
- 将3个独立的颜色调整属性合并为"颜色调整控件完整性"
|
||||
- 将数据保存和预览更新合并为"外观数据一致性"
|
||||
- 将按钮存在性检查合并为"操作按钮完整性"
|
||||
|
||||
### 属性 1: 默认外观生成完整性
|
||||
*对于任意*角色创建请求,系统应该生成包含头部、身体、脚部颜色的完整外观数据
|
||||
**验证需求: 1.1, 1.3**
|
||||
|
||||
### 属性 2: 外观预览实时更新
|
||||
*对于任意*外观数据的修改,角色预览应该在100毫秒内反映这些变化
|
||||
**验证需求: 1.2, 3.5, 6.3**
|
||||
|
||||
### 属性 3: 界面切换动画触发
|
||||
*对于任意*自定义外观按钮的点击操作,系统应该触发界面切换动画并在0.5秒内完成
|
||||
**验证需求: 2.1, 2.3**
|
||||
|
||||
### 属性 4: UI元素动画隐藏
|
||||
*对于任意*界面切换操作,创建角色按钮和角色名称输入框应该通过动画被隐藏
|
||||
**验证需求: 2.2**
|
||||
|
||||
### 属性 5: 自定义场景正确加载
|
||||
*对于任意*隐藏动画完成事件,系统应该正确加载并显示角色外观自定义场景
|
||||
**验证需求: 2.4**
|
||||
|
||||
### 属性 6: 颜色调整控件完整性
|
||||
*对于任意*自定义界面的加载,应该显示头部、身体、脚部的独立颜色调整控件
|
||||
**验证需求: 3.1, 3.2, 3.3, 3.4**
|
||||
|
||||
### 属性 7: 返回按钮规范性
|
||||
*对于任意*自定义界面,返回按钮应该显示文字"返回"且尺寸满足最小触摸目标要求(44x44像素)
|
||||
**验证需求: 4.1, 4.2, 4.3, 4.5**
|
||||
|
||||
### 属性 8: 外观数据一致性
|
||||
*对于任意*外观自定义操作,点击返回后角色创建界面的预览应该显示与自定义界面相同的外观
|
||||
**验证需求: 5.1, 5.2**
|
||||
|
||||
### 属性 9: 角色创建外观应用
|
||||
*对于任意*包含自定义外观的角色创建操作,创建的角色应该在游戏中显示相同的外观
|
||||
**验证需求: 5.3, 5.4**
|
||||
|
||||
### 属性 10: 外观数据序列化往返
|
||||
*对于任意*外观数据,序列化后再反序列化应该得到等价的数据对象
|
||||
**验证需求: 5.5**
|
||||
|
||||
### 属性 11: 错误处理友好性
|
||||
*对于任意*操作错误情况,系统应该显示用户友好的错误提示信息
|
||||
**验证需求: 6.4**
|
||||
|
||||
### 属性 12: 移动设备适配性
|
||||
*对于任意*移动设备尺寸,界面中的按钮应该满足最小触摸目标要求(44x44像素)
|
||||
**验证需求: 6.5**
|
||||
|
||||
### 属性 13: 系统扩展性
|
||||
*对于任意*新增的颜色调整控件,系统应该能够动态集成并正常工作
|
||||
**验证需求: 7.2**
|
||||
|
||||
### 属性 14: 数据结构扩展性
|
||||
*对于任意*外观数据结构的新增字段,系统应该能够正确处理而不影响现有功能
|
||||
**验证需求: 7.3**
|
||||
|
||||
### 属性 15: 渲染系统灵活性
|
||||
*对于任意*类型的外观元素,预览系统应该能够正确渲染显示
|
||||
**验证需求: 7.4**
|
||||
|
||||
### 属性 16: 操作按钮完整性
|
||||
*对于任意*自定义界面的显示,应该提供重置和随机生成按钮
|
||||
**验证需求: 8.1, 8.3**
|
||||
|
||||
### 属性 17: 重置功能正确性
|
||||
*对于任意*外观自定义状态,点击重置按钮应该将所有设置恢复到进入界面时的初始状态
|
||||
**验证需求: 8.2**
|
||||
|
||||
### 属性 18: 随机生成功能完整性
|
||||
*对于任意*随机生成操作,应该为所有身体部位生成颜色并立即更新预览
|
||||
**验证需求: 8.4, 8.5**
|
||||
|
||||
## 错误处理
|
||||
|
||||
### 外观生成错误
|
||||
|
||||
**默认外观生成失败**:
|
||||
- 使用预设的备用外观方案
|
||||
- 记录错误日志用于调试
|
||||
- 显示友好的错误提示
|
||||
|
||||
**颜色数据无效**:
|
||||
- 验证颜色格式(十六进制)
|
||||
- 使用默认颜色替换无效值
|
||||
- 提示用户重新选择
|
||||
|
||||
### UI交互错误
|
||||
|
||||
**界面切换失败**:
|
||||
- 回退到上一个稳定状态
|
||||
- 显示错误提示信息
|
||||
- 提供重试选项
|
||||
|
||||
**动画执行错误**:
|
||||
- 跳过动画直接切换状态
|
||||
- 确保功能正常可用
|
||||
- 记录性能相关信息
|
||||
|
||||
### 数据持久化错误
|
||||
|
||||
**外观数据保存失败**:
|
||||
- 保持当前界面状态
|
||||
- 显示保存失败提示
|
||||
- 提供重新保存选项
|
||||
|
||||
**数据序列化错误**:
|
||||
- 使用备用序列化方案
|
||||
- 记录详细错误信息
|
||||
- 确保数据不丢失
|
||||
|
||||
## 测试策略
|
||||
|
||||
### 单元测试
|
||||
|
||||
使用 Godot 的 GUT (Godot Unit Test) 框架进行单元测试。
|
||||
|
||||
**测试覆盖范围**:
|
||||
- 默认外观生成逻辑
|
||||
- 颜色调整器功能
|
||||
- 外观数据序列化/反序列化
|
||||
- UI动画控制器
|
||||
|
||||
**示例测试**:
|
||||
```gdscript
|
||||
# test_default_appearance_generator.gd
|
||||
extends GutTest
|
||||
|
||||
func test_generate_default_appearance():
|
||||
var appearance = DefaultAppearanceGenerator.generate_default_appearance()
|
||||
assert_true(appearance.has("head_color"))
|
||||
assert_true(appearance.has("body_color"))
|
||||
assert_true(appearance.has("foot_color"))
|
||||
assert_true(DefaultAppearanceGenerator.validate_appearance_data(appearance))
|
||||
|
||||
func test_fallback_appearance():
|
||||
var fallback = DefaultAppearanceGenerator.get_fallback_appearance()
|
||||
assert_true(DefaultAppearanceGenerator.validate_appearance_data(fallback))
|
||||
```
|
||||
|
||||
### 属性基础测试
|
||||
|
||||
使用 GDScript 实现的属性测试框架。
|
||||
|
||||
**测试库**: 自定义实现的 PropertyTester 类
|
||||
**测试配置**: 每个属性测试至少运行 100 次迭代
|
||||
**测试标注格式**: `# Feature: character-appearance-customization, Property X: [属性描述]`
|
||||
|
||||
**属性测试覆盖**:
|
||||
|
||||
1. **属性 1: 默认外观生成完整性**
|
||||
- 生成多个随机角色创建请求
|
||||
- 验证每次都生成完整的外观数据
|
||||
|
||||
2. **属性 2: 外观预览实时更新**
|
||||
- 生成随机外观修改操作
|
||||
- 测量预览更新的响应时间
|
||||
|
||||
3. **属性 10: 外观数据序列化往返**
|
||||
- 生成随机外观数据
|
||||
- 验证序列化往返的数据一致性
|
||||
|
||||
**示例属性测试**:
|
||||
```gdscript
|
||||
# test_appearance_properties.gd
|
||||
extends GutTest
|
||||
|
||||
# Feature: character-appearance-customization, Property 1: 默认外观生成完整性
|
||||
func test_property_default_appearance_completeness():
|
||||
for i in range(100):
|
||||
var appearance = DefaultAppearanceGenerator.generate_default_appearance()
|
||||
assert_true(appearance.has("head_color"), "应该包含头部颜色")
|
||||
assert_true(appearance.has("body_color"), "应该包含身体颜色")
|
||||
assert_true(appearance.has("foot_color"), "应该包含脚部颜色")
|
||||
assert_true(DefaultAppearanceGenerator.validate_appearance_data(appearance),
|
||||
"生成的外观数据应该有效")
|
||||
|
||||
# Feature: character-appearance-customization, Property 10: 外观数据序列化往返
|
||||
func test_property_appearance_serialization_roundtrip():
|
||||
for i in range(100):
|
||||
var original_data = generate_random_appearance_data()
|
||||
var serialized = AppearanceDataManager.serialize_appearance(original_data)
|
||||
var deserialized = AppearanceDataManager.deserialize_appearance(serialized)
|
||||
assert_eq_deep(deserialized, original_data,
|
||||
"序列化往返应该保持数据一致性")
|
||||
|
||||
func generate_random_appearance_data() -> Dictionary:
|
||||
return {
|
||||
"head_color": "#%06X" % (randi() % 0xFFFFFF),
|
||||
"body_color": "#%06X" % (randi() % 0xFFFFFF),
|
||||
"foot_color": "#%06X" % (randi() % 0xFFFFFF),
|
||||
"created_at": Time.get_unix_time_from_system(),
|
||||
"version": "1.0"
|
||||
}
|
||||
```
|
||||
|
||||
### 集成测试
|
||||
|
||||
**UI集成测试**:
|
||||
- 测试完整的外观自定义流程
|
||||
- 验证界面切换的正确性
|
||||
- 检查动画效果的执行
|
||||
|
||||
**数据集成测试**:
|
||||
- 测试外观数据在不同组件间的传递
|
||||
- 验证预览与实际角色的一致性
|
||||
- 检查数据持久化的完整性
|
||||
|
||||
### 用户体验测试
|
||||
|
||||
**响应时间测试**:
|
||||
- 测试颜色调整的响应延迟
|
||||
- 目标: 预览更新 < 100ms
|
||||
|
||||
**动画流畅性测试**:
|
||||
- 测试界面切换动画的帧率
|
||||
- 目标: 保持 30+ FPS
|
||||
|
||||
**触摸友好性测试**:
|
||||
- 验证移动设备上的按钮尺寸
|
||||
- 目标: 最小触摸目标 44x44 像素
|
||||
|
||||
## 实现细节
|
||||
|
||||
### 界面布局设计
|
||||
|
||||
**自定义界面布局**:
|
||||
```
|
||||
┌─────────────────────────────────────────┐
|
||||
│ [返回] 角色外观自定义 │
|
||||
├─────────────────────────────────────────┤
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────┐ │
|
||||
│ │ 角色预览区域 │ │
|
||||
│ │ ┌─────────────────────────────┐ │ │
|
||||
│ │ │ [角色预览图像] │ │ │
|
||||
│ │ └─────────────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────┘ │
|
||||
│ │
|
||||
│ 头部颜色: │
|
||||
│ ┌───┐┌───┐┌───┐┌───┐┌───┐ [颜色选择器] │
|
||||
│ │ ● ││ ● ││ ● ││ ● ││ ● │ │
|
||||
│ └───┘└───┘└───┘└───┘└───┘ │
|
||||
│ │
|
||||
│ 身体颜色: │
|
||||
│ ┌───┐┌───┐┌───┐┌───┐┌───┐ [颜色选择器] │
|
||||
│ │ ● ││ ● ││ ● ││ ● ││ ● │ │
|
||||
│ └───┘└───┘└───┘└───┘└───┘ │
|
||||
│ │
|
||||
│ 脚部颜色: │
|
||||
│ ┌───┐┌───┐┌───┐┌───┐┌───┐ [颜色选择器] │
|
||||
│ │ ● ││ ● ││ ● ││ ● ││ ● │ │
|
||||
│ └───┘└───┘└───┘└───┘└───┘ │
|
||||
│ │
|
||||
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
|
||||
│ │ 重置 │ │ 随机生成 │ │ 保存 │ │
|
||||
│ └─────────┘ └─────────┘ └─────────┘ │
|
||||
└─────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 动画时序设计
|
||||
|
||||
**界面切换动画序列**:
|
||||
1. 用户点击"自定义外观"按钮 (0ms)
|
||||
2. 开始淡出动画:创建按钮和名称输入框 (0-300ms)
|
||||
3. 开始滑入动画:自定义界面从右侧滑入 (200-500ms)
|
||||
4. 完成所有动画,自定义界面完全显示 (500ms)
|
||||
|
||||
**颜色更新动画**:
|
||||
1. 用户选择新颜色 (0ms)
|
||||
2. 触发颜色变化事件 (0-10ms)
|
||||
3. 开始预览更新动画 (10-60ms)
|
||||
4. 完成颜色过渡效果 (60-100ms)
|
||||
|
||||
### 性能优化
|
||||
|
||||
**渲染优化**:
|
||||
- 使用对象池管理颜色按钮
|
||||
- 延迟加载颜色选择器
|
||||
- 缓存预览渲染结果
|
||||
|
||||
**内存优化**:
|
||||
- 及时释放未使用的UI元素
|
||||
- 使用弱引用避免循环引用
|
||||
- 压缩颜色预设数据
|
||||
|
||||
**响应性优化**:
|
||||
- 异步处理颜色计算
|
||||
- 使用防抖机制减少频繁更新
|
||||
- 优先处理用户交互事件
|
||||
|
||||
## 扩展性考虑
|
||||
|
||||
### 未来功能预留
|
||||
|
||||
**更多自定义选项**:
|
||||
- 发型选择
|
||||
- 服装样式
|
||||
- 配饰系统
|
||||
- 表情自定义
|
||||
|
||||
**高级功能**:
|
||||
- 外观模板保存/加载
|
||||
- 社区外观分享
|
||||
- AI辅助外观生成
|
||||
- 外观历史记录
|
||||
|
||||
### 数据结构扩展
|
||||
|
||||
**版本化数据格式**:
|
||||
```gdscript
|
||||
{
|
||||
"version": "2.0",
|
||||
"appearance": {
|
||||
"head": {
|
||||
"color": "#F5DEB3",
|
||||
"style": "default",
|
||||
"accessories": []
|
||||
},
|
||||
"body": {
|
||||
"color": "#4169E1",
|
||||
"clothing": "shirt",
|
||||
"pattern": "solid"
|
||||
},
|
||||
"foot": {
|
||||
"color": "#8B4513",
|
||||
"shoe_type": "sneakers"
|
||||
}
|
||||
},
|
||||
"metadata": {
|
||||
"created_at": 1234567890,
|
||||
"last_modified": 1234567890,
|
||||
"tags": ["custom", "colorful"]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### API设计
|
||||
|
||||
**外观系统API**:
|
||||
```gdscript
|
||||
# 外观管理器接口
|
||||
class_name AppearanceManager
|
||||
|
||||
static func create_customizer() -> AppearanceCustomizer
|
||||
static func register_part_adjuster(part: String, adjuster: ColorAdjuster) -> void
|
||||
static func get_supported_parts() -> Array[String]
|
||||
static func validate_appearance_data(data: Dictionary, version: String) -> bool
|
||||
static func migrate_appearance_data(data: Dictionary, from_version: String, to_version: String) -> Dictionary
|
||||
```
|
||||
|
||||
这种设计确保了系统的可扩展性,为未来添加更多自定义功能提供了坚实的基础。
|
||||
116
.kiro/specs/character-appearance-customization/requirements.md
Normal file
116
.kiro/specs/character-appearance-customization/requirements.md
Normal file
@@ -0,0 +1,116 @@
|
||||
# 角色外观自定义系统需求文档
|
||||
|
||||
## 简介
|
||||
|
||||
本项目旨在为现有的 Godot AI 小镇游戏添加完善的角色外观自定义功能。用户可以在角色创建流程中自定义角色的外观,包括头部、身体、脚部等部位的颜色,并通过流畅的UI动效提升用户体验。
|
||||
|
||||
## 术语表
|
||||
|
||||
- **角色创建系统 (Character Creation System)**: 处理新角色创建的完整系统
|
||||
- **外观自定义界面 (Appearance Customization UI)**: 专门用于自定义角色外观的用户界面
|
||||
- **默认外观 (Default Appearance)**: 系统自动生成的初始角色外观
|
||||
- **自定义外观按钮 (Customize Appearance Button)**: 触发外观自定义界面的按钮
|
||||
- **动效隐藏 (Animated Hide)**: 通过动画效果隐藏UI元素的过程
|
||||
- **场景切换 (Scene Transition)**: 从一个界面切换到另一个界面的过程
|
||||
- **外观按钮 (Appearance Button)**: 自定义界面中用于调整外观的按钮
|
||||
- **颜色调整器 (Color Adjuster)**: 用于调整身体部位颜色的UI组件
|
||||
- **返回按钮 (Back Button)**: 用于返回上一个界面的按钮
|
||||
- **外观应用 (Appearance Application)**: 将自定义的外观应用到角色的过程
|
||||
|
||||
## 需求
|
||||
|
||||
### 需求 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 使用淡出或滑动动画效果,持续时间不超过0.5秒
|
||||
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
|
||||
|
||||
**用户故事:** 作为用户,我希望自定义界面有明显的返回按钮而不是关闭符号,以便我能够清楚地知道如何返回到上一个界面。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 自定义界面显示 THEN 外观自定义界面 SHALL 在显眼位置显示"返回"按钮
|
||||
2. WHEN 返回按钮设计 THEN 外观自定义界面 SHALL 使用文字"返回"而不是"×"符号
|
||||
3. WHEN 返回按钮样式设计 THEN 外观自定义界面 SHALL 确保按钮足够大且易于点击
|
||||
4. WHEN 用户查看界面 THEN 外观自定义界面 SHALL 确保返回按钮在视觉上突出且易于识别
|
||||
5. WHEN 返回按钮位置确定 THEN 外观自定义界面 SHALL 将按钮放置在用户习惯的位置(如左上角或底部)
|
||||
|
||||
### 需求 5
|
||||
|
||||
**用户故事:** 作为用户,我希望从自定义界面返回后,点击创建角色按钮时角色能够应用我调整后的外观,以便我的自定义设置能够生效。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 用户点击返回按钮 THEN 外观自定义界面 SHALL 保存当前的外观设置
|
||||
2. WHEN 返回到角色创建界面 THEN 角色创建系统 SHALL 显示应用了自定义外观的角色预览
|
||||
3. WHEN 用户点击创建角色按钮 THEN 角色创建系统 SHALL 使用自定义的外观数据创建角色
|
||||
4. WHEN 角色创建完成 THEN 角色创建系统 SHALL 确保游戏中的角色显示自定义的外观
|
||||
5. WHEN 外观数据传递 THEN 角色创建系统 SHALL 正确序列化和传递外观数据到游戏系统
|
||||
|
||||
### 需求 6
|
||||
|
||||
**用户故事:** 作为用户,我希望整个自定义流程具有良好的用户体验,包括流畅的动画、清晰的视觉反馈和直观的操作方式。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 用户执行任何操作 THEN 外观自定义界面 SHALL 提供即时的视觉反馈
|
||||
2. WHEN 界面元素加载 THEN 外观自定义界面 SHALL 使用平滑的动画效果
|
||||
3. WHEN 用户调整颜色 THEN 外观自定义界面 SHALL 实时更新预览,延迟不超过100毫秒
|
||||
4. WHEN 用户操作出错 THEN 外观自定义界面 SHALL 显示友好的错误提示信息
|
||||
5. WHEN 界面在移动设备显示 THEN 外观自定义界面 SHALL 适配触摸操作,按钮大小合适
|
||||
|
||||
### 需求 7
|
||||
|
||||
**用户故事:** 作为开发者,我希望外观自定义系统具有良好的扩展性,以便未来可以添加更多自定义选项。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 系统架构设计 THEN 外观自定义界面 SHALL 使用模块化的组件设计
|
||||
2. WHEN 添加新的自定义选项 THEN 外观自定义界面 SHALL 支持动态添加新的调整控件
|
||||
3. WHEN 外观数据结构设计 THEN 角色创建系统 SHALL 使用可扩展的数据格式存储外观信息
|
||||
4. WHEN 预览系统设计 THEN 外观自定义界面 SHALL 支持渲染不同类型的外观元素
|
||||
5. WHEN 代码组织 THEN 外观自定义界面 SHALL 将不同功能模块分离,便于维护和扩展
|
||||
|
||||
### 需求 8
|
||||
|
||||
**用户故事:** 作为用户,我希望能够重置外观设置或使用随机生成功能,以便快速尝试不同的外观组合。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 自定义界面显示 THEN 外观自定义界面 SHALL 提供"重置"按钮恢复默认外观
|
||||
2. WHEN 用户点击重置按钮 THEN 外观自定义界面 SHALL 将所有设置恢复到进入界面时的状态
|
||||
3. WHEN 自定义界面显示 THEN 外观自定义界面 SHALL 提供"随机生成"按钮
|
||||
4. WHEN 用户点击随机生成 THEN 外观自定义界面 SHALL 为所有部位生成随机但协调的颜色
|
||||
5. WHEN 随机生成完成 THEN 外观自定义界面 SHALL 立即更新预览显示新的外观
|
||||
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