Jypeli 10
The simple game programming library
FollowerBrain.cs
Siirry tämän tiedoston dokumentaatioon.
1using System;
2using System.Collections.Generic;
3
4namespace Jypeli
5{
10 {
11 double _logicDelay = 0;
12 double remainingDelay = 0;
14
15 #region Properties
16
20 public List<string> TagsToFollow { get; set; }
21
25 public List<IGameObject> ObjectsToFollow { get; set; }
26
31 public Comparison<IGameObject> FollowComparer { get; set; }
32
36 public IGameObject CurrentTarget { get; protected set; }
37
41 public DoubleMeter DistanceToTarget { get; protected set; }
42
46 public double DistanceClose { get; set; }
47
51 public double DistanceFar { get; set; }
52
57 public Brain FarBrain { get; set; }
58
62 public Brain CloseBrain { get; set; }
63
67 public event Action TargetClose;
68
75 public bool StopWhenTargetClose { get; set; }
76
80 public double Delay
81 {
82 get { return _logicDelay; }
83 set
84 {
85 _logicDelay = value;
86 remainingDelay = ( Owner == null ) ? 0 : value;
87 }
88 }
89
90 #endregion
91
92 #region Comparers
93
102 public Comparison<IGameObject> CreateDistanceComparer( double changeTargetDistance )
103 {
104 return delegate ( IGameObject obj1, IGameObject obj2 )
105 {
106 if ( Owner == null ) return 0;
107 if ( obj1 == null ) return 1;
108 if ( obj2 == null ) return -1;
109
110 double d1 = Vector.Distance( Owner.Position, obj1.Position );
111 double d2 = Vector.Distance( Owner.Position, obj2.Position );
112 double diff = Math.Abs( d1 - d2 );
113
114 if ( CurrentTarget == obj1 && diff < changeTargetDistance ) return -1;
115 if ( CurrentTarget == obj2 && diff < changeTargetDistance ) return 1;
116
117 return d1.CompareTo( d2 );
118 };
119 }
120
121 #endregion
122
127 : this( null )
128 {
129 }
130
135 public FollowerBrain( params object[] targets )
136 : base()
137 {
138 ObjectsToFollow = new List<IGameObject>();
139 TagsToFollow = new List<string>();
140 DistanceToTarget = new DoubleMeter( double.PositiveInfinity, 0, double.PositiveInfinity );
142 DistanceFar = double.PositiveInfinity;
143 DistanceClose = 100.0;
144 StopWhenTargetClose = false;
146
147 if (targets == null)
148 return;
149
150 for (int i = 0; i < targets.Length; i++)
151 {
152 if (targets[i] is IGameObject)
153 ObjectsToFollow.Add((IGameObject)targets[i]);
154 else if (targets[i] is string)
155 TagsToFollow.Add((string)targets[i]);
156 else
157 throw new ArgumentException(string.Format("Target type not recognized: {0} ({1})", targets[i].ToString(), targets[i].GetType().Name));
158 }
159 }
160
161 private void SelectTarget()
162 {
163 CurrentTarget = null;
164
165 foreach ( var layer in Game.Instance.Layers )
166 {
167 foreach ( var obj in layer.Objects )
168 {
169 if (obj == Owner || obj.IsDestroyed)
170 continue;
171
172 if ( !ObjectsToFollow.Contains( obj ) && !TagsToFollow.Contains( obj.Tag as string ) )
173 continue;
174
175 if ( CurrentTarget == null || FollowComparer( CurrentTarget, obj ) > 0 )
176 CurrentTarget = obj;
177 }
178 }
179
180 if ( Owner != null && CurrentTarget != null )
182 else
183 DistanceToTarget.Value = double.PositiveInfinity;
184 }
185
186 private void SetTargetPosition( double dt )
187 {
189
190 if ( Delay > 0 && DistanceToTarget.Value > float.Epsilon )
191 {
192 double maxlength = Math.Sqrt( Math.Pow( Game.Instance.Level.Width, 2 ) + Math.Pow( Game.Instance.Level.Height, 2 ) );
194 }
195
197
198 if ( physTarget != null )
199 {
200 // Take speed and acceleration into account
201 targetPosition += ( ( physTarget.Acceleration * dt ) + physTarget.Velocity ) * dt;
202 }
203 }
204
209 protected override void Update( Time time )
210 {
211 double dt = Game.Time.SinceLastUpdate.TotalSeconds;
212 if ( dt <= 0 ) return;
213
214 remainingDelay -= dt;
216 {
217 SelectTarget();
218 if ( CurrentTarget == null )
219 return;
220
221 SetTargetPosition( dt );
223 }
224 else
225 {
227
228 if ( TurnWhileMoving )
229 {
231 if ( !double.IsNaN( realDist.Magnitude ) && !double.IsInfinity( realDist.Magnitude ) )
232 Turn( realDist.Angle );
233 }
234 }
235
236 double distance = DistanceToTarget.Value;
237 bool targetClose = Math.Abs( distance ) < DistanceClose;
238 bool targetFar = Math.Abs( distance ) > DistanceFar;
239 if ( targetClose && TargetClose != null ) TargetClose();
240
241 if ( targetClose )
242 {
243 if (CloseBrain != null)
244 {
245 CloseBrain.Owner = this.Owner;
246 CloseBrain.DoUpdate(time);
247 }
248
250 {
251 if (Owner is PhysicsObject)
252 ((PhysicsObject)Owner).Stop();
253
254 return;
255 }
256 }
257
258 if ( targetFar )
259 {
260 FarBrain.Owner = this.Owner;
261 FarBrain.DoUpdate( time );
262 return;
263 }
264
266 if ( d.Magnitude > float.Epsilon )
267 Move( d / dt );
268 else if ( Owner is PhysicsObject )
269 ( (PhysicsObject)Owner ).Stop();
270
271 base.Update( time );
272 }
273 }
274}
Yleiset liikkumiseen tarkoitetut aivot.
bool TurnWhileMoving
Käännytäänkö siihen suuntaan mihin liikutaan.
void Turn(Angle angle)
Kääntää aivojen hallitsemaan hahmoa
void Move(Vector direction)
Liikuttaa aivojen hallitsemaa hahmoa
Aivoluokka peliolioille. Voidaan käyttää tekoälyn ja tilannekohtaisten toimintamallien luomiseen peli...
Definition: Brain.cs:41
void DoUpdate(Time time)
Definition: Brain.cs:86
static readonly Brain None
Tyhjät aivot, eivät sisällä mitään toiminnallisuutta.
Definition: Brain.cs:45
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
Aivot, joiden tehtävänä on laittaa omistajansa seuraamaan jotakin kohdetta.
Comparison< IGameObject > FollowComparer
Metodi, joka vertailee kahta oliota keskenään. Kumpi olio tulee ensimmäiseksi, sitä seurataan.
IGameObject CurrentTarget
Olio, jota parhaillaan seurataan.
double? Delay
Viive seuraamislogiikassa. Oletuksena nolla (seuraa reaaliajassa)
Brain CloseBrain
Aivot, joita käytetään näiden sijasta kun ollaan lähellä kohdestta
Action TargetClose
Tapahtuma, joka suoritetaan, kun ollaan tarpeeksi lähellä seurattavaa.
List< IGameObject > ObjectsToFollow
Oliot, joita seurataan.
void SetTargetPosition(double dt)
double DistanceFar
Etäisyys, jolloin ollaan kaukana kohteesta ja lopetetaan sen seuraaminen.
Brain FarBrain
Aivot, joita käytetään näiden sijasta kun ollaan kaukana kaikista kohteista, esim....
List< string > TagsToFollow
Tagit, joita seurataan.
override void Update(Time time)
Kutsutaan, kun tilaa päivitetään. Suurin osa päätöksenteosta tapahtuu täällä.
Comparison< IGameObject > CreateDistanceComparer(double changeTargetDistance)
Luo FollowComparer-vertailijan, jolla aivot seuraavat aina lähintä oliota.
FollowerBrain(params object[] targets)
Luo aivot ja asettaa ne seuraamaan yhtä tai useampaa kohdetta.
bool StopWhenTargetClose
Pysähdytäänkö, kun ollaan lähellä kohdetta.
FollowerBrain()
Luo aivot.
DoubleMeter DistanceToTarget
Etäisyys lähimpään kohteeseen.
double DistanceClose
Etäisyys, jolloin ollaan lähellä kohdetta.
Level Level
Aktiivinen kenttä.
Definition: Game.cs:145
static Time Time
Peliaika. Sisältää tiedon siitä, kuinka kauan peliä on pelattu (Time.SinceStartOfGame) ja kuinka kaua...
Definition: Time.cs:25
SynchronousList< Layer > Layers
Kerrokset, joilla pelioliot viihtyvät.
Definition: Layers.cs:14
static Game Instance
Käynnissä olevan pelin pääolio.
Definition: Game.cs:96
double Width
Kentän leveys.
Definition: Level.cs:109
double Height
Kentän korkeus.
Definition: Level.cs:118
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
bool IsDestroyed
Onko kappale tuhottu
Definition: Destroyable.cs:13
Yhteinen rajapinta kaikille peliolioille.
Definition: IGameObject.cs:11
Yhteinen rajapinta kaikille fysiikkaolioille.
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
static double Distance(Vector p1, Vector p2)
Etäisyys kahden pisteen välillä.
Definition: Vector.cs:141
Angle Angle
Kulma radiaaneina.
Definition: Vector.cs:372
double Magnitude
Vektorin pituus.
Definition: Vector.cs:345
static Vector FromLengthAndAngle(double length, double angle)
Luo vektorin pituuden ja kulman perusteella.
Definition: Vector.cs:114