Jypeli 10
The simple game programming library
PathFollowerBrain.cs
Siirry tämän tiedoston dokumentaatioon.
1using System;
2using System.Collections.Generic;
3
4namespace Jypeli.Assets
5{
10 {
11 private List<Vector> path;
12 private int wayPointIndex = 0;
13 private int step = 1;
14 private double _waypointRadius = 10;
15 private int stoppedAtCount = -1;
16
20 public IList<Vector> Path
21 {
22 get { return path; }
23 set
24 {
25 path = new List<Vector>( value );
26 wayPointIndex = 0;
27 }
28 }
29
34 {
35 get { return wayPointIndex; }
36 set { wayPointIndex = value; }
37 }
38
43 {
44 get { return Path[wayPointIndex]; }
45 }
46
52 public int Step
53 {
54 get { return step; }
55 set { step = value; }
56 }
57
61 public double WaypointRadius
62 {
63 get { return _waypointRadius; }
64 set { _waypointRadius = value; }
65 }
66
70 public DoubleMeter DistanceToWaypoint { get; private set; }
71
75 public bool Loop { get; set; }
76
80 public bool ReverseReturn { get; set; }
81
85 public event Action ArrivedAtWaypoint;
86
90 public event Action ArrivedAtEnd;
91
96 : base()
97 {
98 Path = new Vector[] { };
99 DistanceToWaypoint = new DoubleMeter(double.PositiveInfinity, 0, double.PositiveInfinity);
100 }
101
105 public PathFollowerBrain( double speed )
106 : this()
107 {
108 Speed = speed;
109 }
110
114 public PathFollowerBrain( params Vector[] path )
115 {
116 this.Path = path;
117 DistanceToWaypoint = new DoubleMeter( double.PositiveInfinity, 0, double.PositiveInfinity );
118 }
119
123 public PathFollowerBrain( double speed, params Vector[] path )
124 {
125 this.Speed = speed;
126 this.Path = path;
127 DistanceToWaypoint = new DoubleMeter( double.PositiveInfinity, 0, double.PositiveInfinity );
128 }
129
133 public PathFollowerBrain( List<Vector>path )
134 {
135 this.Path = path.ToArray();
136 DistanceToWaypoint = new DoubleMeter( double.PositiveInfinity, 0, double.PositiveInfinity );
137 }
138
142 public PathFollowerBrain( double speed, List<Vector> path )
143 {
144 this.Speed = speed;
145 this.Path = path.ToArray();
146 DistanceToWaypoint = new DoubleMeter( double.PositiveInfinity, 0, double.PositiveInfinity );
147 }
148
150 protected override void Update(Time time)
151 {
152 if ( Owner == null || Path == null || Path.Count == 0 ) return;
153
154 if ( wayPointIndex < 0 )
155 wayPointIndex = 0;
156 else if ( wayPointIndex >= Path.Count )
157 wayPointIndex = Path.Count - 1;
158
159 if ( stoppedAtCount >= 0 )
160 {
161 if ( stoppedAtCount == Path.Count )
162 return;
163
164 stoppedAtCount = -1;
165 }
166
167 Vector target = path[wayPointIndex];
168 Vector dist = target - Owner.Position;
169 DistanceToWaypoint.Value = dist.Magnitude;
170
172 {
173 // Arrived at waypoint
174 Arrived();
175 }
176 else if ( DistanceToWaypoint.Value > 2 * Speed * time.SinceLastUpdate.TotalSeconds )
177 {
178 // Continue moving
179 Move( dist.Angle );
180 }
181
182 base.Update(time);
183 }
184
185 private void OnArrivedAtWaypoint()
186 {
187 if ( ArrivedAtWaypoint != null )
189 }
190
191 private void OnArrivedAtEnd()
192 {
193 if ( ArrivedAtEnd != null )
194 ArrivedAtEnd();
195
196 if ( Owner is PhysicsObject )
197 ( (PhysicsObject)Owner ).Stop();
198 }
199
200 private void Arrived()
201 {
202 if ( Path == null || Path.Count == 0 || wayPointIndex >= path.Count )
203 return;
204
206
207 int nextIndex = wayPointIndex + step;
208
209 if ( nextIndex < 0 || nextIndex >= path.Count )
210 {
212
213 if ( ReverseReturn )
214 {
215 step = -step;
216 wayPointIndex = nextIndex + step;
217 }
218 else if ( Loop )
219 {
220 wayPointIndex = nextIndex + Math.Sign( step ) * Path.Count;
221 while ( wayPointIndex < 0 ) wayPointIndex += Path.Count;
222 while ( wayPointIndex >= Path.Count ) wayPointIndex -= Path.Count;
223 }
224 else
225 {
226 stoppedAtCount = Path.Count;
227 }
228
229 return;
230 }
231
232 wayPointIndex = nextIndex;
233 }
234 }
235}
Yleiset liikkumiseen tarkoitetut aivot.
virtual double Speed
Nopeus, jolla liikutaan.
void Move(Vector direction)
Liikuttaa aivojen hallitsemaa hahmoa
double dist(double a1, double a2)
Aivot, jotka seuraavat annettua polkua.
PathFollowerBrain()
Luo uudet polunseuraaja-aivot.
PathFollowerBrain(double speed, params Vector[] path)
Luo aivot, jotka seuraavat polkua path.
Action ArrivedAtWaypoint
Tapahtuu, kun saavutetaan reitin piste.
PathFollowerBrain(params Vector[] path)
Luo aivot, jotka seuraavat polkua path.
PathFollowerBrain(List< Vector >path)
Luo aivot, jotka seuraavat polkua path.
double WaypointRadius
Etäisyys, jonka sisällä ollaan perillä pisteessä.
Action ArrivedAtEnd
Tapahtuu, kun saavutaan reitin päähän.
PathFollowerBrain(double speed, List< Vector > path)
Luo aivot, jotka seuraavat polkua path.
PathFollowerBrain(double speed)
Luo uudet polunseuraaja-aivot ja asettaa niille nopeuden.
IList< Vector > Path
Polku, eli lista pisteistä joita aivot seuraa.
int Step
Askel (listassa). Seuraavan pisteen indeksi = tämän pisteen indeksi + askel. Voi olla myös negatiivin...
DoubleMeter DistanceToWaypoint
Etäisyys seuraavaan pisteeseen.
bool ReverseReturn
Palataanko samaa reittiä takaisin.
int NextWaypointIndex
Seuraavan pisteen indeksi.
override void Update(Time time)
Kutsutaan, kun tilaa päivitetään. Suurin osa päätöksenteosta tapahtuu täällä. Perivässä luokassa meth...
Vector NextWaypoint
Seuraavan pisteen paikka.
bool Loop
Jos true, palataan alkupisteeseen ja kierretään reittiä loputtomiin.
IGameObject Owner
Aivojen haltija.
Definition: Brain.cs:69
Mittari, joka mittaa double-tyyppisiä arvoja. Sidottavissa näyttöihin, kuten ValueDisplay ja BarGa...
Definition: DoubleMeter.cs:11
ValueType Value
Mittarin arvo.
Definition: Meter.cs:129
Kappale joka noudattaa fysiikan lakeja, johon voi törmätä. Vaatii että käytössä on fysiikkapeli.
Definition: Collisions.cs:7
new Vector Position
Paikka.
Definition: Positional.cs:32
Sisältää tiedon ajasta, joka on kulunut pelin alusta ja viime päivityksestä.
Definition: Time.cs:14
TimeSpan SinceLastUpdate
Aika joka on kulunut viime päivityksestä.
Definition: Time.cs:27
2D-vektori.
Definition: Vector.cs:67