jl-ecs/events.go

103 lines
2.5 KiB
Go
Raw Normal View History

2023-08-04 11:02:08 +08:00
package ecs
2023-08-31 16:19:41 +08:00
import (
"reflect"
"github.com/yohamta/donburi"
"github.com/yohamta/donburi/features/events"
)
// 注意事件相关操作的最终执行者均为world协程
// 事件相关定义
2023-08-04 11:02:08 +08:00
type (
2023-08-31 16:19:41 +08:00
// 事件类型定义
2023-08-04 11:02:08 +08:00
EventType[T any] struct {
2023-08-31 16:19:41 +08:00
et *events.EventType[T]
subscriberMap map[uintptr]events.Subscriber[T]
chanToWorld chan<- ManageEventFunc
2023-08-04 11:02:08 +08:00
}
2023-08-31 16:19:41 +08:00
// 事件订阅者定义
Subscriber[T any] func(w World, event T)
// 事件管理回调定义
ManageEventFunc func()
2023-08-04 11:02:08 +08:00
)
2023-08-31 16:19:41 +08:00
func init() {
//开启事件处理调试
events.Debug = true
}
// 创建事件类型的实例
func NewEventType[T any](w World) *EventType[T] {
return &EventType[T]{
et: events.NewEventType[T](),
subscriberMap: make(map[uintptr]events.Subscriber[T]),
chanToWorld: w.(*world).chanManageEvent,
}
}
// 迭代处理所有事件
// 在world协程中执行
func processAllEvents(w World) {
events.ProcessAllEvents(w.(*world).world)
}
// 订阅该类型的事件
func (me *EventType[T]) Subscribe(wd World, subscriber Subscriber[T]) {
if wd.GoroutineId() == currentGoId() {
me.subscribe(wd, subscriber)
} else {
me.chanToWorld <- func() {
me.subscribe(wd, subscriber)
}
}
}
// 取消订阅该类型的事件
func (me *EventType[T]) Unsubscribe(wd World, subscriber Subscriber[T]) {
if wd.GoroutineId() == currentGoId() {
me.unsubscribe(wd, subscriber)
} else {
me.chanToWorld <- func() {
me.unsubscribe(wd, subscriber)
}
}
}
// 发布该类型的事件
func (me *EventType[T]) Publish(wd World, event *T) {
if wd.GoroutineId() == currentGoId() {
me.publish(wd, event)
} else {
me.chanToWorld <- func() {
me.publish(wd, event)
}
}
}
///////////////////////////////////////////////////////////////////////////////////
// 订阅该类型的事件
func (me *EventType[T]) subscribe(wd World, subscriber Subscriber[T]) {
wdSubscriberPointer := reflect.ValueOf(subscriber).Pointer()
me.subscriberMap[wdSubscriberPointer] = func(w donburi.World, event T) {
subscriber(wd, event)
}
me.et.Subscribe(wd.(*world).world, me.subscriberMap[wdSubscriberPointer])
}
// 取消订阅该类型的事件
func (me *EventType[T]) unsubscribe(wd World, subscriber Subscriber[T]) {
wdSubscriberPointer := reflect.ValueOf(subscriber).Pointer()
if sub, ok := me.subscriberMap[wdSubscriberPointer]; ok {
me.et.Unsubscribe(wd.(*world).world, sub)
delete(me.subscriberMap, wdSubscriberPointer)
}
}
// 发布该类型的事件
func (me *EventType[T]) publish(wd World, event *T) {
me.et.Publish(wd.(*world).world, *event)
}