doctorlectro/system/input_move.go

221 lines
5.7 KiB
Go

package system
import (
"image"
"os"
"code.rocketnine.space/tslocum/doctorlectro/component"
"code.rocketnine.space/tslocum/doctorlectro/world"
"code.rocketnine.space/tslocum/gohan"
"github.com/hajimehoshi/ebiten/v2"
"github.com/hajimehoshi/ebiten/v2/inpututil"
)
const (
moveSpeed = 0.02
maxMoveSpeed = 1.0
)
type playerMoveSystem struct {
Position *component.Position
Velocity *component.Velocity
Sprite *component.Sprite
Player *component.Player
}
func NewPlayerMoveSystem() *playerMoveSystem {
return &playerMoveSystem{}
}
func (s *playerMoveSystem) Update(e gohan.Entity) error {
if ebiten.IsKeyPressed(ebiten.KeyEscape) && !world.DisableEsc {
os.Exit(0)
return nil
}
if ebiten.IsKeyPressed(ebiten.KeyControl) && inpututil.IsKeyJustPressed(ebiten.KeyV) {
v := world.Debug + 1
if v > 2 {
v = 0
}
world.Debug = v
return nil
}
if !world.GameStarted {
if ebiten.IsKeyPressed(ebiten.KeyEnter) || ebiten.IsMouseButtonPressed(ebiten.MouseButtonLeft) {
world.StartGame()
}
return nil
}
/*if inpututil.IsKeyJustPressed(ebiten.KeyM) {
if asset.SoundLevelMusic.IsPlaying() {
asset.SoundLevelMusic.Pause()
} else {
asset.SoundLevelMusic.Play()
}
}*/
if world.GameOver {
if inpututil.IsKeyJustPressed(ebiten.KeyEnter) {
world.ResetGame = true
}
return nil
}
magnetActive := ebiten.IsKeyPressed(ebiten.KeySpace)
if magnetActive {
// Find nearest surface, then magnetize.
wallThreshold := 16 // TODO cling when added space is used
boxOffset := 4
position := world.PlayerBody.Position()
collisionSize := 12
px1, py1 := int(position.X)+boxOffset, int(position.Y)+boxOffset
px2, py2 := px1+collisionSize-(boxOffset*2), py1+collisionSize-(boxOffset*2)
playerRectD := image.Rect(px1, py1, px2, py2+wallThreshold)
playerRectDL := image.Rect(px1-wallThreshold, py1, px2, py2+wallThreshold)
playerRectL := image.Rect(px1-wallThreshold, py1, px2, py2)
playerRectUL := image.Rect(px1-wallThreshold, py1-wallThreshold, px2, py2)
playerRectU := image.Rect(px1, py1-wallThreshold, px2, py2)
playerRectUR := image.Rect(px1, py1-wallThreshold, px2+wallThreshold, py2)
playerRectR := image.Rect(px1, py1, px2+wallThreshold, py2)
playerRectDR := image.Rect(px1, py1, px2+wallThreshold, py2+wallThreshold)
var (
collideL bool
collideR bool
collideU bool
collideD bool
collideUL bool
collideUR bool
collideDL bool
collideDR bool
)
for i := range world.MetalRects {
if !collideL && world.MetalRects[i].Overlaps(playerRectL) {
collideL = true
}
if !collideR && world.MetalRects[i].Overlaps(playerRectR) {
/*log.Println("OVERLAP", position.X, position.Y)
log.Println(playerRectR)
log.Println(world.MetalRects[i])*/
collideR = true
}
if !collideU && world.MetalRects[i].Overlaps(playerRectU) {
collideU = true
}
if !collideD && world.MetalRects[i].Overlaps(playerRectD) {
collideD = true
}
if !collideUL && world.MetalRects[i].Overlaps(playerRectUL) {
collideUL = true
}
if !collideUR && world.MetalRects[i].Overlaps(playerRectUR) {
collideUR = true
}
if !collideDL && world.MetalRects[i].Overlaps(playerRectDL) {
collideDL = true
}
if !collideDR && world.MetalRects[i].Overlaps(playerRectDR) {
collideDR = true
}
}
// TODO combined vector (allow diagonal gravity)
//log.Println("COLLIDE")
if collideD {
if collideR {
world.MagnetDirection = world.MagnetizeDown
if ebiten.IsKeyPressed(ebiten.KeyS) {
world.MagnetDirection = world.MagnetizeDown
} else {
world.MagnetDirection = world.MagnetizeDownRight
}
//log.Println("DOWN RIGHT")
} else if collideL {
// TODO copy for all
if ebiten.IsKeyPressed(ebiten.KeyS) {
world.MagnetDirection = world.MagnetizeDown
} else {
world.MagnetDirection = world.MagnetizeDownLeft
}
//log.Println("DOWN LEFT")
} else {
world.MagnetDirection = world.MagnetizeDown
//log.Println("DOWN")
}
} else if collideU {
//log.Println("U")
if collideR {
world.MagnetDirection = world.MagnetizeUp
world.MagnetDirection = world.MagnetizeUpRight
//log.Println("UP RIGHT")
} else if collideL {
world.MagnetDirection = world.MagnetizeUp
world.MagnetDirection = world.MagnetizeUpLeft
//log.Println("UP LEFT")
} else {
world.MagnetDirection = world.MagnetizeUp
//log.Println("UP")
}
} else if collideR {
//log.Println("R")
world.MagnetDirection = world.MagnetizeRight
if collideU {
world.MagnetDirection = world.MagnetizeUpRight
//log.Println("UP RIGHT")
} else if collideD {
world.MagnetDirection = world.MagnetizeDownRight
//log.Println("DOWN RIGHT")
} else {
world.MagnetDirection = world.MagnetizeRight
//log.Println("RIGHT")
}
} else if collideL {
//log.Println("L")
if collideU {
world.MagnetDirection = world.MagnetizeUpLeft
//log.Println("UP LEFT")
} else if collideD {
world.MagnetDirection = world.MagnetizeDownLeft
//log.Println("DOWN LEFT")
} else {
world.MagnetDirection = world.MagnetizeLeft
//log.Println("LEFT")
}
} else if collideUL {
//log.Println("UL")
world.MagnetDirection = world.MagnetizeUpLeft
} else if collideUR {
//log.Println("UR")
world.MagnetDirection = world.MagnetizeUpRight
} else if collideDL {
//log.Println("DL")
world.MagnetDirection = world.MagnetizeDownLeft
} else if collideDR {
//log.Println("DR")
world.MagnetDirection = world.MagnetizeDownRight
} else {
//log.Println("NONE")
magnetActive = false
}
}
world.MagnetActive = magnetActive
return nil
}
func (s *playerMoveSystem) Draw(_ gohan.Entity, _ *ebiten.Image) error {
return gohan.ErrUnregister
}
func (s *playerMoveSystem) updateSprite() {
}