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 ParticleObserver struct { // we only have one particle so far, if we use multiple ones, turn // this in to a map, see player_observer.go for an example Entity ecs.Entity } // Create a new resource of type PlayerObserver which will hold all // player 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 NewParticleObserver(world *ecs.World) { observer := &ParticleObserver{} resmanger := generic.NewResource[ParticleObserver](world) resmanger.Add(observer) listen := listener.NewCallback( func(world *ecs.World, event ecs.EntityEvent) { observerID := ecs.ResourceID[ParticleObserver](world) observer := world.Resources().Get(observerID).(*ParticleObserver) observer.RemoveEntity(event.Entity) }, event.EntityRemoved, ) world.SetListener(&listen) } func GetParticleObserver(world *ecs.World) *ParticleObserver { observerID := ecs.ResourceID[ParticleObserver](world) observer := world.Resources().Get(observerID).(*ParticleObserver) return observer } func (observer *ParticleObserver) AddEntity(entity ecs.Entity) { observer.Entity = entity } func (observer *ParticleObserver) RemoveEntity(entity ecs.Entity) { observer.Entity = ecs.Entity{} }