source: 2015/23/EemeliR/LiikenneOhjaus/LiikenneOhjaus/AutonAivot.cs @ 5892

Revision 5892, 7.4 KB checked in by sieerinn, 4 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 AutonAivot : AbstractMoverBrain
10    {
11        private IList<Vector> path;
12        private int wayPointIndex = 0;
13        private int step = 1;
14        private double _waypointRadius = 10;
15        //private bool ShouldMove;
16        private GameObject liikenneValo;
17
18        /// <summary>
19        /// Pitäisikö liikkua
20        /// </summary>
21        public bool ShouldMove
22        {
23            get { return ShouldMove; }
24            set
25            {
26                ShouldMove = value;
27            }
28        }         
29       
30        /// <summary>
31        /// Polku, eli lista pisteistä joita aivot seuraa.
32        /// </summary>
33        public IList<Vector> Path
34        {
35            get { return path; }
36            set
37            {
38                path = value;
39                wayPointIndex = 0;
40            }
41        }
42
43        /// <summary>
44        /// Etäisyys, jonka sisällä ollaan perillä pisteessä.
45        /// </summary>
46        public double WaypointRadius
47        {
48            get { return _waypointRadius; }
49            set { _waypointRadius = value; }
50        }
51
52        /// <summary>
53        /// Etäisyys seuraavaan pisteeseen.
54        /// </summary>
55        public DoubleMeter DistanceToWaypoint { get; private set; }
56
57        /// <summary>
58        /// Jos true, palataan alkupisteeseen ja kierretään reittiä loputtomiin.
59        /// </summary>
60        public bool Loop { get; set; }
61
62        /// <summary>
63        /// Palataanko samaa reittiä takaisin.
64        /// </summary>
65        public bool ReverseReturn { get; set; }
66
67        /// <summary>
68        /// Tapahtuu, kun saavutaan reitin päähän.
69        /// </summary>
70        public event Action ArrivedAtEnd;
71
72        /// <summary>
73        /// Luo uudet polunseuraaja-aivot.
74        /// </summary>
75        public AutonAivot()
76            : base()
77        {
78            Path = new Vector[] { };
79            DistanceToWaypoint = new DoubleMeter(double.PositiveInfinity, 0, double.PositiveInfinity);
80        }
81
82        /// <summary>
83        /// Luo uudet polunseuraaja-aivot ja asettaa niille nopeuden.
84        /// </summary>
85        public AutonAivot(double speed)
86            : this()
87        {
88            Speed = speed;
89        }
90
91        /// <summary>
92        /// Luo aivot, jotka seuraavat polkua <c>path</c>.
93        /// </summary>
94        public AutonAivot(params Vector[] path)
95        {
96            this.Path = path;
97            DistanceToWaypoint = new DoubleMeter(double.PositiveInfinity, 0, double.PositiveInfinity);
98        }
99
100        /// <summary>
101        /// Luo aivot, jotka seuraavat polkua <c>path</c>.
102        /// </summary>
103        public AutonAivot(double speed, params Vector[] path)
104        {
105            this.Speed = speed;
106            this.Path = path;
107            DistanceToWaypoint = new DoubleMeter(double.PositiveInfinity, 0, double.PositiveInfinity);
108        }
109
110        /// <summary>
111        /// Luo aivot, jotka seuraavat polkua, ja jotka noudattavat ShouldMove:a<c></c>.
112        /// </summary>
113        public AutonAivot(double speed, bool shouldmove, params Vector[] path)
114        {
115            this.Speed = speed;
116            this.Path = path;
117            this.ShouldMove = shouldmove;
118            DistanceToWaypoint = new DoubleMeter(double.PositiveInfinity, 0, double.PositiveInfinity);
119        }
120
121        /// <summary>
122        /// Luo aivot, jotka seuraavat polkua, ja jotka noudattavat liikennevaloja<c></c>.
123        /// </summary>
124        public AutonAivot(double speed, GameObject liikenneValo, params Vector[] path)
125        {
126            this.Speed = speed;
127            this.Path = path;
128            this.liikenneValo = liikenneValo;
129            DistanceToWaypoint = new DoubleMeter(double.PositiveInfinity, 0, double.PositiveInfinity);
130        }
131
132
133        /// <summary>
134        /// Luo aivot, jotka seuraavat polkua, ja jotka noudattavat ShouldMove:a<c></c>.
135        /// </summary>
136        public AutonAivot(double speed, bool shouldmove)
137        {
138            this.Speed = speed;
139            this.ShouldMove = shouldmove;
140            DistanceToWaypoint = new DoubleMeter(double.PositiveInfinity, 0, double.PositiveInfinity);
141        }
142
143
144        /// <summary>
145        /// Luo aivot, jotka seuraavat polkua <c>path</c>.
146        /// </summary>
147        public AutonAivot(List<Vector> path)
148        {
149            this.Path = path.ToArray();
150            DistanceToWaypoint = new DoubleMeter(double.PositiveInfinity, 0, double.PositiveInfinity);
151        }
152
153        /// <summary>
154        /// Luo aivot, jotka seuraavat polkua <c>path</c>.
155        /// </summary>
156        public AutonAivot(double speed, List<Vector> path)
157        {
158            this.Speed = speed;
159            this.Path = path.ToArray();
160            DistanceToWaypoint = new DoubleMeter(double.PositiveInfinity, 0, double.PositiveInfinity);
161        }
162
163        protected override void Update(Time time)
164        {
165
166            if (Owner == null || Path == null || wayPointIndex < 0 || wayPointIndex >= Path.Count) return;
167
168            //if (ShouldMove == false) return;
169           
170            Vector target = path[wayPointIndex];
171            Vector dist = target - Owner.AbsolutePosition;
172            //GameObject test = liikenneValo;
173            DistanceToWaypoint.Value = dist.Magnitude;
174
175            if (DistanceToWaypoint.Value < WaypointRadius)
176            {
177                // Arrived at waypoint
178                Arrived();
179            }
180            else if (DistanceToWaypoint.Value > 2 * Speed * time.SinceLastUpdate.TotalSeconds)
181            {
182                // Continue moving
183                Move(dist.Angle);
184
185                if (liikenneValo != null && liikenneValo.Image != null)
186                {
187                    if (liikenneValo.Image == LiikenneOhjaus.LiValokuva)
188                    {
189                        //if (Owner.Position)
190                       
191                        Owner.Move(new Vector(0.0, 0.0));
192                    }
193                }
194            }
195            base.Update(time);
196        }
197
198        private void OnArrivedAtEnd()
199        {
200            if (ArrivedAtEnd != null)
201                ArrivedAtEnd();
202
203            if (Owner is PhysicsObject)
204                ((PhysicsObject)Owner).Stop();
205        }
206
207        void Arrived()
208        {
209            if (Path.Count == 0 || wayPointIndex >= path.Count) return;
210
211            int nextIndex = wayPointIndex + step;
212
213            if (nextIndex < 0)
214            {
215                OnArrivedAtEnd();
216
217                if (Loop)
218                {
219                    step = Math.Abs(step);
220                    wayPointIndex = 0;
221                    return;
222                }
223            }
224            else if (nextIndex >= path.Count)
225            {
226                OnArrivedAtEnd();
227
228                if (ReverseReturn)
229                {
230                    step = -Math.Abs(step);
231                    wayPointIndex += step;
232                    return;
233                }
234                else if (Loop)
235                {
236                    wayPointIndex = 0;
237                    return;
238                }
239            }
240
241            wayPointIndex = nextIndex;
242        }
243    }
244}
Note: See TracBrowser for help on using the repository browser.