package systems import ( "fmt" "image" . "openquell/components" "github.com/hajimehoshi/ebiten/v2" "github.com/mlange-42/arche/ecs" "github.com/mlange-42/arche/generic" ) type CollectibleSystem struct { World *ecs.World Selector *generic.Filter3[Position, Collectible, Renderable] EntitiesToRemove []ecs.Entity } func NewCollectibleSystem(world *ecs.World) *CollectibleSystem { system := &CollectibleSystem{ Selector: generic.NewFilter3[Position, Collectible, Renderable](), World: world, } return system } func (system *CollectibleSystem) CheckPlayerCollision( playerposition *Position, playervelocity *Velocity) (bool, image.Point) { particle_pos := image.Point{} var bumped bool query := system.Selector.Query(system.World) for query.Next() { colposition, collectible, _ := query.Get() ok, _ := playerposition.Intersects(colposition, playervelocity) if ok { fmt.Printf("bumped into collectible %v\n", collectible) system.EntitiesToRemove = append(system.EntitiesToRemove, query.Entity()) particle_pos.X = colposition.X particle_pos.Y = colposition.Y bumped = true } } return bumped, particle_pos } func (system *CollectibleSystem) Update() { // remove collectible if collected for _, entity := range system.EntitiesToRemove { system.World.RemoveEntity(entity) } system.EntitiesToRemove = []ecs.Entity{} } func (system *CollectibleSystem) Draw(screen *ebiten.Image) { // write the movable tiles op := &ebiten.DrawImageOptions{} query := system.Selector.Query(system.World) for query.Next() { pos, _, sprite := query.Get() op.GeoM.Reset() op.GeoM.Translate(float64(pos.X), float64(pos.Y)) screen.DrawImage(sprite.Image, op) } }