forked from datawhale/whale-town-front
## 🏗️ 主要变更 ### 目录结构重构 - 将 core/ 迁移到 _Core/(框架层) - 将 scenes/ 重构为 Scenes/(玩法层)和 UI/(界面层) - 将 data/ 迁移到 Config/(配置层) - 添加 Assets/ 资源层和 Utils/ 工具层 - 将 scripts/ 迁移到 tools/(开发工具) ### 架构分层 - **_Core/**: 框架层 - 全局单例和管理器 - **Scenes/**: 玩法层 - 游戏场景和实体 - **UI/**: 界面层 - HUD、窗口、对话系统 - **Assets/**: 资源层 - 精灵图、音频、字体 - **Config/**: 配置层 - 游戏配置和本地化 - **Utils/**: 工具层 - 通用辅助脚本 ### 文件更新 - 更新 project.godot 中的所有路径引用 - 更新自动加载脚本路径 - 更新测试文件的引用路径 - 添加 REFACTORING.md 详细说明 - 添加 MIGRATION_COMPLETE.md 迁移完成标记 - 更新 README.md 反映新架构 ### 设计原则 - ✅ 清晰的分层(框架/玩法/界面) - ✅ 场景内聚(脚本紧邻场景文件) - ✅ 组件化设计(可复用组件) - ✅ 职责单一(每个目录职责明确) ## 📋 详细信息 查看 REFACTORING.md 了解完整的重构说明和迁移映射表 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
81 lines
2.3 KiB
GDScript
81 lines
2.3 KiB
GDScript
extends Node
|
|
|
|
# 全局事件系统 - 提供解耦的事件通信机制
|
|
# 允许不同模块之间通过事件进行通信,避免直接依赖
|
|
|
|
# 事件监听器存储
|
|
var event_listeners: Dictionary = {}
|
|
|
|
func _ready():
|
|
print("EventSystem 初始化完成")
|
|
|
|
# 注册事件监听器
|
|
func connect_event(event_name: String, callback: Callable, target: Node = null):
|
|
if not event_listeners.has(event_name):
|
|
event_listeners[event_name] = []
|
|
|
|
var listener_info = {
|
|
"callback": callback,
|
|
"target": target
|
|
}
|
|
|
|
event_listeners[event_name].append(listener_info)
|
|
print("注册事件监听器: ", event_name, " -> ", callback)
|
|
|
|
# 移除事件监听器
|
|
func disconnect_event(event_name: String, callback: Callable, target: Node = null):
|
|
if not event_listeners.has(event_name):
|
|
return
|
|
|
|
var listeners = event_listeners[event_name]
|
|
for i in range(listeners.size() - 1, -1, -1):
|
|
var listener = listeners[i]
|
|
if listener.callback == callback and listener.target == target:
|
|
listeners.remove_at(i)
|
|
print("移除事件监听器: ", event_name, " -> ", callback)
|
|
break
|
|
|
|
# 发送事件
|
|
func emit_event(event_name: String, data: Variant = null):
|
|
print("发送事件: ", event_name, " 数据: ", data)
|
|
|
|
if not event_listeners.has(event_name):
|
|
return
|
|
|
|
var listeners = event_listeners[event_name]
|
|
for listener_info in listeners:
|
|
var target = listener_info.target
|
|
var callback = listener_info.callback
|
|
|
|
# 检查目标节点是否仍然有效
|
|
if target != null and not is_instance_valid(target):
|
|
continue
|
|
|
|
# 调用回调函数
|
|
if data != null:
|
|
callback.call(data)
|
|
else:
|
|
callback.call()
|
|
|
|
# 清理无效的监听器
|
|
func cleanup_invalid_listeners():
|
|
for event_name in event_listeners.keys():
|
|
var listeners = event_listeners[event_name]
|
|
for i in range(listeners.size() - 1, -1, -1):
|
|
var listener = listeners[i]
|
|
var target = listener.target
|
|
if target != null and not is_instance_valid(target):
|
|
listeners.remove_at(i)
|
|
print("清理无效监听器: ", event_name)
|
|
|
|
# 获取事件监听器数量
|
|
func get_listener_count(event_name: String) -> int:
|
|
if not event_listeners.has(event_name):
|
|
return 0
|
|
return event_listeners[event_name].size()
|
|
|
|
# 清空所有事件监听器
|
|
func clear_all_listeners():
|
|
event_listeners.clear()
|
|
print("清空所有事件监听器")
|