54 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 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{}
 | |
| }
 |