1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
    public class MoveAction : IAction
    {
        public MoveAction(IPosition moveable, Vector2 destination, float speed)
        {
            _moveable = moveable;
            Speed = speed;
            _end = destination;
        }

        protected float Speed
        {
            set { _speed = value; }
        }

        public override void Update(float elapsed)
        {
            if(_firstUpdate)
            {
                _start = _moveable.Position;

                if (_start == _end)
                {
                    Finished = true;
                    return;
                }

                _direction = Vector2.Normalize(_end - _start);
                _distance = Vector2.Distance(_start, _end);
                _firstUpdate = false;
            }

            Vector2 nextPosition = _moveable.Position + (_direction * _speed * elapsed);

            if (Vector2.Distance(_start, nextPosition) >= _distance)
            {
                _moveable.Position = _end;
                Finished = true;
                return;
            }
            
            _moveable.Position = nextPosition;
        }

        private Vector2 _start;

        private bool _firstUpdate = true;

        protected Vector2 _direction;

        private float _distance;

        private float _speed;

        private readonly IPosition _moveable;

        private readonly Vector2 _end;
    }