Jypeli  9
The simple game programming library
PhysicsGameBase.cs
Siirry tämän tiedoston dokumentaatioon.
1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using Jypeli.Physics;
5 
6 namespace 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 
42  public Vector Gravity
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 );
92  j.Object1.AddedToGame += j.AddToEngine;
93  }
94  else if ( j.Object2 != null && !j.Object2.IsAddedToGame )
95  {
96  j.SetEngine( Engine );
97  j.Object2.AddedToGame += j.AddToEngine;
98  }
99  else
100  {
101  Engine.AddJoint( j );
102  }
103  }
104 
106  {
107  Engine.RemoveJoint( j );
108  }
109 
110  protected override void OnObjectAdded( IGameObject obj )
111  {
112  if ( obj is PhysicsObject )
113  {
114  PhysicsObject po = (PhysicsObject)obj;
115  Engine.AddBody( po.Body );
116  }
117 
118  base.OnObjectAdded( obj );
119  }
120 
121  protected override void OnObjectRemoved( IGameObject obj )
122  {
123  if ( obj is PhysicsObject )
124  {
125  PhysicsObject po = (PhysicsObject)obj;
126  Engine.RemoveBody( po.Body );
127  }
128 
129  base.OnObjectRemoved( obj );
130  }
131 
135  public void StopAll()
136  {
137  foreach ( var layer in Layers )
138  {
139  foreach ( var obj in layer.Objects )
140  {
141  if ( obj is PhysicsObject )
142  ( (PhysicsObject)obj ).Stop();
143  }
144  }
145  }
146 
150  public override void ClearAll()
151  {
152  ClearPhysics();
154  base.ClearAll();
155  }
156 
160  private void ClearPhysics()
161  {
162  Engine.Clear();
163  }
164 
170  protected override void Update( Time time )
171  {
172  double dt = time.SinceLastUpdate.TotalSeconds;
173 
174  if ( PhysicsEnabled )
175  {
176  Engine.Update( dt );
177  }
178 
179  base.Update( time );
180 
181  // Updating joints must be after base.Update so that the bodies
182  // are added to the engine before the joints
183  Joints.Update( time );
184  }
185 
189  public void Add( IAxleJoint j )
190  {
191  Joints.Add( j );
192  }
193 
198  internal void Remove( IAxleJoint j )
199  {
200  Joints.Remove( j );
201  }
202 
203  #region Collision handlers
204 
212  public void AddCollisionHandler<O, T>( O obj, CollisionHandler<O, T> handler )
213  where O : IPhysicsObject
214  where T : IPhysicsObject
215  {
216  if ( obj == null ) throw new NullReferenceException( "Colliding object must not be null" );
217  if ( handler == null ) throw new NullReferenceException( "Handler must not be null" );
218 
219  CollisionHandler<IPhysicsObject, IPhysicsObject> targetHandler =
220  delegate( IPhysicsObject collider, IPhysicsObject collidee )
221  {
222  if ( collidee is T )
223  handler( (O)collider, (T)collidee );
224  };
225 
226  obj.Collided += targetHandler;
227  collisionHandlers.Add( new CollisionRecord( obj, null, null, handler ), targetHandler );
228  }
229 
238  [EditorBrowsable( EditorBrowsableState.Never )]
240  where O : IPhysicsObject
241  where T : IPhysicsObject
242  {
243  if ( obj == null ) throw new NullReferenceException( "Colliding object must not be null" );
244  if ( handler == null ) throw new NullReferenceException( "Handler must not be null" );
245 
246  CollisionHandler<IPhysicsObject, IPhysicsObject> targetHandler =
247  delegate( IPhysicsObject collider, IPhysicsObject collidee )
248  {
249  if ( collidee is T )
250  handler( (O)collider, (T)collidee );
251  };
252 
253  obj.Collided += targetHandler;
254  protectedCollisionHandlers.Add( new CollisionRecord( obj, null, null, handler ), targetHandler );
255  }
256 
263  public void AddCollisionHandler( IPhysicsObject obj, CollisionHandler<IPhysicsObject, IPhysicsObject> handler )
264  {
265  AddCollisionHandler<IPhysicsObject, IPhysicsObject>( obj, handler );
266  }
267 
273  public void AddCollisionHandler( PhysicsObject obj, CollisionHandler<PhysicsObject, PhysicsObject> handler )
274  {
275  AddCollisionHandler<PhysicsObject, PhysicsObject>( obj, handler );
276  }
277 
283  public void AddCollisionHandler( PhysicsObject obj, CollisionHandler<PhysicsObject, PhysicsStructure> handler )
284  {
285  AddCollisionHandler<PhysicsObject, PhysicsStructure>( obj, handler );
286  }
287 
293  public void AddCollisionHandler( PhysicsStructure obj, CollisionHandler<PhysicsStructure, PhysicsObject> handler )
294  {
295  AddCollisionHandler<PhysicsStructure, PhysicsObject>( obj, handler );
296  }
297 
303  public void AddCollisionHandler( PhysicsStructure obj, CollisionHandler<PhysicsStructure, PhysicsStructure> handler )
304  {
305  AddCollisionHandler<PhysicsStructure, PhysicsStructure>( obj, handler );
306  }
307 
315  public void AddCollisionHandlerByRef<O, T>( O obj, T target, CollisionHandler<O, T> handler )
316  where O : IPhysicsObject
317  where T : IPhysicsObject
318  {
319  if ( obj == null ) throw new NullReferenceException( "Colliding object must not be null" );
320  if ( target == null ) throw new NullReferenceException( "Collision target must not be null" );
321  if ( handler == null ) throw new NullReferenceException( "Handler must not be null" );
322 
323  CollisionHandler<IPhysicsObject, IPhysicsObject> targetHandler =
324  delegate( IPhysicsObject collider, IPhysicsObject collidee )
325  {
326  if ( object.ReferenceEquals( collidee, target ) )
327  handler( (O)collider, (T)collidee );
328  };
329 
330  obj.Collided += targetHandler;
331  collisionHandlers.Add( new CollisionRecord( obj, target, null, handler ), targetHandler );
332  }
333 
341  public void AddCollisionHandlerByTag<O, T>( O obj, object tag, CollisionHandler<O, T> handler )
342  where O : IPhysicsObject
343  where T : IPhysicsObject
344  {
345  if ( obj == null ) throw new NullReferenceException( "Colliding object must not be null" );
346  if ( tag == null ) throw new NullReferenceException( "Tag must not be null" );
347  if ( handler == null ) throw new NullReferenceException( "Handler must not be null" );
348 
349  CollisionHandler<IPhysicsObject, IPhysicsObject> targetHandler =
350  delegate( IPhysicsObject collider, IPhysicsObject collidee )
351  {
352  if ( collidee is T && StringHelpers.StringEquals( collidee.Tag, tag ) )
353  handler( (O)collider, (T)collidee );
354  };
355 
356  obj.Collided += targetHandler;
357  collisionHandlers.Add( new CollisionRecord( obj, null, tag, handler ), targetHandler );
358  }
359 
367  public void AddCollisionHandler<O, T>( O obj, object target, CollisionHandler<O, T> handler )
368  where O : IPhysicsObject
369  where T : IPhysicsObject
370  {
371  if ( target is T )
372  AddCollisionHandlerByRef( obj, (T)target, handler );
373  else
374  AddCollisionHandlerByTag( obj, target, handler );
375  }
376 
384  public void AddCollisionHandler( IPhysicsObject obj, object tag, CollisionHandler<IPhysicsObject, IPhysicsObject> handler )
385  {
386  AddCollisionHandler<IPhysicsObject, IPhysicsObject>( obj, tag, handler );
387  }
388 
396  public void AddCollisionHandler( PhysicsObject obj, object tag, CollisionHandler<PhysicsObject, PhysicsObject> handler )
397  {
398  AddCollisionHandler<PhysicsObject, PhysicsObject>( obj, tag, handler );
399  }
400 
408  public void RemoveCollisionHandlers( PhysicsObject obj = null, PhysicsObject target = null, object tag = null, Delegate handler = null )
409  {
410  Predicate<CollisionRecord> pred = rec =>
411  ( obj == null || object.ReferenceEquals( obj, rec.obj ) ) &&
412  ( target == null || target == rec.target ) &&
413  ( tag == null || StringHelpers.StringEquals( tag, rec.targetTag ) ) &&
414  ( handler == null || object.ReferenceEquals( handler, rec.handler ) );
415 
416  List<CollisionRecord> remove = new List<CollisionRecord>();
417 
418  foreach (var key in collisionHandlers.Keys)
419  {
420  if (pred(key)) remove.Add(key);
421  }
422 
423  foreach (var key in remove)
424  {
425  key.obj.Collided -= collisionHandlers[key];
426  collisionHandlers.Remove(key);
427  }
428  }
429 
438  [EditorBrowsable( EditorBrowsableState.Never )]
439  public void RemoveProtectedCollisionHandlers( PhysicsObject obj = null, PhysicsObject target = null, object tag = null, Delegate handler = null )
440  {
441  Predicate<CollisionRecord> pred = rec =>
442  ( obj == null || object.ReferenceEquals( obj, rec.obj ) ) &&
443  ( target == null || target == rec.target ) &&
444  ( tag == null || tag.Equals( rec.targetTag ) ) &&
445  ( handler == null || object.ReferenceEquals( handler, rec.handler ) );
446 
447  List<CollisionRecord> remove = new List<CollisionRecord>();
448 
449  foreach ( var key in collisionHandlers.Keys )
450  {
451  if ( pred( key ) ) remove.Add( key );
452  }
453 
454  foreach ( var key in remove )
455  {
456  key.obj.Collided -= protectedCollisionHandlers[key];
457  protectedCollisionHandlers.Remove( key );
458  }
459  }
460 
461  #endregion
462  }
463 }
Jypeli.Physics.IPhysicsEngine.RemoveJoint
void RemoveJoint(IAxleJoint joint)
Jypeli.Physics.IPhysicsEngine.Update
void Update(double dt)
Jypeli.PhysicsGameBase.gravity
Vector gravity
Definition: PhysicsGameBase.cs:37
Jypeli.PhysicsGameBase.CollisionRecord.targetTag
object targetTag
Definition: PhysicsGameBase.cs:17
Jypeli.PhysicsObject.Body
IPhysicsBody Body
Definition: Dimensions.cs:10
Jypeli.PhysicsGameBase.OnJointAdded
void OnJointAdded(IAxleJoint j)
Definition: PhysicsGameBase.cs:87
Jypeli.Physics.IPhysicsEngine
Definition: IPhysicsEngine.cs:4
Jypeli.PhysicsGameBase.RemoveCollisionHandlers
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.
Definition: PhysicsGameBase.cs:408
Jypeli.PhysicsGameBase.AddProtectedCollisionHandler< O, T >
void AddProtectedCollisionHandler< O, T >(O obj, CollisionHandler< O, T > handler)
Määrää, mihin aliohjelmaan siirrytään kun olio
Definition: PhysicsGameBase.cs:239
Jypeli.Vector.Zero
static readonly Vector Zero
Nollavektori.
Definition: Vector.cs:63
Jypeli.PhysicsStructure
Rakenne, joka pitää fysiikkaoliot kiinteän matkan päässä toisistaan.
Definition: PhysicsStructure.cs:11
Jypeli.PhysicsGameBase.ClearAll
override void ClearAll()
Nollaa kaiken (kontrollit, näyttöobjektit, ajastimet ja fysiikkamoottorin).
Definition: PhysicsGameBase.cs:150
Jypeli
Definition: Automobile.cs:5
Jypeli.PhysicsGameBase.AddCollisionHandlerByRef< O, T >
void AddCollisionHandlerByRef< O, T >(O obj, T target, CollisionHandler< O, T > handler)
Määrää, mihin aliohjelmaan siirrytään kun olio
Definition: PhysicsGameBase.cs:315
Jypeli.PhysicsGameBase
Kantaluokka fysiikkapeleille.
Definition: PhysicsGameBase.cs:12
Jypeli.Physics.IPhysicsEngine.AddBody
void AddBody(IPhysicsBody body)
Jypeli.StringHelpers.StringEquals
static bool StringEquals(object o1, object o2)
Vertaa kahta oliota, jotka ovat joko merkkijonoja tai StringBuildereita, merkki kerrallaan.
Definition: StringHelpers.cs:21
Jypeli.StringHelpers
Definition: StringHelpers.cs:7
Jypeli.IAxleJoint.SetEngine
void SetEngine(Jypeli.Physics.IPhysicsEngine engine)
Jypeli.PhysicsGameBase.AddCollisionHandler
void AddCollisionHandler(IPhysicsObject obj, CollisionHandler< IPhysicsObject, IPhysicsObject > handler)
Määrää, mihin aliohjelmaan siirrytään kun yleinen fysiikkaolio
Definition: PhysicsGameBase.cs:263
Jypeli.IGameObject
Yhteinen rajapinta kaikille peliolioille.
Definition: IGameObject.cs:11
Jypeli.PhysicsGameBase.protectedCollisionHandlers
Dictionary< CollisionRecord, CollisionHandler< IPhysicsObject, IPhysicsObject > > protectedCollisionHandlers
Definition: PhysicsGameBase.cs:34
Jypeli.PhysicsGameBase.AddCollisionHandler
void AddCollisionHandler(PhysicsObject obj, object tag, CollisionHandler< PhysicsObject, PhysicsObject > handler)
Määrää, mihin aliohjelmaan siirrytään kun fysiikkaolio
Definition: PhysicsGameBase.cs:396
Jypeli.IAxleJoint.Object2
PhysicsObject Object2
Toinen olio (null jos ensimmäinen olio on sidottu pisteeseen)
Definition: IAxleJoint.cs:45
Jypeli.PhysicsGameBase.Add
void Add(IAxleJoint j)
Lisää liitoksen peliin.
Definition: PhysicsGameBase.cs:189
Jypeli.Physics.IPhysicsEngine.AddJoint
void AddJoint(IAxleJoint joint)
Jypeli.PhysicsGameBase.AddCollisionHandler
void AddCollisionHandler(PhysicsStructure obj, CollisionHandler< PhysicsStructure, PhysicsStructure > handler)
Määrää, mihin aliohjelmaan siirrytään kun fysiikkarakenne
Definition: PhysicsGameBase.cs:303
Jypeli.PhysicsGameBase.CollisionRecord.handler
Delegate handler
Definition: PhysicsGameBase.cs:18
Jypeli.IPhysicsObject
Yhteinen rajapinta kaikille fysiikkaolioille.
Definition: IPhysicsObject.cs:12
Jypeli.Game.Instance
static Game Instance
Käynnissä olevan pelin pääolio.
Definition: Game.cs:90
Jypeli.Physics.IPhysicsEngine.Gravity
Vector Gravity
Definition: IPhysicsEngine.cs:5
Jypeli.PhysicsGameBase.Remove
void Remove(IAxleJoint j)
Poistaa liitoksen pelistä.
Definition: PhysicsGameBase.cs:198
Jypeli.PhysicsGameBase.AddCollisionHandler
void AddCollisionHandler(IPhysicsObject obj, object tag, CollisionHandler< IPhysicsObject, IPhysicsObject > handler)
Määrää, mihin aliohjelmaan siirrytään kun yleinen fysiikkaolio
Definition: PhysicsGameBase.cs:384
Jypeli.IAxleJoint.Object1
PhysicsObject Object1
Ensimmäinen olio.
Definition: IAxleJoint.cs:40
Jypeli.PhysicsGameBase.PhysicsEnabled
bool PhysicsEnabled
Onko fysiikan laskenta käytössä vai ei.
Definition: PhysicsGameBase.cs:72
Jypeli.Time
Sisältää tiedon ajasta, joka on kulunut pelin alusta ja viime päivityksestä.
Definition: Time.cs:14
Jypeli.PhysicsGameBase.CollisionRecord
Definition: PhysicsGameBase.cs:14
Jypeli.PhysicsGameBase.Joints
SynchronousList< IAxleJoint > Joints
Definition: PhysicsGameBase.cs:31
Jypeli.PhysicsGameBase.CollisionRecord.CollisionRecord
CollisionRecord(IPhysicsObject obj, IPhysicsObject target, object targetTag, Delegate handler)
Definition: PhysicsGameBase.cs:20
Jypeli.Time.SinceLastUpdate
TimeSpan SinceLastUpdate
Aika joka on kulunut viime päivityksestä.
Definition: Time.cs:24
Jypeli.PhysicsGameBase.Gravity
Vector Gravity
Painovoima. Voimavektori, joka vaikuttaa kaikkiin ei-staattisiin kappaleisiin.
Definition: PhysicsGameBase.cs:43
Jypeli.PhysicsGameBase.StopAll
void StopAll()
Pysäyttää kaiken liikkeen.
Definition: PhysicsGameBase.cs:135
Jypeli.PhysicsGameBase.OnJointRemoved
void OnJointRemoved(IAxleJoint j)
Definition: PhysicsGameBase.cs:105
Jypeli.Tagged.Tag
object Tag
Definition: Tagged.cs:8
Jypeli.PhysicsGameBase.collisionHandlers
Dictionary< CollisionRecord, CollisionHandler< IPhysicsObject, IPhysicsObject > > collisionHandlers
Definition: PhysicsGameBase.cs:32
Jypeli.IAxleJoint
Definition: IAxleJoint.cs:36
Jypeli.PhysicsGameBase.CollisionRecord.obj
IPhysicsObject obj
Definition: PhysicsGameBase.cs:15
Jypeli.PhysicsGameBase.AddCollisionHandler
void AddCollisionHandler(PhysicsObject obj, CollisionHandler< PhysicsObject, PhysicsObject > handler)
Määrää, mihin aliohjelmaan siirrytään kun fysiikkaolio
Definition: PhysicsGameBase.cs:273
Jypeli.PhysicsGameBase.ClearPhysics
void ClearPhysics()
Nollaa fysiikkamoottorin.
Definition: PhysicsGameBase.cs:160
Jypeli.Physics.IPhysicsEngine.RemoveBody
void RemoveBody(IPhysicsBody body)
Jypeli.PhysicsGameBase.OnObjectRemoved
override void OnObjectRemoved(IGameObject obj)
Definition: PhysicsGameBase.cs:121
Jypeli.Physics
Definition: Collision.cs:4
Jypeli.PhysicsGameBase.AddCollisionHandlerByTag< O, T >
void AddCollisionHandlerByTag< O, T >(O obj, object tag, CollisionHandler< O, T > handler)
Määrää, mihin aliohjelmaan siirrytään kun olio
Definition: PhysicsGameBase.cs:341
Jypeli.PhysicsGameBase.PhysicsGameBase
PhysicsGameBase(IPhysicsEngine engine)
Alustaa uuden fysiikkapelin.
Definition: PhysicsGameBase.cs:77
Jypeli.Vector
2D-vektori.
Definition: Vector.cs:59
System
Definition: CFFauxAttributes.cs:29
Jypeli.PhysicsGameBase.Engine
IPhysicsEngine Engine
Definition: PhysicsGameBase.cs:29
Jypeli.PhysicsObject
Definition: Collisions.cs:6
Jypeli.PhysicsGameBase.CollisionRecord.target
IPhysicsObject target
Definition: PhysicsGameBase.cs:16
Jypeli.PhysicsGameBase.RemoveProtectedCollisionHandlers
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!
Definition: PhysicsGameBase.cs:439
Jypeli.SynchronousList
Synkroninen lista, eli lista joka päivittyy vasta kun sen Update-metodia kutsutaan....
Definition: SynchronousList.cs:15
Jypeli.Game.Layers
SynchronousList< Layer > Layers
Kerrokset, joilla pelioliot viihtyvät.
Definition: Layers.cs:14
Jypeli.Game
Definition: Content.cs:46
Jypeli.PhysicsGameBase.Update
override void Update(Time time)
Ajetaan kun pelin tilannetta päivitetään. Päivittämisen voi toteuttaa perityssä luokassa toteuttamall...
Definition: PhysicsGameBase.cs:170
Jypeli.PhysicsGameBase.OnObjectAdded
override void OnObjectAdded(IGameObject obj)
Definition: PhysicsGameBase.cs:110
Jypeli.PhysicsGameBase.AddCollisionHandler
void AddCollisionHandler(PhysicsStructure obj, CollisionHandler< PhysicsStructure, PhysicsObject > handler)
Määrää, mihin aliohjelmaan siirrytään kun fysiikkarakenne
Definition: PhysicsGameBase.cs:293
Jypeli.Physics.IPhysicsEngine.Clear
void Clear()
Jypeli.PhysicsGameBase.AddCollisionHandler
void AddCollisionHandler(PhysicsObject obj, CollisionHandler< PhysicsObject, PhysicsStructure > handler)
Määrää, mihin aliohjelmaan siirrytään kun fysiikkaolio
Definition: PhysicsGameBase.cs:283
Jypeli.PhysicsGameBase.Instance
static new PhysicsGameBase Instance
Käynnissä olevan fysiikkapelin pääolio.
Definition: PhysicsGameBase.cs:59
Jypeli.IAxleJoint.AddToEngine
void AddToEngine()
Jypeli.PhysicsGameBase.AddCollisionHandler< O, T >
void AddCollisionHandler< O, T >(O obj, CollisionHandler< O, T > handler)
Määrää, mihin aliohjelmaan siirrytään kun olio
Definition: PhysicsGameBase.cs:212
Jypeli.CollisionHandler< O, T >
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 paluuarvoa ...