package observers import ( "github.com/mlange-42/arche/ecs" "github.com/mlange-42/arche/ecs/event" "github.com/mlange-42/arche/generic" "github.com/mlange-42/arche/listener" ) // will be added as an ecs.Resource to the world so we can use it in // CollisionSystem to dynamically make it appear or disappear type EntityObserver struct { // we only have one obstacle so far, if we use multiple ones, turn // this in to a map, see player_observer.go for an example Entities map[ecs.Entity]int } func NewEntityObserver(world *ecs.World) { observer := &EntityObserver{} observer.Entities = make(map[ecs.Entity]int) resmanger := generic.NewResource[EntityObserver](world) resmanger.Add(observer) listen := listener.NewCallback( func(world *ecs.World, event ecs.EntityEvent) { observerID := ecs.ResourceID[EntityObserver](world) observer := world.Resources().Get(observerID).(*EntityObserver) observer.RemoveEntity(event.Entity) }, event.EntityRemoved, ) world.SetListener(&listen) } func GetEntityObserver(world *ecs.World) *EntityObserver { observerID := ecs.ResourceID[EntityObserver](world) observer := world.Resources().Get(observerID).(*EntityObserver) return observer } func (observer *EntityObserver) AddEntity(entity ecs.Entity) { observer.Entities[entity] = 1 } func (observer *EntityObserver) RemoveEntity(entity ecs.Entity) { observer.Entities = make(map[ecs.Entity]int) }