From 51d61ba605cd49859baa7914b65501a4ef246483 Mon Sep 17 00:00:00 2001 From: Marvin Blum Date: Fri, 6 May 2016 17:30:43 +0200 Subject: [PATCH] Convenience function to addd and remove actors to or from systems. --- demo/sprite/sprite.go | 3 +-- sprite.go | 11 ++--------- system.go | 45 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 11 deletions(-) diff --git a/demo/sprite/sprite.go b/demo/sprite/sprite.go index ef13484..a226371 100644 --- a/demo/sprite/sprite.go +++ b/demo/sprite/sprite.go @@ -24,8 +24,7 @@ func (g *Game) Setup() { } sprite := goga.NewSprite(tex) - renderer := goga.GetSystemByName("spriteRenderer") - renderer.Add(sprite) + goga.AddActor(sprite) } func (g *Game) Update(delta float64) { diff --git a/sprite.go b/sprite.go index e237cda..a9426c7 100644 --- a/sprite.go +++ b/sprite.go @@ -101,20 +101,13 @@ func (s *SpriteRenderer) Add(actor interface{}) bool { // Removes sprite from renderer. func (s *SpriteRenderer) Remove(actor interface{}) bool { - sprite, ok := actor.(Sprite) + sprite, ok := actor.(*Sprite) if !ok { return false } - for i, sp := range s.sprites { - if sp == sprite { - s.sprites = append(s.sprites[:i], s.sprites[i+1:]...) - return true - } - } - - return false + return s.RemoveById(sprite.Actor.GetId()) } // Removes sprite from renderer by ID. diff --git a/system.go b/system.go index dd5c38d..3cf12c3 100644 --- a/system.go +++ b/system.go @@ -75,3 +75,48 @@ func updateSystems(delta float64) { system.Update(delta) } } + +// Takes an actor and tries to add it to all systems that accept it. +// This maybe not as performant as directly adding it to the right system. +// Returns true if it could be added to at least one system, else false. +func AddActor(actor interface{}) bool { + accepted := false + + for _, system := range systems { + if system.Add(actor) { + accepted = true + } + } + + return accepted +} + +// Removes an actor from all systems. +// This maybe not as performant as directly removing it from the right system. +// Returns true if it could be removed from at least one system, else false. +func RemoveActor(actor interface{}) bool { + removed := false + + for _, system := range systems { + if system.Remove(actor) { + removed = true + } + } + + return removed +} + +// Removes an actor from all systems by ID. +// This maybe not as performant as directly removing it from the right system. +// Returns true if it could be removed from at least one system, else false. +func RemoveActorById(id ActorId) bool { + removed := false + + for _, system := range systems { + if system.RemoveById(id) { + removed = true + } + } + + return removed +}