obstacle collision fixes, player alive checks, player remove
workaround, see TODO
This commit is contained in:
parent
0ca5d8f4a0
commit
451b66a53d
4
TODO.md
4
TODO.md
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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))
|
||||||
|
|||||||
@ -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))
|
||||||
|
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user