Jypeli  5
The simple game programming library
PathFollowerBrain.cs
Siirry tämän tiedoston dokumentaatioon.
1 using System;
2 using System.Collections.Generic;
3 
4 namespace 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 
33  public int NextWaypointIndex
34  {
35  get { return wayPointIndex; }
36  set { wayPointIndex = value; }
37  }
38 
42  public Vector NextWaypoint
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 
149  protected override void Update(Time time)
150  {
151  if ( Owner == null || Path == null || Path.Count == 0 ) return;
152 
153  if ( wayPointIndex < 0 )
154  wayPointIndex = 0;
155  else if ( wayPointIndex >= Path.Count )
156  wayPointIndex = Path.Count - 1;
157 
158  if ( stoppedAtCount >= 0 )
159  {
160  if ( stoppedAtCount == Path.Count )
161  return;
162 
163  stoppedAtCount = -1;
164  }
165 
166  Vector target = path[wayPointIndex];
167  Vector dist = target - Owner.AbsolutePosition;
168  DistanceToWaypoint.Value = dist.Magnitude;
169 
170  if ( DistanceToWaypoint.Value < WaypointRadius )
171  {
172  // Arrived at waypoint
173  Arrived();
174  }
175  else if ( DistanceToWaypoint.Value > 2 * Speed * time.SinceLastUpdate.TotalSeconds )
176  {
177  // Continue moving
178  Move( dist.Angle );
179  }
180 
181  base.Update(time);
182  }
183 
184  private void OnArrivedAtWaypoint()
185  {
186  if ( ArrivedAtWaypoint != null )
187  ArrivedAtWaypoint();
188  }
189 
190  private void OnArrivedAtEnd()
191  {
192  if ( ArrivedAtEnd != null )
193  ArrivedAtEnd();
194 
195  if ( Owner is PhysicsObject )
196  ( (PhysicsObject)Owner ).Stop();
197  }
198 
199  private void Arrived()
200  {
201  if ( Path == null || Path.Count == 0 || wayPointIndex >= path.Count )
202  return;
203 
204  OnArrivedAtWaypoint();
205 
206  int nextIndex = wayPointIndex + step;
207 
208  if ( nextIndex < 0 || nextIndex >= path.Count )
209  {
210  OnArrivedAtEnd();
211 
212  if ( ReverseReturn )
213  {
214  step = -step;
215  wayPointIndex = nextIndex + step;
216  }
217  else if ( Loop )
218  {
219  wayPointIndex = nextIndex + Math.Sign( step ) * Path.Count;
220  while ( wayPointIndex < 0 ) wayPointIndex += Path.Count;
221  while ( wayPointIndex >= Path.Count ) wayPointIndex -= Path.Count;
222  }
223  else
224  {
225  stoppedAtCount = Path.Count;
226  }
227 
228  return;
229  }
230 
231  wayPointIndex = nextIndex;
232  }
233  }
234 }
PathFollowerBrain(double speed, List< Vector > path)
Luo aivot, jotka seuraavat polkua path.
double Magnitude
Vektorin pituus.
Definition: Vector.cs:281
Angle Angle
Kulma radiaaneina.
Definition: Vector.cs:308
PathFollowerBrain()
Luo uudet polunseuraaja-aivot.
PathFollowerBrain(List< Vector >path)
Luo aivot, jotka seuraavat polkua path.
PathFollowerBrain(double speed)
Luo uudet polunseuraaja-aivot ja asettaa niille nopeuden.
Aivot, jotka seuraavat annettua polkua.
Peliolio, joka noudattaa fysiikkamoottorin määräämiä fysiikan lakeja. Voidaan kuitenkin myös laittaa ...
Definition: Coefficients.cs:36
TimeSpan SinceLastUpdate
Aika joka on kulunut viime päivityksestä.
Definition: Time.cs:24
Mittari, joka mittaa double-tyyppisiä arvoja. Sidottavissa näyttöihin, kuten ValueDisplay ja BarGauge...
Definition: Meter.cs:515
Sisältää tiedon ajasta, joka on kulunut pelin alusta ja viime päivityksestä.
Definition: Time.cs:13
override void Update(Time time)
Kutsutaan, kun tilaa päivitetään. Suurin osa päätöksenteosta tapahtuu täällä. Perivässä luokassa meth...
Yleiset liikkumiseen tarkoitetut aivot.
PathFollowerBrain(double speed, params Vector[] path)
Luo aivot, jotka seuraavat polkua path.
PathFollowerBrain(params Vector[] path)
Luo aivot, jotka seuraavat polkua path.
Action ArrivedAtWaypoint
Tapahtuu, kun saavutetaan reitin piste.
2D-vektori.
Definition: Vector.cs:56
Action ArrivedAtEnd
Tapahtuu, kun saavutaan reitin päähän.