2 using System.Collections.Generic;
33 protected Dictionary<CollisionRecord, CollisionHandler<IPhysicsObject, IPhysicsObject>>
collisionHandlers =
34 new Dictionary<CollisionRecord, CollisionHandler<IPhysicsObject, IPhysicsObject>>();
36 new Dictionary<CollisionRecord, CollisionHandler<IPhysicsObject, IPhysicsObject>>();
51 phsEngine =
new PhysicsEngine();
57 void OnJointAdded( Joint j )
59 j.Lifetime.IsExpired =
false;
60 phsEngine.AddJoint( j );
63 void OnJointRemoved( Joint j )
65 j.Lifetime.IsExpired =
true;
72 AddToEngine( (PhysicsObject)obj );
75 base.OnObjectAdded( obj );
82 RemoveFromEngine( (PhysicsObject)obj );
85 base.OnObjectRemoved( obj );
93 foreach ( var layer
in Layers )
95 foreach ( var
obj in layer.Objects )
98 ( (PhysicsObject)obj ).Stop();
115 private void ClearPhysics()
122 if ( po.
Body.Engine != null )
125 po.
Body.Lifetime.IsExpired =
false;
126 phsEngine.AddBody( po.
Body );
131 if ( po.
Body.Engine == null )
134 po.
Body.Lifetime.IsExpired =
true;
160 Joints.
Remove( j.innerJoint );
171 if ( obj1ok && obj2ok )
193 phsEngine.Update( dt );
203 #region Collision handlers 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" );
219 CollisionHandler<IPhysicsObject, IPhysicsObject> targetHandler =
223 handler( (
O)collider, (T)collidee );
226 obj.Collided += targetHandler;
242 if ( obj == null )
throw new NullReferenceException(
"Colliding object must not be null" );
243 if (
handler == null )
throw new NullReferenceException(
"Handler must not be null" );
245 CollisionHandler<IPhysicsObject, IPhysicsObject> targetHandler =
249 handler( (
O)collider, (T)collidee );
252 obj.Collided += targetHandler;
264 AddCollisionHandler<IPhysicsObject, IPhysicsObject>(
obj,
handler );
274 AddCollisionHandler<PhysicsObject, PhysicsObject>(
obj,
handler );
284 AddCollisionHandler<PhysicsObject, PhysicsStructure>(
obj,
handler );
294 AddCollisionHandler<PhysicsStructure, PhysicsObject>(
obj,
handler );
304 AddCollisionHandler<PhysicsStructure, PhysicsStructure>(
obj,
handler );
318 if ( obj == null )
throw new NullReferenceException(
"Colliding object must not be null" );
319 if ( target == null )
throw new NullReferenceException(
"Collision target must not be null" );
320 if (
handler == null )
throw new NullReferenceException(
"Handler must not be null" );
322 CollisionHandler<IPhysicsObject, IPhysicsObject> targetHandler =
325 if (
object.ReferenceEquals( collidee, target ) )
329 obj.Collided += targetHandler;
344 if ( obj == null )
throw new NullReferenceException(
"Colliding object must not be null" );
345 if ( tag == null )
throw new NullReferenceException(
"Tag must not be null" );
346 if (
handler == null )
throw new NullReferenceException(
"Handler must not be null" );
348 CollisionHandler<IPhysicsObject, IPhysicsObject> targetHandler =
355 obj.Collided += targetHandler;
371 AddCollisionHandlerByRef( obj, (T)target,
handler );
373 AddCollisionHandlerByTag( obj, target,
handler );
385 AddCollisionHandler<IPhysicsObject, IPhysicsObject>(
obj, tag,
handler );
397 AddCollisionHandler<PhysicsObject, PhysicsObject>(
obj, tag,
handler );
409 Predicate<CollisionRecord> pred = rec =>
410 ( obj == null ||
object.ReferenceEquals( obj, rec.obj ) ) &&
411 ( target == null || target == rec.target ) &&
413 (
handler == null ||
object.ReferenceEquals(
handler, rec.handler ) );
415 List<CollisionRecord>
remove =
new List<CollisionRecord>();
417 foreach (var key
in collisionHandlers.Keys)
419 if (pred(key))
remove.
Add(key);
422 foreach (var key
in remove)
424 key.obj.Collided -= collisionHandlers[key];
425 collisionHandlers.Remove(key);
439 Predicate<CollisionRecord> pred = rec =>
440 ( obj == null ||
object.ReferenceEquals( obj, rec.obj ) ) &&
441 ( target == null || target == rec.target ) &&
442 ( tag == null || tag.Equals( rec.targetTag ) ) &&
443 (
handler == null ||
object.ReferenceEquals(
handler, rec.handler ) );
445 List<CollisionRecord>
remove =
new List<CollisionRecord>();
447 foreach ( var key
in collisionHandlers.Keys )
449 if ( pred( key ) )
remove.
Add( key );
452 foreach ( var key
in remove )
454 key.obj.Collided -= protectedCollisionHandlers[key];
455 protectedCollisionHandlers.Remove( key );
void AddCollisionHandler(IPhysicsObject obj, CollisionHandler< IPhysicsObject, IPhysicsObject > handler)
Määrää, mihin aliohjelmaan siirrytään kun yleinen fysiikkaolio
bool IsAddedToGame
Onko olio lisätty peliin.
Dictionary< CollisionRecord, CollisionHandler< IPhysicsObject, IPhysicsObject > > protectedCollisionHandlers
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 ja se ott...
void Add(Physics2DDotNet.Joints.Joint j)
Lisää liitoksen peliin.
override void OnObjectAdded(IGameObject obj)
void AddCollisionHandlerByRef< O, T >(O obj, T target, CollisionHandler< O, T > handler)
Määrää, mihin aliohjelmaan siirrytään kun olio
Yhteinen rajapinta kaikille fysiikkaolioille.
void AddCollisionHandler(PhysicsObject obj, CollisionHandler< PhysicsObject, PhysicsStructure > handler)
Määrää, mihin aliohjelmaan siirrytään kun fysiikkaolio
void Update(Time time)
Lisää ja poistaa jonossa olevat elementit sekä kutsuu niiden Update-metodia.
void AddCollisionHandler(IPhysicsObject obj, object tag, CollisionHandler< IPhysicsObject, IPhysicsObject > handler)
Määrää, mihin aliohjelmaan siirrytään kun yleinen fysiikkaolio
override void ClearAll()
Nollaa kaiken (kontrollit, näyttöobjektit, ajastimet ja fysiikkamoottorin).
void StopAll()
Pysäyttää kaiken liikkeen.
Peliolio, joka noudattaa fysiikkamoottorin määräämiä fysiikan lakeja. Voidaan kuitenkin myös laittaa ...
void AddCollisionHandler(PhysicsStructure obj, CollisionHandler< PhysicsStructure, PhysicsObject > handler)
Määrää, mihin aliohjelmaan siirrytään kun fysiikkarakenne
TimeSpan SinceLastUpdate
Aika joka on kulunut viime päivityksestä.
PhysicsObject Object2
Toinen olio (null jos ensimmäinen olio on sidottu pisteeseen)
void AddCollisionHandler< O, T >(O obj, CollisionHandler< O, T > handler)
Määrää, mihin aliohjelmaan siirrytään kun olio
Sisältää tiedon ajasta, joka on kulunut pelin alusta ja viime päivityksestä.
Saranaliitos kahden olion välille.
Rakenne, joka pitää fysiikkaoliot kiinteän matkan päässä toisistaan.
static bool StringEquals(object o1, object o2)
Vertaa kahta oliota, jotka ovat joko merkkijonoja tai StringBuildereita, merkki kerrallaan.
SynchronousList< Layer > Layers
Kerrokset, joilla pelioliot viihtyvät.
Peliluokka reaaliaikaisille peleille.
PhysicsObject Object1
Ensimmäinen olio.
void AddCollisionHandler(PhysicsObject obj, CollisionHandler< PhysicsObject, PhysicsObject > handler)
Määrää, mihin aliohjelmaan siirrytään kun fysiikkaolio
CollisionRecord(IPhysicsObject obj, IPhysicsObject target, object targetTag, Delegate handler)
void AddCollisionHandlerByTag< O, T >(O obj, object tag, CollisionHandler< O, T > handler)
Määrää, mihin aliohjelmaan siirrytään kun olio
Action< T > ItemAdded
Tapahtuu kun uusi elementti on lisätty listaan.
Action AddedToGame
Tapahtuu, kun olio lisätään peliin.
Body Body
Fysiikkamoottorin käyttämä tietorakenne.
Kantaluokka fysiikkapeleille.
bool PhysicsEnabled
Onko fysiikan laskenta käytössä vai ei.
void AddCollisionHandler(PhysicsStructure obj, CollisionHandler< PhysicsStructure, PhysicsStructure > handler)
Määrää, mihin aliohjelmaan siirrytään kun fysiikkarakenne
void Add(AxleJoint j)
Lisää liitoksen peliin.
override void Update(Time time)
Ajetaan kun pelin tilannetta päivitetään. Päivittämisen voi toteuttaa perityssä luokassa toteuttamall...
Yhteinen rajapinta kaikille peliolioille.
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)
PhysicsGameBase(int device)
Alustaa uuden fysiikkapelin.
Action< T > ItemRemoved
Tapahtuu kun elementti on poistettu listasta.
void AddCollisionHandler(PhysicsObject obj, object tag, CollisionHandler< PhysicsObject, PhysicsObject > handler)
Määrää, mihin aliohjelmaan siirrytään kun fysiikkaolio
Dictionary< CollisionRecord, CollisionHandler< IPhysicsObject, IPhysicsObject > > collisionHandlers