fixed higher speed collisions, removed Speed comp, put into Velocity

This commit is contained in:
2024-02-26 12:56:12 +01:00
parent 2e3acf4ec4
commit ffaa5e6129
13 changed files with 525 additions and 37 deletions

View File

@@ -17,13 +17,13 @@ import (
type ObstacleSystem struct {
World *ecs.World
Selector *generic.Filter5[Position, Velocity, Obstacle, Renderable, Speed]
Selector *generic.Filter4[Position, Velocity, Obstacle, Renderable]
GridContainer *grid.GridContainer
}
func NewObstacleSystem(world *ecs.World, gridcontainer *grid.GridContainer) System {
system := &ObstacleSystem{
Selector: generic.NewFilter5[Position, Velocity, Obstacle, Renderable, Speed](),
Selector: generic.NewFilter4[Position, Velocity, Obstacle, Renderable](),
World: world,
GridContainer: gridcontainer,
}
@@ -49,7 +49,7 @@ func (system *ObstacleSystem) Update() error {
gameover := false
for query.Next() {
obsposition, obsvelocity, _, _, speed := query.Get()
obsposition, obsvelocity, _, _ := query.Get()
// check if one player has bumped into current obstacle
for player := range playerobserver.Entities {
@@ -107,7 +107,7 @@ func (system *ObstacleSystem) Update() error {
}
}
obsposition.Move(obsvelocity, speed)
obsposition.Move(obsvelocity)
}
}
@@ -136,7 +136,7 @@ func (system *ObstacleSystem) Draw(screen *ebiten.Image) {
query := system.Selector.Query(system.World)
for query.Next() {
pos, _, _, sprite, _ := query.Get()
pos, _, _, sprite := query.Get()
op.GeoM.Reset()
op.GeoM.Translate(float64(pos.X), float64(pos.Y))

View File

@@ -14,13 +14,13 @@ import (
type PlayerSystem struct {
World *ecs.World
Selector *generic.Filter5[Position, Velocity, Player, Renderable, Speed]
Selector *generic.Filter4[Position, Velocity, Player, Renderable]
GridContainer *grid.GridContainer
}
func NewPlayerSystem(world *ecs.World, gridcontainer *grid.GridContainer) System {
system := &PlayerSystem{
Selector: generic.NewFilter5[Position, Velocity, Player, Renderable, Speed](),
Selector: generic.NewFilter4[Position, Velocity, Player, Renderable](),
GridContainer: gridcontainer,
World: world,
}
@@ -33,7 +33,7 @@ func (system PlayerSystem) Update() error {
switchable := false
query := system.Selector.Query(system.World)
for query.Next() {
_, _, player, _, _ := query.Get()
_, _, player, _ := query.Get()
if !player.IsPrimary {
switchable = true
}
@@ -42,7 +42,7 @@ func (system PlayerSystem) Update() error {
if switchable {
query := system.Selector.Query(system.World)
for query.Next() {
_, _, player, render, _ := query.Get()
_, _, player, render := query.Get()
if inpututil.IsKeyJustPressed(ebiten.KeyTab) {
slog.Debug("switch players")
if player.IsPrimary {
@@ -59,7 +59,7 @@ func (system PlayerSystem) Update() error {
// check player movements etc
query = system.Selector.Query(system.World)
for query.Next() {
playerposition, velocity, player, _, _ := query.Get()
playerposition, velocity, player, _ := query.Get()
if !player.IsPrimary {
continue
@@ -75,6 +75,24 @@ func (system PlayerSystem) Update() error {
velocity.Change(South)
case ebiten.IsKeyPressed(ebiten.KeyUp):
velocity.Change(North)
case ebiten.IsKeyPressed(ebiten.Key1):
velocity.Speed = 1
case ebiten.IsKeyPressed(ebiten.Key2):
velocity.Speed = 2
case ebiten.IsKeyPressed(ebiten.Key3):
velocity.Speed = 3
case ebiten.IsKeyPressed(ebiten.Key4):
velocity.Speed = 4
case ebiten.IsKeyPressed(ebiten.Key5):
velocity.Speed = 5
case ebiten.IsKeyPressed(ebiten.Key6):
velocity.Speed = 6
case ebiten.IsKeyPressed(ebiten.Key7):
velocity.Speed = 7
case ebiten.IsKeyPressed(ebiten.Key8):
velocity.Speed = 8
case ebiten.IsKeyPressed(ebiten.Key9):
velocity.Speed = 9
// other keys: <tab>: switch player, etc
}
}
@@ -87,6 +105,8 @@ func (system PlayerSystem) Update() error {
} else {
ok, tilepos := system.GridContainer.Grid.GetSolidNeighborPosition(playerposition, velocity, true)
if ok {
slog.Debug("HaveSolidNeighbor", "ok", ok, "tilepos",
tilepos.Point(), "playerpos", playerposition)
intersects, newpos := tilepos.Intersects(playerposition, velocity)
if intersects {
// slog.Debug("collision detected", "tile",
@@ -103,8 +123,8 @@ func (system PlayerSystem) Update() error {
query = system.Selector.Query(system.World)
for query.Next() {
// move player after obstacle or collectible updates
playerposition, velocity, _, _, speed := query.Get()
playerposition.Move(velocity, speed)
playerposition, velocity, _, _ := query.Get()
playerposition.Move(velocity)
}
return nil
@@ -116,7 +136,7 @@ func (system *PlayerSystem) Draw(screen *ebiten.Image) {
query := system.Selector.Query(system.World)
for query.Next() {
pos, _, _, sprite, _ := query.Get()
pos, _, _, sprite := query.Get()
op.GeoM.Reset()
op.GeoM.Translate(float64(pos.X), float64(pos.Y))