221 lines
5.7 KiB
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() {
|
|
}
|