43 lines
1.4 KiB
GDScript
43 lines
1.4 KiB
GDScript
## EventBus — 全局事件总线(Autoload: EventBus)
|
||
## 权威接口定义:architecture_design.md §6.2
|
||
##
|
||
## 使用约定:
|
||
## - 订阅:EventBus.subscribe(EventID.ENEMY_KILLED, _on_enemy_killed)
|
||
## - 发送:EventBus.emit(EventID.ENEMY_KILLED, {"entity_id": id})
|
||
## - 取消:EventBus.unsubscribe(EventID.ENEMY_KILLED, _on_enemy_killed)
|
||
extends Node
|
||
|
||
var _listeners: Dictionary = {} # { event_id: int → Array[Callable] }
|
||
|
||
func subscribe(event_id: int, callback: Callable) -> void:
|
||
if not _listeners.has(event_id):
|
||
_listeners[event_id] = []
|
||
var arr: Array = _listeners[event_id]
|
||
if not arr.has(callback):
|
||
arr.append(callback)
|
||
|
||
func unsubscribe(event_id: int, callback: Callable) -> void:
|
||
if not _listeners.has(event_id):
|
||
return
|
||
_listeners[event_id].erase(callback)
|
||
|
||
func emit(event_id: int, payload: Dictionary = {}) -> void:
|
||
if not _listeners.has(event_id):
|
||
return
|
||
var arr: Array = _listeners[event_id]
|
||
# 逆序迭代防止回调内部 unsubscribe 导致跳过
|
||
for i in range(arr.size() - 1, -1, -1):
|
||
arr[i].call(payload)
|
||
|
||
## C# 批量通知接口:一次调用发送多个事件(ADR-L1 规则3)
|
||
## events: Array of [event_id: int, payload: Dictionary]
|
||
func emit_batch(events: Array) -> void:
|
||
for ev in events:
|
||
var eid: int = ev[0]
|
||
var pay: Dictionary = ev[1] if ev.size() > 1 else {}
|
||
emit(eid, pay)
|
||
|
||
## 清空所有订阅(关卡结束 / 场景切换时调用)
|
||
func reset() -> void:
|
||
_listeners.clear()
|