// 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)) } }