source: 2014/30/MiskaK/The Reclaim/The Reclaim/Jypeli/Brains/PathFollowerBrain.cs @ 5649

Revision 5649, 4.3 KB checked in by anlakane, 6 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3
4namespace Jypeli.Assets
5{
6    /// <summary>
7    /// Aivot, jotka seuraavat annettua polkua.
8    /// </summary>
9    public class PathFollowerBrain : AbstractMoverBrain
10    {
11        private IList<Vector> path;
12        private int wayPointIndex = 0;
13        private int step = 1;
14        private double _waypointRadius = 10;
15
16        /// <summary>
17        /// Polku, eli lista pisteistä joita aivot seuraa.
18        /// </summary>
19        public IList<Vector> Path
20        {
21            get { return path; }
22            set
23            {
24                path = value;
25                if ( wayPointIndex >= value.Count )
26                {
27                    wayPointIndex = 0;
28                }
29                wayPointIndex = 0; // muuten polkua vaihdettaessa aivot eivät mene alkupisteeseen, vaan jonnekin ihan muualle
30            }
31        }
32
33        /// <summary>
34        /// Etäisyys, jonka sisällä ollaan perillä pisteessä.
35        /// </summary>
36        public double WaypointRadius
37        {
38            get { return _waypointRadius; }
39            set { _waypointRadius = value; }
40        }
41
42        /// <summary>
43        /// Etäisyys seuraavaan pisteeseen.
44        /// </summary>
45        public DoubleMeter DistanceToWaypoint { get; private set; }
46
47        /// <summary>
48        /// Jos true, palataan alkupisteeseen ja kierretään reittiä loputtomiin.
49        /// </summary>
50        public bool Loop { get; set; }
51
52        /// <summary>
53        /// Palataanko samaa reittiä takaisin.
54        /// </summary>
55        public bool ReverseReturn { get; set; }
56
57        /// <summary>
58        /// Tapahtuu, kun saavutaan reitin päähän.
59        /// </summary>
60        public event Action ArrivedAtEnd;
61
62        /// <summary>
63        /// Luo uudet polunseuraaja-aivot.
64        /// </summary>
65        public PathFollowerBrain()
66            : base()
67        {
68            Path = new Vector[] { };
69            DistanceToWaypoint = new DoubleMeter(double.PositiveInfinity, 0, double.PositiveInfinity);
70        }
71
72        /// <summary>
73        /// Luo uudet polunseuraaja-aivot ja asettaa niille nopeuden.
74        /// </summary>
75        public PathFollowerBrain( double speed )
76            : this()
77        {
78            Speed = speed;
79        }
80
81        /// <summary>
82        /// Luo aivot, jotka seuraavat polkua <c>path</c>.
83        /// </summary>
84        public PathFollowerBrain( params Vector[] path )
85        {
86            this.Path = path;
87            DistanceToWaypoint = new DoubleMeter( double.PositiveInfinity, 0, double.PositiveInfinity );
88        }
89
90        protected override void Update(Time time)
91        {
92            if ( Owner == null || Path == null || Path.Count == 0 ) return;
93
94            Vector target = path[wayPointIndex];
95            Vector dist = target - Owner.AbsolutePosition;
96            DistanceToWaypoint.Value = dist.Magnitude;
97
98            if (DistanceToWaypoint.Value < WaypointRadius)
99            {
100                // Arrived at waypoint
101                Arrived();
102            }
103            else
104            {
105                // Continue moving
106                Move(dist.Angle);
107            }
108
109            base.Update(time);
110        }
111
112        private void OnArrivedAtEnd()
113        {
114            if ( ArrivedAtEnd != null )
115                ArrivedAtEnd();
116        }
117
118        void Arrived()
119        {
120            if ( Path.Count == 0 || wayPointIndex >= path.Count ) return;
121
122            int nextIndex = wayPointIndex + step;
123
124            if ( nextIndex < 0 )
125            {
126                OnArrivedAtEnd();
127
128                if ( Loop )
129                {
130                    step = Math.Abs( step );
131                    wayPointIndex = 0;
132                }
133                else return;
134            }
135            else if ( nextIndex >= path.Count )
136            {
137                OnArrivedAtEnd();
138               
139                if ( ReverseReturn )
140                {
141                    step = -Math.Abs( step );
142                    wayPointIndex += step;
143                }
144                else if ( Loop ) wayPointIndex = 0;
145                else return;
146            }
147            else
148                wayPointIndex = nextIndex;
149        }
150    }
151}
Note: See TracBrowser for help on using the repository browser.