obstacle collision fixes, player alive checks, player remove

workaround, see TODO
This commit is contained in:
Thomas von Dein 2024-02-26 19:07:35 +01:00
parent 0ca5d8f4a0
commit 451b66a53d
5 changed files with 29 additions and 15 deletions

View File

@ -25,6 +25,10 @@
- Add player HUD + Stats (as hud_system!) - 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 ## Collider Rework

View File

@ -4,6 +4,8 @@ import (
"fmt" "fmt"
"image" "image"
. "openquell/config" . "openquell/config"
"log/slog"
) )
// physical location on screen // 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()) is := tile.Rect.Bounds().Intersect(object.Rect.Bounds())
if is != image.ZR { 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 // collision, snap into neighbouring tile depending on the direction
switch velocity.Direction { switch velocity.Direction {
case West: case West:
@ -110,6 +105,13 @@ func (tile *Position) Intersects(moving *Position, velocity *Velocity) (bool, *P
object.Update(tile.X, tile.Rect.Max.Y) 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 return true, object
} }

View File

@ -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.NewCollectibleSystem(game.World))
systemlist = append(systemlist, systems.NewObstacleSystem(game.World, gridcontainer))
systemlist = append(systemlist, systemlist = append(systemlist,
systems.NewPlayerSystem(game.World, gridcontainer)) systems.NewPlayerSystem(game.World, gridcontainer))
systemlist = append(systemlist, systems.NewParticleSystem(game.World, game.Cellsize)) 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.NewTransientSystem(game.World, gridcontainer))
systemlist = append(systemlist, systems.NewDestroyableSystem(game.World, gridcontainer)) systemlist = append(systemlist, systems.NewDestroyableSystem(game.World, gridcontainer))

View File

@ -50,6 +50,10 @@ func (system *CollectibleSystem) Update() error {
colposition, collectible, _ := query.Get() colposition, collectible, _ := query.Get()
for player := range playerobserver.Entities { for player := range playerobserver.Entities {
if !system.World.Alive(player) {
continue
}
playerposition := (*Position)(system.World.Get(player, posID)) playerposition := (*Position)(system.World.Get(player, posID))
playervelocity := (*Velocity)(system.World.Get(player, veloID)) playervelocity := (*Velocity)(system.World.Get(player, veloID))

View File

@ -46,13 +46,16 @@ func (system *ObstacleSystem) Update() error {
EntitiesToRemove := []ecs.Entity{} EntitiesToRemove := []ecs.Entity{}
query := system.Selector.Query(system.World) query := system.Selector.Query(system.World)
gameover := false
for query.Next() { for query.Next() {
obsposition, obsvelocity, _, _ := query.Get() obsposition, obsvelocity, _, _ := query.Get()
// check if one player has bumped into current obstacle // check if one player has bumped into current obstacle
for player := range playerobserver.Entities { for player := range playerobserver.Entities {
if !system.World.Alive(player) {
continue
}
playerposition := (*Position)(system.World.Get(player, posID)) playerposition := (*Position)(system.World.Get(player, posID))
playervelocity := (*Velocity)(system.World.Get(player, veloID)) playervelocity := (*Velocity)(system.World.Get(player, veloID))
@ -63,11 +66,10 @@ func (system *ObstacleSystem) Update() error {
if CheckObstacleSide(playervelocity, obsvelocity.Direction) { if CheckObstacleSide(playervelocity, obsvelocity.Direction) {
// player died // player died
EntitiesToRemove = append(EntitiesToRemove, player) EntitiesToRemove = append(EntitiesToRemove, player)
gameover = true
} else { } else {
// bumped into nonlethal obstacle side, stop the // bumped into nonlethal obstacle side, stop the
// player, set the obstacle in motion, if possible // 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) obsvelocity.Set(playervelocity)
playervelocity.Change(Stop) playervelocity.Change(Stop)
playerposition.Set(newpos) playerposition.Set(newpos)
@ -113,11 +115,13 @@ func (system *ObstacleSystem) Update() error {
} }
for _, entity := range EntitiesToRemove { for _, entity := range EntitiesToRemove {
slog.Debug("remove player")
system.World.RemoveEntity(entity) system.World.RemoveEntity(entity)
playerobserver.RemoveEntity(entity)
} }
if gameover { if len(playerobserver.Entities) == 0 {
// winner, winner, chicken dinner! // lost
timer := gameobserver.StopTimer timer := gameobserver.StopTimer
if !timer.Running { if !timer.Running {