127 lines
3.2 KiB
Go
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)
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|