openquell/systems/player_system.go

101 lines
2.5 KiB
Go
Raw Normal View History

2024-02-10 19:45:06 +01:00
package systems
2024-02-09 20:20:13 +01:00
import (
"fmt"
. "openquell/components"
. "openquell/config"
"github.com/hajimehoshi/ebiten/v2"
"github.com/mlange-42/arche/ecs"
"github.com/mlange-42/arche/generic"
)
type PlayerSystem struct {
World *ecs.World
2024-02-11 14:24:30 +01:00
Selector *generic.Filter5[Position, Velocity, Player, Renderable, Speed]
2024-02-09 20:20:13 +01:00
Particle *ParticleSystem
Collectible *CollectibleSystem
2024-02-10 19:45:06 +01:00
Grid *GridSystem
2024-02-09 20:20:13 +01:00
}
2024-02-10 19:45:06 +01:00
func NewPlayerSystem(world *ecs.World, grid *GridSystem) *PlayerSystem {
2024-02-09 20:20:13 +01:00
system := &PlayerSystem{
2024-02-11 14:24:30 +01:00
Selector: generic.NewFilter5[Position, Velocity, Player, Renderable, Speed](),
2024-02-10 19:45:06 +01:00
Particle: NewParticleSystem(world, grid.Tilesize),
Collectible: NewCollectibleSystem(world),
Grid: grid,
World: world,
2024-02-09 20:20:13 +01:00
}
return system
}
func (system PlayerSystem) Update() error {
query := system.Selector.Query(system.World)
for query.Next() {
2024-02-11 14:24:30 +01:00
playerposition, velocity, _, _, speed := query.Get()
2024-02-09 20:20:13 +01:00
if !velocity.Moving() {
switch {
case ebiten.IsKeyPressed(ebiten.KeyRight):
velocity.Change(East)
case ebiten.IsKeyPressed(ebiten.KeyLeft):
velocity.Change(West)
case ebiten.IsKeyPressed(ebiten.KeyDown):
velocity.Change(South)
case ebiten.IsKeyPressed(ebiten.KeyUp):
velocity.Change(North)
// other keys: <tab>: switch player, etc
}
}
if velocity.Moving() {
ok, newpos := system.Grid.BumpEdge(playerposition, velocity)
if ok {
fmt.Printf("falling off the edge, new pos: %v\n", newpos)
playerposition.Set(newpos)
} else {
ok, tilepos := system.Grid.GetSolidNeighborPosition(playerposition, velocity, true)
if ok {
intersects, newpos := tilepos.Intersects(playerposition, velocity)
if intersects {
fmt.Printf("collision detected. tile: %s\n", tilepos)
fmt.Printf(" player: %s\n", playerposition)
fmt.Printf(" new: %s\n", newpos)
playerposition.Set(newpos)
fmt.Printf(" player new: %s\n", playerposition)
velocity.Change(Stop)
}
}
}
}
2024-02-11 14:24:30 +01:00
playerposition.Move(velocity, speed)
2024-02-09 20:20:13 +01:00
}
system.Particle.Update()
2024-02-10 19:45:06 +01:00
system.Collectible.Update()
2024-02-09 20:20:13 +01:00
return nil
}
2024-02-10 19:45:06 +01:00
func (system *PlayerSystem) Draw(screen *ebiten.Image) {
// write the movable tiles
op := &ebiten.DrawImageOptions{}
query := system.Selector.Query(system.World)
for query.Next() {
2024-02-11 14:24:30 +01:00
pos, _, _, sprite, _ := query.Get()
2024-02-10 19:45:06 +01:00
op.GeoM.Reset()
op.GeoM.Translate(float64(pos.X), float64(pos.Y))
screen.DrawImage(sprite.Image, op)
}
system.Collectible.Draw(screen)
system.Particle.Draw(screen)
}