diff --git a/TODO.md b/TODO.md index 8add34a..331416c 100644 --- a/TODO.md +++ b/TODO.md @@ -25,6 +25,10 @@ - Add player HUD + Stats (as hud_system!) +- Entity Observers don't work, removed entities remain there, errors + about dead entities, had to add Alive checks, and in obstacle_system + even remove the player manually from the world. + ## Collider Rework diff --git a/components/position.go b/components/position.go index 335d51c..f8c549f 100644 --- a/components/position.go +++ b/components/position.go @@ -4,6 +4,8 @@ import ( "fmt" "image" . "openquell/config" + + "log/slog" ) // physical location on screen @@ -90,14 +92,7 @@ func (tile *Position) Intersects(moving *Position, velocity *Velocity) (bool, *P is := tile.Rect.Bounds().Intersect(object.Rect.Bounds()) if is != image.ZR { - /* - slog.Debug("Intersect", - "velocity", velocity.Data, - "player", moving.Rect, - "moved player", object.Rect, - "collision at", is, - ) - */ + // collision, snap into neighbouring tile depending on the direction switch velocity.Direction { case West: @@ -110,6 +105,13 @@ func (tile *Position) Intersects(moving *Position, velocity *Velocity) (bool, *P object.Update(tile.X, tile.Rect.Max.Y) } + slog.Debug("Intersect", + "velocity", velocity.Data, + "player", moving, + "moved player", object, + "collision at", is, + "tilepos", tile, + ) return true, object } diff --git a/game/levels.go b/game/levels.go index 4cb52e8..18aaf20 100644 --- a/game/levels.go +++ b/game/levels.go @@ -41,13 +41,13 @@ func NewLevel(game *Game, cellsize int, plan *assets.RawLevel) *Level { systemlist = append(systemlist, systems.NewCollectibleSystem(game.World)) + systemlist = append(systemlist, systems.NewObstacleSystem(game.World, gridcontainer)) + systemlist = append(systemlist, systems.NewPlayerSystem(game.World, gridcontainer)) systemlist = append(systemlist, systems.NewParticleSystem(game.World, game.Cellsize)) - systemlist = append(systemlist, systems.NewObstacleSystem(game.World, gridcontainer)) - systemlist = append(systemlist, systems.NewTransientSystem(game.World, gridcontainer)) systemlist = append(systemlist, systems.NewDestroyableSystem(game.World, gridcontainer)) diff --git a/systems/collectible_system.go b/systems/collectible_system.go index f76dfa3..42e00e2 100644 --- a/systems/collectible_system.go +++ b/systems/collectible_system.go @@ -50,6 +50,10 @@ func (system *CollectibleSystem) Update() error { colposition, collectible, _ := query.Get() for player := range playerobserver.Entities { + if !system.World.Alive(player) { + continue + } + playerposition := (*Position)(system.World.Get(player, posID)) playervelocity := (*Velocity)(system.World.Get(player, veloID)) diff --git a/systems/obstacle_system.go b/systems/obstacle_system.go index e1a5b9e..c3d5bcf 100644 --- a/systems/obstacle_system.go +++ b/systems/obstacle_system.go @@ -46,13 +46,16 @@ func (system *ObstacleSystem) Update() error { EntitiesToRemove := []ecs.Entity{} query := system.Selector.Query(system.World) - gameover := false for query.Next() { obsposition, obsvelocity, _, _ := query.Get() // check if one player has bumped into current obstacle for player := range playerobserver.Entities { + if !system.World.Alive(player) { + continue + } + playerposition := (*Position)(system.World.Get(player, posID)) playervelocity := (*Velocity)(system.World.Get(player, veloID)) @@ -63,11 +66,10 @@ func (system *ObstacleSystem) Update() error { if CheckObstacleSide(playervelocity, obsvelocity.Direction) { // player died EntitiesToRemove = append(EntitiesToRemove, player) - gameover = true } else { // bumped into nonlethal obstacle side, stop the // player, set the obstacle in motion, if possible - slog.Debug("bump not die", "originalpos", playerposition) + //slog.Debug("bump not die", "originalpos", playerposition, "newpos", newpos, "obspos", obsposition) obsvelocity.Set(playervelocity) playervelocity.Change(Stop) playerposition.Set(newpos) @@ -113,11 +115,13 @@ func (system *ObstacleSystem) Update() error { } for _, entity := range EntitiesToRemove { + slog.Debug("remove player") system.World.RemoveEntity(entity) + playerobserver.RemoveEntity(entity) } - if gameover { - // winner, winner, chicken dinner! + if len(playerobserver.Entities) == 0 { + // lost timer := gameobserver.StopTimer if !timer.Running {