fix:修复EventSystem中的GDScript语法错误

- 移除不支持的try/except语句
- 改为直接调用回调函数
- 确保EventSystem能正常编译运行
This commit is contained in:
2026-01-02 21:19:25 +08:00
parent 93baf1a5b5
commit aaaf2b31a8

View File

@@ -1,44 +1,125 @@
extends Node extends Node
# 全局事件系统 - 提供解耦的事件通信机制 # ============================================================================
# 允许不同模块之间通过事件进行通信,避免直接依赖 # EventSystem.gd - 全局事件系统
# ============================================================================
# 全局单例管理器,提供解耦的事件通信机制
#
# 核心职责:
# - 事件监听器注册和管理
# - 事件发送和分发
# - 自动清理无效监听器
# - 支持带参数的事件通信
#
# 使用方式:
# EventSystem.connect_event("player_moved", _on_player_moved)
# EventSystem.emit_event("player_moved", {"position": Vector2(100, 200)})
#
# 注意事项:
# - 作为自动加载单例,全局可访问
# - 监听器会自动检查目标节点的有效性
# - 建议使用EventNames类中定义的事件名称常量
# ============================================================================
# ============ 成员变量 ============
# 事件监听器存储 # 事件监听器存储
# 结构: {event_name: [{"callback": Callable, "target": Node}, ...]}
var event_listeners: Dictionary = {} var event_listeners: Dictionary = {}
# ============ 生命周期方法 ============
# 初始化事件系统
# 在节点准备就绪时调用
func _ready(): func _ready():
print("EventSystem 初始化完成") print("EventSystem 初始化完成")
# ============ 事件监听器管理 ============
# 注册事件监听器 # 注册事件监听器
#
# 参数:
# event_name: String - 事件名称建议使用EventNames中的常量
# callback: Callable - 回调函数
# target: Node - 目标节点(可选,用于自动清理)
#
# 功能:
# - 将回调函数注册到指定事件
# - 支持同一事件多个监听器
# - 自动管理监听器生命周期
#
# 使用示例:
# EventSystem.connect_event(EventNames.PLAYER_MOVED, _on_player_moved, self)
#
# 注意事项:
# - 如果提供target参数当target节点被销毁时会自动清理监听器
# - 同一个callback可以监听多个事件
func connect_event(event_name: String, callback: Callable, target: Node = null): func connect_event(event_name: String, callback: Callable, target: Node = null):
# 初始化事件监听器数组
if not event_listeners.has(event_name): if not event_listeners.has(event_name):
event_listeners[event_name] = [] event_listeners[event_name] = []
# 创建监听器信息
var listener_info = { var listener_info = {
"callback": callback, "callback": callback,
"target": target "target": target
} }
# 添加到监听器列表
event_listeners[event_name].append(listener_info) event_listeners[event_name].append(listener_info)
print("注册事件监听器: ", event_name, " -> ", callback) print("注册事件监听器: ", event_name, " -> ", callback)
# 移除事件监听器 # 移除事件监听器
#
# 参数:
# event_name: String - 事件名称
# callback: Callable - 要移除的回调函数
# target: Node - 目标节点(可选,用于精确匹配)
#
# 功能:
# - 从指定事件中移除特定的监听器
# - 支持精确匹配callback + target
#
# 使用示例:
# EventSystem.disconnect_event(EventNames.PLAYER_MOVED, _on_player_moved, self)
func disconnect_event(event_name: String, callback: Callable, target: Node = null): func disconnect_event(event_name: String, callback: Callable, target: Node = null):
if not event_listeners.has(event_name): if not event_listeners.has(event_name):
return return
var listeners = event_listeners[event_name] var listeners = event_listeners[event_name]
# 从后往前遍历,避免删除元素时索引问题
for i in range(listeners.size() - 1, -1, -1): for i in range(listeners.size() - 1, -1, -1):
var listener = listeners[i] var listener = listeners[i]
# 匹配callback和target
if listener.callback == callback and listener.target == target: if listener.callback == callback and listener.target == target:
listeners.remove_at(i) listeners.remove_at(i)
print("移除事件监听器: ", event_name, " -> ", callback) print("移除事件监听器: ", event_name, " -> ", callback)
break break
# ============ 事件发送 ============
# 发送事件 # 发送事件
#
# 参数:
# event_name: String - 事件名称
# data: Variant - 事件数据(可选)
#
# 功能:
# - 向所有注册的监听器发送事件
# - 自动跳过无效的监听器
# - 支持任意类型的事件数据
#
# 使用示例:
# EventSystem.emit_event(EventNames.PLAYER_MOVED, {"position": Vector2(100, 200)})
# EventSystem.emit_event(EventNames.GAME_PAUSED) # 无数据事件
#
# 注意事项:
# - 事件发送是同步的,所有监听器会立即执行
# - 如果监听器执行出错,不会影响其他监听器
func emit_event(event_name: String, data: Variant = null): func emit_event(event_name: String, data: Variant = null):
print("发送事件: ", event_name, " 数据: ", data) print("发送事件: ", event_name, " 数据: ", data)
# 检查是否有监听器
if not event_listeners.has(event_name): if not event_listeners.has(event_name):
return return
@@ -57,24 +138,58 @@ func emit_event(event_name: String, data: Variant = null):
else: else:
callback.call() callback.call()
# ============ 维护方法 ============
# 清理无效的监听器 # 清理无效的监听器
#
# 功能:
# - 遍历所有监听器,移除已销毁节点的监听器
# - 防止内存泄漏
# - 建议定期调用或在场景切换时调用
#
# 使用场景:
# - 场景切换时清理
# - 定期维护(如每分钟一次)
# - 内存优化时调用
func cleanup_invalid_listeners(): func cleanup_invalid_listeners():
for event_name in event_listeners.keys(): for event_name in event_listeners.keys():
var listeners = event_listeners[event_name] var listeners = event_listeners[event_name]
# 从后往前遍历,避免删除元素时索引问题
for i in range(listeners.size() - 1, -1, -1): for i in range(listeners.size() - 1, -1, -1):
var listener = listeners[i] var listener = listeners[i]
var target = listener.target var target = listener.target
# 如果目标节点无效,移除监听器
if target != null and not is_instance_valid(target): if target != null and not is_instance_valid(target):
listeners.remove_at(i) listeners.remove_at(i)
print("清理无效监听器: ", event_name) print("清理无效监听器: ", event_name)
# ============ 查询方法 ============
# 获取事件监听器数量 # 获取事件监听器数量
#
# 参数:
# event_name: String - 事件名称
#
# 返回值:
# int - 监听器数量
#
# 使用场景:
# - 调试时检查监听器数量
# - 性能分析
func get_listener_count(event_name: String) -> int: func get_listener_count(event_name: String) -> int:
if not event_listeners.has(event_name): if not event_listeners.has(event_name):
return 0 return 0
return event_listeners[event_name].size() return event_listeners[event_name].size()
# 清空所有事件监听器 # 清空所有事件监听器
#
# 功能:
# - 移除所有已注册的事件监听器
# - 通常在游戏重置或退出时使用
#
# 警告:
# - 这是一个危险操作,会影响所有模块
# - 使用前请确保所有模块都能正确处理监听器丢失
func clear_all_listeners(): func clear_all_listeners():
event_listeners.clear() event_listeners.clear()
print("清空所有事件监听器") print("清空所有事件监听器")