// 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 (hv *HouseViewer) Think(g *gui.Gui, t int64) { dt := t - hv.last_timestamp if hv.last_timestamp == 0 { dt = 0 } hv.last_timestamp = t scale := 1 - float32(math.Pow(0.005, float64(dt)/1000)) if hv.target_on { f := mathgl.Vec2{hv.fx, hv.fy} v := mathgl.Vec2{hv.targetx, hv.targety} v.Subtract(&f) v.Scale(scale) f.Add(&v) hv.fx = f.X hv.fy = f.Y } if hv.target_zoom_on { exp := math.Log(float64(hv.zoom)) exp += (float64(hv.targetzoom) - exp) * float64(scale) hv.zoom = float32(math.Exp(exp)) } }
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-- } } }