func (m *Mob) moveTowardExit(elapsed time.Duration, level *Level) { var ( dest mgl32.Vec2 ok bool pct = float32(elapsed) / float32(time.Second) gridDist mgl32.Vec2 goalDist int32 stepDist = pct * m.Speed ) if dest, goalDist, ok = level.Grid.GetNextStepToSink(m.Pos); !ok { return } gridDist = dest.Sub(m.Pos) if goalDist == 1 && gridDist.Len() < stepDist+0.5 { m.PendingDisable = true } if gridDist.X() > 0 { m.swapState(Left, Right) } else { m.swapState(Right, Left) } m.Pos = m.Pos.Add(gridDist.Normalize().Mul(stepDist)) }
func Vec2AngleBetween(v1, v2 mgl32.Vec2) float32 { return float32(math.Acos(float64(v1.Normalize().Dot(v2.Normalize())))) }