// Advances ent up to dist towards the target cell. Returns the distance // traveled. func (e *Entity) DoAdvance(dist float32, x, y int) float32 { if dist <= 0 { e.sprite.sp.Command("stop") return 0 } e.sprite.sp.Command("move") source := mathgl.Vec2{float32(e.X), float32(e.Y)} target := mathgl.Vec2{float32(x), float32(y)} var seg mathgl.Vec2 seg.Assign(&target) seg.Subtract(&source) e.TurnToFace(x, y) var traveled float32 if seg.Length() > dist { seg.Scale(dist / seg.Length()) traveled = dist } else { traveled = seg.Length() } seg.Add(&source) e.X = float64(seg.X) e.Y = float64(seg.Y) return dist - traveled }
func (e *Entity) TurnToFace(x, y int) { target := mathgl.Vec2{float32(x), float32(y)} source := mathgl.Vec2{float32(e.X), float32(e.Y)} var seg mathgl.Vec2 seg.Assign(&target) seg.Subtract(&source) target_facing := facing(seg) f_diff := target_facing - e.sprite.sp.StateFacing() if f_diff != 0 { f_diff = (f_diff + 6) % 6 if f_diff > 3 { f_diff -= 6 } for f_diff < 0 { e.sprite.sp.Command("turn_left") f_diff++ } for f_diff > 0 { e.sprite.sp.Command("turn_right") f_diff-- } } }