Jypeli 10
The simple game programming library
PhysicsGameBase.cs
Siirry tämän tiedoston dokumentaatioon.
1using System;
2using System.Collections.Generic;
3using System.ComponentModel;
4using Jypeli.Physics;
5
6namespace Jypeli
7{
11 public abstract partial class PhysicsGameBase : Game
12 {
13 protected struct CollisionRecord
14 {
17 public object targetTag;
18 public Delegate handler;
19
21 {
22 this.obj = obj;
23 this.target = target;
24 this.targetTag = targetTag;
25 this.handler = handler;
26 }
27 }
28
29 public IPhysicsEngine Engine { get; private set; }
30
32 protected Dictionary<CollisionRecord, CollisionHandler<IPhysicsObject, IPhysicsObject>> collisionHandlers =
33 new Dictionary<CollisionRecord, CollisionHandler<IPhysicsObject, IPhysicsObject>>();
34 protected Dictionary<CollisionRecord, CollisionHandler<IPhysicsObject, IPhysicsObject>> protectedCollisionHandlers =
35 new Dictionary<CollisionRecord, CollisionHandler<IPhysicsObject, IPhysicsObject>>();
36
38
43 {
44 get
45 {
46 return gravity;
47 }
48 set
49 {
50 gravity = value;
51 Engine.Gravity = value;
52 }
53 }
54
58 public static new PhysicsGameBase Instance
59 {
60 get
61 {
62 if ( Game.Instance == null ) throw new InvalidOperationException( "Game class is not initialized" );
63 if ( !( Game.Instance is PhysicsGameBase ) ) throw new InvalidOperationException( "Game class is not PhysicsGame" );
64
65 return (PhysicsGameBase)( Game.Instance );
66 }
67 }
68
72 public bool PhysicsEnabled { get; set; }
73
78 : base()
79 {
80 this.Engine = engine;
81 PhysicsEnabled = true;
82
83 Joints.ItemAdded += OnJointAdded;
84 Joints.ItemRemoved += OnJointRemoved;
85 }
86
88 {
89 if ( !j.Object1.IsAddedToGame )
90 {
91 j.SetEngine( Engine );
93 }
94 else if ( j.Object2 != null && !j.Object2.IsAddedToGame )
95 {
96 j.SetEngine( Engine );
98 }
99 else
100 {
101 Engine.AddJoint( j );
102 }
103 }
104
106 {
107 Engine.RemoveJoint( j );
108 }
109
114 protected override void OnObjectAdded( IGameObject obj )
115 {
116 if ( obj is PhysicsObject )
117 {
119 Engine.AddBody( po.Body );
120 }
121
122 base.OnObjectAdded( obj );
123 }
124
129 protected override void OnObjectRemoved( IGameObject obj )
130 {
131 if ( obj is PhysicsObject )
132 {
134 Engine.RemoveBody( po.Body );
135 }
136
137 base.OnObjectRemoved( obj );
138 }
139
143 public void StopAll()
144 {
145 foreach ( var layer in Layers )
146 {
147 foreach ( var obj in layer.Objects )
148 {
149 if ( obj is PhysicsObject )
150 ( (PhysicsObject)obj ).Stop();
151 }
152 }
153 }
154
158 public override void ClearAll()
159 {
160 if(!FarseerGame)
161 ClearPhysics(); // Farseerilla tämä poistaa jo kappaleet moottorilta ja ne poistettaisiin uudestaan myöhemmin Layerien tyhjennyksen yhteydessä, joka taas aiheuttaa nullpointerin.
163 base.ClearAll();
164 }
165
169 private void ClearPhysics()
170 {
171 Engine.Clear();
172 }
173
179 protected override void Update( Time time )
180 {
181 double dt = time.SinceLastUpdate.TotalSeconds;
182
183 if ( PhysicsEnabled )
184 {
185 Engine.Update( dt );
186 }
187
188 base.Update( time );
189
190 // Updating joints must be after base.Update so that the bodies
191 // are added to the engine before the joints
192 Joints.Update( time );
193 }
194
198 public void Add( IAxleJoint j )
199 {
200 Joints.Add( j );
201 }
202
207 internal void Remove( IAxleJoint j )
208 {
209 Joints.Remove( j );
210 }
211
212 #region Collision handlers
213
222 where O : IPhysicsObject
223 where T : IPhysicsObject
224 {
225 if ( obj == null ) throw new NullReferenceException( "Colliding object must not be null" );
226 if ( handler == null ) throw new NullReferenceException( "Handler must not be null" );
227
228 CollisionHandler<IPhysicsObject, IPhysicsObject> targetHandler =
229 delegate( IPhysicsObject collider, IPhysicsObject collidee )
230 {
231 if ( collidee is T )
232 handler( (O)collider, (T)collidee );
233 };
234
235 obj.Collided += targetHandler;
236 collisionHandlers.Add( new CollisionRecord( obj, null, null, handler ), targetHandler );
237 }
238
247 [EditorBrowsable( EditorBrowsableState.Never )]
249 where O : IPhysicsObject
250 where T : IPhysicsObject
251 {
252 if ( obj == null ) throw new NullReferenceException( "Colliding object must not be null" );
253 if ( handler == null ) throw new NullReferenceException( "Handler must not be null" );
254
255 CollisionHandler<IPhysicsObject, IPhysicsObject> targetHandler =
256 delegate( IPhysicsObject collider, IPhysicsObject collidee )
257 {
258 if ( collidee is T )
259 handler( (O)collider, (T)collidee );
260 };
261
262 obj.Collided += targetHandler;
263 protectedCollisionHandlers.Add( new CollisionRecord( obj, null, null, handler ), targetHandler );
264 }
265
272 public void AddCollisionHandler( IPhysicsObject obj, CollisionHandler<IPhysicsObject, IPhysicsObject> handler )
273 {
274 AddCollisionHandler<IPhysicsObject, IPhysicsObject>( obj, handler );
275 }
276
282 public void AddCollisionHandler( PhysicsObject obj, CollisionHandler<PhysicsObject, PhysicsObject> handler )
283 {
284 AddCollisionHandler<PhysicsObject, PhysicsObject>( obj, handler );
285 }
286
292 public void AddCollisionHandler( PhysicsObject obj, CollisionHandler<PhysicsObject, PhysicsStructure> handler )
293 {
294 AddCollisionHandler<PhysicsObject, PhysicsStructure>( obj, handler );
295 }
296
302 public void AddCollisionHandler( PhysicsStructure obj, CollisionHandler<PhysicsStructure, PhysicsObject> handler )
303 {
304 AddCollisionHandler<PhysicsStructure, PhysicsObject>( obj, handler );
305 }
306
312 public void AddCollisionHandler( PhysicsStructure obj, CollisionHandler<PhysicsStructure, PhysicsStructure> handler )
313 {
314 AddCollisionHandler<PhysicsStructure, PhysicsStructure>( obj, handler );
315 }
316
324 public void AddCollisionHandlerByRef<O, T>( O obj, T target, CollisionHandler<O, T> handler )
325 where O : IPhysicsObject
326 where T : IPhysicsObject
327 {
328 if ( obj == null ) throw new NullReferenceException( "Colliding object must not be null" );
329 if ( target == null ) throw new NullReferenceException( "Collision target must not be null" );
330 if ( handler == null ) throw new NullReferenceException( "Handler must not be null" );
331
332 CollisionHandler<IPhysicsObject, IPhysicsObject> targetHandler =
333 delegate( IPhysicsObject collider, IPhysicsObject collidee )
334 {
335 if ( object.ReferenceEquals( collidee, target ) )
336 handler( (O)collider, (T)collidee );
337 };
338
339 obj.Collided += targetHandler;
340 collisionHandlers.Add( new CollisionRecord( obj, target, null, handler ), targetHandler );
341 }
342
350 public void AddCollisionHandlerByTag<O, T>( O obj, object tag, CollisionHandler<O, T> handler )
351 where O : IPhysicsObject
352 where T : IPhysicsObject
353 {
354 if ( obj == null ) throw new NullReferenceException( "Colliding object must not be null" );
355 if ( tag == null ) throw new NullReferenceException( "Tag must not be null" );
356 if ( handler == null ) throw new NullReferenceException( "Handler must not be null" );
357
358 CollisionHandler<IPhysicsObject, IPhysicsObject> targetHandler =
359 delegate( IPhysicsObject collider, IPhysicsObject collidee )
360 {
361 if ( collidee is T && StringHelpers.StringEquals( collidee.Tag, tag ) )
362 handler( (O)collider, (T)collidee );
363 };
364
365 obj.Collided += targetHandler;
366 collisionHandlers.Add( new CollisionRecord( obj, null, tag, handler ), targetHandler );
367 }
368
376 public void AddCollisionHandler<O, T>( O obj, object target, CollisionHandler<O, T> handler )
377 where O : IPhysicsObject
378 where T : IPhysicsObject
379 {
380 if ( target is T )
381 AddCollisionHandlerByRef( obj, (T)target, handler );
382 else
383 AddCollisionHandlerByTag( obj, target, handler );
384 }
385
393 public void AddCollisionHandler( IPhysicsObject obj, object tag, CollisionHandler<IPhysicsObject, IPhysicsObject> handler )
394 {
395 AddCollisionHandler<IPhysicsObject, IPhysicsObject>( obj, tag, handler );
396 }
397
405 public void AddCollisionHandler( PhysicsObject obj, object tag, CollisionHandler<PhysicsObject, PhysicsObject> handler )
406 {
407 AddCollisionHandler<PhysicsObject, PhysicsObject>( obj, tag, handler );
408 }
409
417 public void RemoveCollisionHandlers( PhysicsObject obj = null, PhysicsObject target = null, object tag = null, Delegate handler = null )
418 {
419 Predicate<CollisionRecord> pred = rec =>
420 ( obj == null || object.ReferenceEquals( obj, rec.obj ) ) &&
421 ( target == null || target == rec.target ) &&
422 ( tag == null || StringHelpers.StringEquals( tag, rec.targetTag ) ) &&
423 ( handler == null || object.ReferenceEquals( handler, rec.handler ) );
424
425 List<CollisionRecord> remove = new List<CollisionRecord>();
426
427 foreach (var key in collisionHandlers.Keys)
428 {
429 if (pred(key)) remove.Add(key);
430 }
431
432 foreach (var key in remove)
433 {
434 key.obj.Collided -= collisionHandlers[key];
435 collisionHandlers.Remove(key);
436 }
437 }
438
447 [EditorBrowsable( EditorBrowsableState.Never )]
448 public void RemoveProtectedCollisionHandlers( PhysicsObject obj = null, PhysicsObject target = null, object tag = null, Delegate handler = null )
449 {
450 Predicate<CollisionRecord> pred = rec =>
451 ( obj == null || object.ReferenceEquals( obj, rec.obj ) ) &&
452 ( target == null || target == rec.target ) &&
453 ( tag == null || tag.Equals( rec.targetTag ) ) &&
454 ( handler == null || object.ReferenceEquals( handler, rec.handler ) );
455
456 List<CollisionRecord> remove = new List<CollisionRecord>();
457
458 foreach ( var key in collisionHandlers.Keys )
459 {
460 if ( pred( key ) ) remove.Add( key );
461 }
462
463 foreach ( var key in remove )
464 {
465 key.obj.Collided -= protectedCollisionHandlers[key];
466 protectedCollisionHandlers.Remove( key );
467 }
468 }
469
470 #endregion
471 }
472}
bool FarseerGame
Onko käytössä Farseer-fysiikkamoottori HUOM: Tämä saattaa poistua tulevaisuudessa jos/kun siitä tehdä...
Definition: Game.cs:113
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
bool IsAddedToGame
Onko olio lisätty peliin.
Action AddedToGame
Tapahtuu, kun olio lisätään peliin.
Kantaluokka fysiikkapeleille.
override void ClearAll()
Tuhoaa kaikki pelioliot, ajastimet, törmäyksenkuuntelijat ja näppäinkuuntelijat, sekä resetoi kameran...
void AddCollisionHandlerByTag< O, T >(O obj, object tag, CollisionHandler< O, T > handler)
Määrää, mihin aliohjelmaan siirrytään kun olio
Vector Gravity
Painovoima. Voimavektori, joka vaikuttaa kaikkiin ei-staattisiin kappaleisiin.
void OnJointAdded(IAxleJoint j)
void AddCollisionHandlerByRef< O, T >(O obj, T target, CollisionHandler< O, T > handler)
Määrää, mihin aliohjelmaan siirrytään kun olio
override void Update(Time time)
Ajetaan kun pelin tilannetta päivitetään. Päivittämisen voi toteuttaa perityssä luokassa toteuttamall...
void RemoveCollisionHandlers(PhysicsObject obj=null, PhysicsObject target=null, object tag=null, Delegate handler=null)
Poistaa kaikki ehdot täyttävät törmäyksenkäsittelijät.
override void OnObjectRemoved(IGameObject obj)
Kun olio poistetaan pelistä
static new PhysicsGameBase Instance
Käynnissä olevan fysiikkapelin pääolio.
void AddCollisionHandler(PhysicsObject obj, CollisionHandler< PhysicsObject, PhysicsStructure > handler)
Määrää, mihin aliohjelmaan siirrytään kun fysiikkaolio
Dictionary< CollisionRecord, CollisionHandler< IPhysicsObject, IPhysicsObject > > collisionHandlers
void AddCollisionHandler< O, T >(O obj, CollisionHandler< O, T > handler)
Määrää, mihin aliohjelmaan siirrytään kun olio
void AddCollisionHandler(IPhysicsObject obj, object tag, CollisionHandler< IPhysicsObject, IPhysicsObject > handler)
Määrää, mihin aliohjelmaan siirrytään kun yleinen fysiikkaolio
void AddProtectedCollisionHandler< O, T >(O obj, CollisionHandler< O, T > handler)
Määrää, mihin aliohjelmaan siirrytään kun olio
void AddCollisionHandler(PhysicsObject obj, object tag, CollisionHandler< PhysicsObject, PhysicsObject > handler)
Määrää, mihin aliohjelmaan siirrytään kun fysiikkaolio
void AddCollisionHandler(PhysicsStructure obj, CollisionHandler< PhysicsStructure, PhysicsObject > handler)
Määrää, mihin aliohjelmaan siirrytään kun fysiikkarakenne
void StopAll()
Pysäyttää kaiken liikkeen.
void AddCollisionHandler(IPhysicsObject obj, CollisionHandler< IPhysicsObject, IPhysicsObject > handler)
Määrää, mihin aliohjelmaan siirrytään kun yleinen fysiikkaolio
SynchronousList< IAxleJoint > Joints
Dictionary< CollisionRecord, CollisionHandler< IPhysicsObject, IPhysicsObject > > protectedCollisionHandlers
void OnJointRemoved(IAxleJoint j)
void Remove(IAxleJoint j)
Poistaa liitoksen pelistä.
void AddCollisionHandler(PhysicsObject obj, CollisionHandler< PhysicsObject, PhysicsObject > handler)
Määrää, mihin aliohjelmaan siirrytään kun fysiikkaolio
PhysicsGameBase(IPhysicsEngine engine)
Alustaa uuden fysiikkapelin.
bool PhysicsEnabled
Onko fysiikan laskenta käytössä vai ei.
override void OnObjectAdded(IGameObject obj)
Kun olio lisätään peliin
void Add(IAxleJoint j)
Lisää liitoksen peliin.
void AddCollisionHandler(PhysicsStructure obj, CollisionHandler< PhysicsStructure, PhysicsStructure > handler)
Määrää, mihin aliohjelmaan siirrytään kun fysiikkarakenne
void ClearPhysics()
Nollaa fysiikkamoottorin.
void RemoveProtectedCollisionHandlers(PhysicsObject obj=null, PhysicsObject target=null, object tag=null, Delegate handler=null)
Poistaa kaikki ehdot täyttävät törmäyksenkäsittelijät. Jypelin sisäiseen käyttöön!
Kappale joka noudattaa fysiikan lakeja, johon voi törmätä. Vaatii että käytössä on fysiikkapeli.
Definition: Collisions.cs:7
IPhysicsBody Body
Fysiikkamoottorin käsittelemä fysiikkakappale.
Definition: Dimensions.cs:12
Rakenne, joka pitää fysiikkaoliot kiinteän matkan päässä toisistaan.
Sisältää avustusmetodeja merkkijonojen käsittelyyn.
static bool StringEquals(object o1, object o2)
Vertaa kahta oliota, jotka ovat joko merkkijonoja tai StringBuildereita, merkki kerrallaan.
Synkroninen lista, eli lista joka päivittyy vasta kun sen Update-metodia kutsutaan....
Akseliliitos
Definition: IAxleJoint.cs:59
void SetEngine(Jypeli.Physics.IPhysicsEngine engine)
Asettaa liitokselle fysiikkamoottorin
PhysicsObject Object2
Toinen olio (null jos ensimmäinen olio on sidottu pisteeseen)
Definition: IAxleJoint.cs:68
void AddToEngine()
Lisää liitoksen fysiikkamoottorille
PhysicsObject Object1
Ensimmäinen olio.
Definition: IAxleJoint.cs:63
Yhteinen rajapinta kaikille peliolioille.
Definition: IGameObject.cs:11
Yhteinen rajapinta kaikille fysiikkaolioille.
Rajapinta fysiikkamoottorille.
void RemoveJoint(IAxleJoint joint)
void RemoveBody(IPhysicsBody body)
void AddJoint(IAxleJoint joint)
void AddBody(IPhysicsBody body)
object Tag
Olion tagi, voi olla mitä tahansa
Definition: Tagged.cs:11
delegate void CollisionHandler< O, T >(O collidingObject, T otherObject)
Törmäystapahtumiin liitettävän metodin tyyppi. Törmäyksen käsittelevällä metodilla ei ole pa...
CollisionRecord(IPhysicsObject obj, IPhysicsObject target, object targetTag, Delegate handler)
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 readonly Vector Zero
Nollavektori.
Definition: Vector.cs:71