Files
loading/updater.go
2023-10-27 09:59:01 -04:00

127 lines
3.2 KiB
Go

package main
import (
"loading/objects"
"math"
"github.com/hajimehoshi/ebiten/v2"
"github.com/hajimehoshi/ebiten/v2/inpututil"
)
// Update proceeds the game state.
// Update is called every tick (1/60 [s] by default).
func (g *Game) Update() error {
// Write your game's logical update.
g.counter++
g.UpdatePlayer()
//g.UpdateEnemies()
g.UpdateBobbles()
return nil
}
func (g *Game) UpdateBobbles() {
for i := 0; i < len(g.bobbles); i++ {
bobby := &g.bobbles[i]
bobby.Radius = objects.GetDefaultRadius() + float32(10*math.Sin(float64(g.counter)/(math.Pi*4)))
}
}
func (g *Game) UpdatePlayer() {
//update player angle based on mouse position
mx, my := ebiten.CursorPosition()
playerAngle := float32(math.Atan2(float64(float32(my)-g.player.Pose.Y), float64(float32(mx)-g.player.Pose.X)))
g.player.Angle = playerAngle
//update position based on wasd input
g.keys = inpututil.AppendPressedKeys(g.keys[:0])
step := float32(10)
for _, k := range g.keys {
switch k {
case ebiten.KeyW:
g.player.Pose.Y = g.player.Pose.Y - step
case ebiten.KeyA:
g.player.Pose.X = g.player.Pose.X - step
case ebiten.KeyS:
g.player.Pose.Y = g.player.Pose.Y + step
case ebiten.KeyD:
g.player.Pose.X = g.player.Pose.X + step
default:
}
}
}
func (g *Game) UpdateEnemies() {
/*
we're going to rotate the enemies so they slowly face the player, to do this we'll find the angle delta
between the player and the enemy via atan2, then add approximately one quarter of this value to the
current enemy angle
*/
/*
for _, e := range g.enemies {
//diff := float32(math.Atan2(float64(g.player.Pose.Y-e.Pose.Y), float64(g.player.Pose.X-e.Pose.X)))
e.Angle = e.Angle + math.Pi/4
}
*/
for i := 0; i < len(g.enemies); i++ {
enemy := &g.enemies[i]
//find distancees between enemy and player
dx := float64(g.player.Pose.X - enemy.Pose.X)
dy := float64(g.player.Pose.Y - enemy.Pose.Y)
//current sign
currentSign := enemy.DeltaAngle / float32(math.Abs(float64(enemy.DeltaAngle)))
targetAngle := float32(math.Atan2(dy, dx)) + math.Pi*2
//_, absTargetAngle := math.Modf(float64(targetAngle))
phi := float32(math.Mod(float64(targetAngle-enemy.Angle), float64(2*math.Pi)))
if phi > math.Pi {
enemy.DeltaAngle = math.Pi - phi
} else {
enemy.DeltaAngle = phi
}
//enemy.DeltaAngle = float32(math.Min(2*math.Pi-math.Abs(float64(enemy.Angle-targetAngle)), math.Abs(float64(enemy.Angle-targetAngle))))
enemy.Angle = enemy.Angle + enemy.DeltaAngle/16
enemy.SignFlip = currentSign
for j := 0; j < len(g.enemies); j++ {
if j == i {
continue
}
xdist := (g.enemies[j].Pose.X - enemy.Pose.X)
ydist := (g.enemies[j].Pose.Y - enemy.Pose.Y)
//quick boundary check before we get to the algebra
if xdist > enemy.Buffer || ydist > enemy.Buffer {
continue
}
dist := float32(math.Sqrt(float64(xdist*xdist + ydist*ydist)))
if dist < enemy.Buffer {
enemy.Pose.X = enemy.Pose.X + dist*float32(math.Cos(float64(targetAngle)))
enemy.Pose.Y = enemy.Pose.Y + dist*float32(math.Sin(float64(targetAngle)))
}
}
enemy.Pose.X = enemy.Pose.X + float32(dx)/360
enemy.Pose.Y = enemy.Pose.Y + float32(dy)/360
//enemy.Angle = enemy.Angle + enemy.DeltaAngle/(math.Pi/4)
}
}