From 35b316123c6d768cfb064c1abfdbc41bb54b9e68 Mon Sep 17 00:00:00 2001 From: Martin Kagamino Lehoux Date: Sun, 3 Sep 2023 19:05:41 +0200 Subject: feat: Move along grid --- move.go | 42 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 6 deletions(-) (limited to 'move.go') diff --git a/move.go b/move.go index f2cee2b..97d4809 100644 --- a/move.go +++ b/move.go @@ -1,19 +1,49 @@ package main +import ( + "math" +) + type Move struct { IsActive bool + Origin Point Destination Point + Nodes []Point +} + +func NewMove(origin Point, destination Point) Move { + nodes := []Point{} + current := Point{ + origin.X/100*100 + 50, + origin.Y/100*100 + 50, + } + for current != destination { + next := current + if math.Abs(float64(destination.X-current.X)) > math.Abs(float64(destination.Y-current.Y)) { + next.X = current.X + int(math.Copysign(100, float64(destination.X-current.X))) + } else { + next.Y = current.Y + int(math.Copysign(100, float64(destination.Y-current.Y))) + } + nodes = append(nodes, next) + current = next + } + return Move{IsActive: true, Origin: origin, Destination: destination, Nodes: nodes} } func (m *Move) Update(position Point, speed int) Point { if !m.IsActive { return position } - remainingMove := m.Destination.Sub(position) - delta := remainingMove.Mul(speed).Div(int(Length(remainingMove))) - next := position.Add(delta) - if Distance(next, m.Destination) < float64(speed) { - m.IsActive = false + next := m.Nodes[0] + if Distance(position, next) < float64(speed) { + if next == m.Destination { + m.IsActive = false + } else { + m.Nodes = m.Nodes[1:] + } + return next } - return next + remainingMove := next.Sub(position) + delta := remainingMove.Mul(speed).Div(int(Length(remainingMove))) + return position.Add(delta) } -- cgit v1.3