//go:build example // +build example package system import ( "code.rocketnine.space/tslocum/gohan" "code.rocketnine.space/tslocum/gohan/examples/twinstick/component" "github.com/hajimehoshi/ebiten/v2" ) type MovementSystem struct { ScreenW, ScreenH float64 } func (_ *MovementSystem) Matches(entity gohan.Entity) bool { position := component.Position(entity) velocity := component.Velocity(entity) return position != nil && velocity != nil } func (s *MovementSystem) Update(entity gohan.Entity) error { position := component.Position(entity) velocity := component.Velocity(entity) bullet := entity.Component(component.BulletComponentID) // Check for collision. if position.X+velocity.X < 16 { if bullet != nil { entity.Remove() return nil } position.X = 16 velocity.X = 0 } else if position.X+velocity.X > s.ScreenW-16 { if bullet != nil { entity.Remove() return nil } position.X = s.ScreenW - 16 velocity.X = 0 } if position.Y+velocity.Y < 16 { if bullet != nil { entity.Remove() return nil } position.Y = 16 velocity.Y = 0 } else if position.Y+velocity.Y > s.ScreenH-16 { if bullet != nil { entity.Remove() return nil } position.Y = s.ScreenH - 16 velocity.Y = 0 } position.X, position.Y = position.X+velocity.X, position.Y+velocity.Y if bullet == nil { velocity.X *= 0.95 velocity.Y *= 0.95 } return nil } func (_ *MovementSystem) Draw(_ gohan.Entity, _ *ebiten.Image) error { return gohan.ErrSystemWithoutDraw }