forked from datawhale/whale-town-front
## 📋 新增内容 添加了完整的 Claude Code 开发规范文档,包括: ### 核心规范 - **项目概述**: 2D 俯视像素风 RPG 游戏架构 - **编码标准**: - 严格类型系统 - 统一命名规范(PascalCase, snake_case, SCREAMING_SNAKE_CASE) - 节点访问规范(@onready, %UniqueName) - 最佳实践(await, Callable, Signal Up/Call Down) ### 架构规则 - **解耦原则**: 低层级实体通过 EventSystem 通信 - **场景管理**: 统一使用 SceneManager.change_scene() - **组件化**: 可复用逻辑封装到 Scenes/Components/ ### 实现规范 - **实体结构**: - Player: CharacterBody2D + Camera2D - NPC: StaticBody2D/CharacterBody2D + InteractionArea - Interactables: 共享 InteractableComponent - **交互系统**: 通过 EventSystem.notify_interaction_triggered() - **TileMap 规则**: 分层设计(地面、障碍、装饰) ### 文件组织 - 地图: Scenes/Maps/[map_name].tscn - 实体: Scenes/Entities/[entity_name]/[entity_name].tscn - 脚本: 与场景文件同目录 - 资源: res://Assets/Sprites/ ### 测试标准 - 使用 GUT 测试框架 - 测试文件位置: res://test/unit/ 或 res://test/integration/ - 文件命名: test_*.gd - 核心逻辑必须有单元测试 - 玩家移动和 NPC 交互需要集成测试 ### 开发理念 - 简约至上:函数单一职责 - "栅栏后规则": 即使不可见的代码也要干净优美 - 反馈循环:每个交互都要有特效/音效占位 - 零硬编码:所有路径和配置使用常量或 @export - "自动工作"的相机:自动检测 TileMap 边界 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
4.2 KiB
4.2 KiB
Claude Code Rules - Godot 4.x Town Project
Project Overview
A 2D top-down pixel art RPG built in Godot 4.x using a layered architecture.
- Core:
_Core/(SceneManager, EventSystem, GameManager) - Gameplay:
Scenes/(Maps, Entities, Components) - UI:
UI/(Windows, Overlays)
Coding Standards (GDScript)
- Type Safety: Use static typing strictly (e.g.,
var speed: float = 100.0,func _ready() -> void). - Naming Conventions:
- Classes:
PascalCase(usingclass_name). - Variables/Functions:
snake_case. - Constants:
SCREAMING_SNAKE_CASE. - Signals:
snake_case(e.g.,signal player_interacted(data)).
- Classes:
- Node Access: Use
@onready var name = $Pathor%UniqueName. Prefer%UniqueNamefor UI and internal scene components. - Best Practices:
- Use
awaitfor signals and timers instead ofyield. - Use
Callablefor callbacks. - Follow the "Signal Up, Call Down" rule: Parent calls methods on children; children emit signals to parents.
- Use
Input.get_vector("left", "right", "up", "down")for 2D movement.
- Use
Project Architecture Rules
- Decoupling: Never reference singleton managers directly in low-level entities. Use
EventSystemto communicate across modules. - Scene Management: All scene transitions must go through
SceneManager.change_scene(scene_key). - Components: Logic like "Health", "Interactions", or "Movement" should be encapsulated in
Scenes/Components/as reusable nodes.
Implementation Specifics (Town Map)
1. Entity Structure
- Player: Must be a
CharacterBody2D. Include aCamera2Dwithposition_smoothing_enabled = true. - NPC: Must be a
StaticBody2DorCharacterBody2Dwith anArea2DnamedInteractionArea. - Interactables: Use a shared
InteractableComponent(Area2D based) for building entrances and NPCs.
2. Interaction System
- NPC/Entrance interaction must trigger via
EventSystem. - Interaction logic:
- Player enters
InteractionArea. - Player presses "E" or "UI_Accept".
- Emit
EventSystem.notify_interaction_triggered(interactable_data).
- Player enters
3. TileMap Rules
- Use
TileMap(orTileMapLayerif Godot 4.3+). - Layer 0: Ground (No collision).
- Layer 1: Obstacles/Walls (With Physics Layer collision).
- Layer 2: Decorations (Y-Sort enabled).
File Organization
- New maps:
Scenes/Maps/[map_name].tscn - New entities:
Scenes/Entities/[entity_name]/[entity_name].tscn - New scripts: Same folder as their scene files.
- Assets: Always reference assets from
res://Assets/Sprites/.
Command Reference
- Build/Run:
godot --path . - Export (Linux):
godot --path . --export-release "Linux/X11"
Testing Standards
- Framework: Use GUT (Godot Unit Test) for all tests.
- Test Location: All test scripts must be in
res://test/unit/orres://test/integration/. - File Naming: Test files must start with
test_and end with.gd(e.g.,test_player_movement.gd). - Class Structure: Every test file must
extends GutTest. - Requirements:
- Every new core logic (in
_Core) must have a corresponding unit test. - Player movement and NPC interactions must have integration tests using
yield_fororawait. - Use
assert_eq,assert_true, andassert_signal_emittedfor validations.
- Every new core logic (in
Commands
- Run all tests:
godot --headless -s addons/gut/gut_cmdline.gd -gdir=res://test/ -ginclude_subdirs - Run specific test:
godot --headless -s addons/gut/gut_cmdline.gd -gtest=res://test/unit/test_example.gd
The Zen of Development (Pro Tips)
- Simplicity is the ultimate sophistication: If a function does two things, it's one thing too many. Split it.
- The "Back of the Fence" Rule: Even parts the player never sees (like the EventSystem logic) must be clean and beautiful. No "quick hacks".
- Feedback Loop: Every interaction MUST have a placeholder for juice (Tween, Sound, or Particle). Code is the skeleton, but juice is the soul.
- Zero Hard-Coding: All paths, configuration values, and magic numbers must be defined as constants or @export variables.
- The "It Just Works" Camera: Camera logic must automatically find TileMap limits. The player should never see the "gray void" outside the map.