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 ObstacleObserver 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 } // Create a new resource of type PlayerObserver which will hold all // obstacle entities. We also add a Listener which looks for // EntityRemoved events and if a player gets removed, we also remove // it from the Entity map in our observer. func NewObstacleObserver(world *ecs.World) { observer := &ObstacleObserver{} observer.Entities = make(map[ecs.Entity]int) resmanger := generic.NewResource[ObstacleObserver](world) resmanger.Add(observer) listen := listener.NewCallback( func(world *ecs.World, event ecs.EntityEvent) { observerID := ecs.ResourceID[ObstacleObserver](world) observer := world.Resources().Get(observerID).(*ObstacleObserver) observer.RemoveEntity(event.Entity) }, event.EntityRemoved, ) world.SetListener(&listen) } func GetObstacleObserver(world *ecs.World) *ObstacleObserver { observerID := ecs.ResourceID[ObstacleObserver](world) observer := world.Resources().Get(observerID).(*ObstacleObserver) return observer } func (observer *ObstacleObserver) AddEntity(entity ecs.Entity) { observer.Entities[entity] = 1 } func (observer *ObstacleObserver) RemoveEntity(entity ecs.Entity) { observer.Entities = make(map[ecs.Entity]int) }