2 using System.Collections.Generic;
17 private double _softness = 0;
18 private List<PhysicsObject> objects;
28 public IList<PhysicsObject>
Objects 30 get {
return objects.AsReadOnly(); }
36 internal List<AxleJoint> Joints {
get;
private set; }
43 get {
return _softness; }
48 for (
int i = 0; i < Joints.Count; i++ )
50 Joints[i].Softness = value;
59 if ( objects.Count == 0 )
62 double top = objects[0].Top;
63 double left = objects[0].Left;
64 double bottom = objects[0].Bottom;
65 double right = objects[0].Right;
67 for (
int i = 1; i < objects.Count; i++ )
69 if ( objects[i].
Top > top ) top = objects[i].Top;
70 if ( objects[i].
Left < left ) left = objects[i].Left;
71 if ( objects[i].
Bottom < bottom ) bottom = objects[i].Bottom;
72 if ( objects[i].
Right > right ) right = objects[i].Right;
81 public object Tag {
get;
set; }
89 bool _isVisible =
true;
90 bool _ignoresLighting =
false;
98 foreach ( var obj
in objects )
100 obj.IsVisible = value;
112 get {
return _ignoresLighting; }
115 objects.ForEach( o => o.IgnoresLighting = value );
116 _ignoresLighting = value;
135 foreach ( var obj
in objects )
137 obj.Position += delta;
152 throw new NotImplementedException(
"Setting size for a structure is not implemented." );
161 throw new InvalidOperationException(
"Physics structure has no image or animation." );
167 get {
return new Vector( 1, 1 ); }
168 set {
throw new NotImplementedException(); }
173 get {
return false; }
174 set {
throw new NotImplementedException(); }
181 throw new NotImplementedException();
185 foreach ( var obj
in objects )
193 set {
throw new NotImplementedException(); }
200 set {
throw new NotImplementedException(); }
205 #region IPhysicsObject 207 bool _ignoresGravity =
false;
208 bool _ignoresCollisionResponse =
false;
209 bool _ignoresExplosions =
false;
210 bool _ignoresPhysicsLogics =
false;
211 Ignorer _collisionIgnorer = null;
212 int _collisionIgnoreGroup = 0;
213 Coefficients _coeffs =
PhysicsObject.DefaultCoefficients.Duplicate();
214 double _linearDamping = 1;
215 double _angularDamping = 1;
216 double? _setMomentOfInertia = null;
217 double _calcMomentOfInertia = 0;
222 public event CollisionHandler<IPhysicsObject, IPhysicsObject>
Collided;
237 double totalMass = 0;
238 foreach ( var part
in objects )
239 totalMass += part.Mass;
244 double massMultiplier = value / this.
Mass;
245 objects.ForEach( o => o.Mass *= massMultiplier );
253 throw new InvalidOperationException(
"Structure has no body." );
259 get {
return _ignoresGravity; }
262 foreach ( var obj
in objects )
263 obj.IgnoresGravity = value;
265 _ignoresGravity = value;
271 get {
return _ignoresCollisionResponse; }
274 foreach ( var obj
in objects )
275 obj.IgnoresCollisionResponse = value;
277 _ignoresCollisionResponse = value;
283 get {
return _ignoresExplosions; }
286 foreach ( var obj
in objects )
287 obj.IgnoresExplosions = value;
289 _ignoresExplosions = value;
295 get {
return _ignoresPhysicsLogics; }
298 foreach ( var obj
in objects )
299 obj.IgnoresPhysicsLogics = value;
301 _ignoresPhysicsLogics = value;
307 get {
return _collisionIgnorer; }
310 foreach ( var obj
in objects )
311 obj.CollisionIgnorer = value;
313 _collisionIgnorer = value;
319 get {
return _collisionIgnoreGroup; }
322 foreach ( var obj
in objects )
323 obj.CollisionIgnoreGroup = value;
325 _collisionIgnoreGroup = value;
331 get {
return _coeffs.StaticFriction; }
334 foreach ( var obj
in objects )
335 obj.StaticFriction = value;
337 _coeffs.StaticFriction = value;
343 get {
return _coeffs.DynamicFriction; }
346 foreach ( var obj
in objects )
347 obj.KineticFriction = value;
349 _coeffs.DynamicFriction = value;
355 get {
return _coeffs.Restitution; }
358 foreach ( var obj
in objects )
359 obj.Restitution = value;
361 _coeffs.Restitution = value;
367 get {
return _linearDamping; }
370 foreach ( var obj
in objects )
371 obj.LinearDamping = value;
373 _linearDamping = value;
379 get {
return _angularDamping; }
382 foreach ( var obj
in objects )
383 obj.AngularDamping = value;
385 _angularDamping = value;
398 foreach ( var obj
in objects )
399 obj.Velocity = value;
408 return velocities.Average();
412 foreach ( var obj
in objects )
426 foreach ( var obj
in objects )
427 obj.Acceleration = value;
436 return accs.Average();
440 foreach ( var obj
in objects )
449 return _setMomentOfInertia.HasValue ? _setMomentOfInertia.Value : _calcMomentOfInertia;
453 _setMomentOfInertia = value;
471 CalculateMomentOfInertia();
472 _setMomentOfInertia = null;
485 objects =
new List<PhysicsObject>();
486 Joints =
new List<AxleJoint>();
488 AddedToGame += AddJoints;
492 private void AddJoints()
497 private void RemoveJoints()
509 for (
int i = 0; i < objs.Length; i++ )
520 if ( AddedToGame != null )
530 if ( Collided != null )
536 foreach ( var obj
in objects )
550 throw new NotImplementedException(
"Currently only PhysicsObjects can be added to a structure." );
561 PhysicsObject physObj = (PhysicsObject)obj;
576 physObj.
Collided += this.OnCollided;
578 foreach ( var existing
in objects )
580 AddJoint( physObj, existing );
583 objects.Add( physObj );
584 CalculateMomentOfInertia();
598 throw new NotImplementedException(
"Currently only PhysicsObjects can be added to a structure." );
600 PhysicsObject physObj = (PhysicsObject)obj;
602 if ( !objects.Contains( physObj ) )
608 physObj.
Collided -= this.OnCollided;
610 foreach ( var joint
in Joints.FindAll( j => j.Object1 == physObj || j.Object2 == physObj ) )
615 objects.Remove( physObj );
616 CalculateMomentOfInertia();
619 private void CalculateMomentOfInertia()
622 _calcMomentOfInertia = 0;
624 foreach ( var part
in objects )
627 _calcMomentOfInertia += part.Mass * r * r;
633 foreach ( var obj
in objects )
635 if ( obj.IsInside( point ) )
642 #region IPhysicsObject 648 foreach ( var obj
in objects )
650 obj.Hit( velocity * obj.Mass );
658 foreach ( var obj
in objects )
660 obj.Push( acceleration * obj.Mass );
668 foreach ( var obj
in objects )
670 obj.Push( acceleration * obj.Mass, time );
682 foreach ( var obj
in objects )
684 Vector radius = obj.Position - center;
685 double linearAcc = radius.
Magnitude * angularAcc;
686 obj.Push( linearAcc * obj.Mass * radius.
LeftNormal );
692 foreach ( var obj
in objects )
694 obj.Move( movement );
698 public override void MoveTo(
Vector location,
double speed, Action doWhenArrived )
700 centerObject.
MoveTo( location, speed, doWhenArrived );
702 foreach ( var obj
in objects )
705 obj.MoveTo( location + displacement, speed );
711 foreach ( var obj
in objects )
717 foreach ( var obj
in objects )
723 foreach ( var obj
in objects )
724 obj.StopHorizontal();
729 foreach ( var obj
in objects )
735 #region DelayedDestroyable 737 #region DelayedDestroyable 751 if ( Destroying != null )
764 foreach ( var joint
in Joints ) joint.Destroy();
765 foreach ( var obj
in objects ) obj.Destroy();
774 #region Unimplemented Members / IGameObject 778 get {
throw new NotImplementedException(); }
779 set {
throw new NotImplementedException(); }
Action Removed
Tapahtuu, kun olio poistetaan pelistä (tuhotaan tai ei).
static void DoNextUpdate(Action action)
Suorittaa aliohjelman seuraavalla päivityksellä.
bool IgnoresPhysicsLogics
double Magnitude
Vektorin pituus.
PhysicsStructure(params PhysicsObject[] objs)
Luo uuden rakenteen ja varustaa sen fysiikkaolioilla.
void Remove(IGameObject obj)
Poistaa peliolion tuhoamatta sitä.
virtual int CollisionIgnoreGroup
Törmäysryhmä. Oliot jotka ovat samassa törmäysryhmässä menevät toistensa läpi. Jos ryhmä on nolla tai...
bool IsVisible
Piirretäänkö oliota ruudulle.
double Right
Olion oikean reunan x-koordinaatti.
PhysicsStructure()
Luo uuden tyhjän rakenteen.
Suuntakulma (rajoitettu -180 ja 180 asteen välille) asteina ja radiaaneina. Tietoja kulmasta: http://...
double LinearDamping
Olion hidastuminen. Hidastaa olion vauhtia, vaikka se ei osuisi mihinkään. Vähän kuin väliaineen (esi...
Rajapinta luokalle joka sisältää peliolioita.
Yhteinen rajapinta kaikille fysiikkaolioille.
bool IgnoresCollisionResponse
Jättääkö olio törmäyksen huomioimatta. Jos tosi, törmäyksestä tulee tapahtuma, mutta itse törmäystä e...
TimeSpan MaximumLifetime
Olion suurin mahdollinen elinaika. Kun Lifetime on suurempi kuin tämä, olio kuolee.
double Left
Olion vasemman reunan x-koordinaatti.
Vector Velocity
Olion nopeus.
CollisionHandler< IPhysicsObject, IPhysicsObject > Collided
Tapahtuu kun olio törmää toiseen.
static readonly Rectangle Rectangle
Suorakulmio.
bool IgnoresGravity
Jättääkö olio painovoiman huomioimatta.
bool IgnoresLighting
Jättääkö olio kentän valaistuksen huomiotta.
Vector Acceleration
Olion kiihtyvyys.
Peliolio, joka noudattaa fysiikkamoottorin määräämiä fysiikan lakeja. Voidaan kuitenkin myös laittaa ...
double AngularDamping
Olion pyörimisen hidastuminen.
double Bottom
Olion alareunan y-koordinaatti.
void Update(Time time)
Peliolion päivitys. Tätä kutsutaan, kun IsUpdated-ominaisuuden arvoksi on asetettu true ja olio on li...
bool CanRotate
Jos false, olio ei voi pyöriä.
void Move(Vector movement)
virtual Ignorer CollisionIgnorer
Olio, jolla voi välttää oliota osumasta tiettyihin muihin olioihin.
Sisältää tiedon ajasta, joka on kulunut pelin alusta ja viime päivityksestä.
Saranaliitos kahden olion välille.
double Top
Olion yläreunan y-koordinaatti.
override void MoveTo(Vector location, double speed, Action doWhenArrived)
Yrittää siirtyä annettuun paikkaan annetulla nopeudella. Laukaisee annetun aliohjelman, kun paikkaan on päästy.
List< Listener > AssociatedListeners
void ApplyTorque(double torque)
Rakenne, joka pitää fysiikkaoliot kiinteän matkan päässä toisistaan.
void Add(IGameObject o)
Lisää olion peliin. Tavalliset oliot tulevat automaattisesti kerrokselle 0 ja ruutuoliot päällimmäise...
static Vector Average(IEnumerable< Vector > vectors)
Palauttaa kahden tai useamman vektorin keskiarvon.
CollisionHandler< IPhysicsObject, IPhysicsObject > Collided
Tapahtuu kun olio törmää toiseen.
double Restitution
Olion kimmoisuus. Arvo välillä 0.0-1.0. Arvolla 1.0 olio säilyttää kaiken vauhtinsa törmäyksessä...
Peliluokka reaaliaikaisille peleille.
Vector LeftNormal
Vasen normaali.
double AngularVelocity
Olion kulmanopeus.
static readonly Angle Zero
Nollakulma.
double Softness
Liitoksen pehmeys eli kuinka paljon sillä on liikkumavaraa.
void OnAddedToGame()
Kutsutaan kun olio lisätään peliin.
Jypelin sisäiset metodit ja propertyt joihin käyttäjän ei tarvitse päästä käsiksi kuuluvat tähän luokkaan...
BoundingRectangle BoundingRectangle
virtual void ReallyDestroy()
bool IsInside(Vector point)
static double Distance(Vector p1, Vector p2)
Etäisyys kahden pisteen välillä.
double Softness
Olioiden välisten liitosten pehmeys.
Kantaluokka fysiikkapeleille.
double StaticFriction
Lepokitka. Liikkeen alkamista vastustava voima, joka ilmenee kun olio yrittää lähteä liikkeelle toise...
void Push(Vector force, TimeSpan time)
Yhteinen rajapinta kaikille peliolioille.
Sarja kuvia, jotka vaihtuvat halutulla nopeudella. Yksi animaatio koostuu yhdestä tai useammasta kuva...
override Vector Position
Olion paikka koordinaatistossa. Käsittää sekä X- että Y-koordinaatin.
Vector Size
Suorakaiteen koko
bool IsAddedToGame
Onko rakenne lisätty peliin.
bool IgnoresExplosions
Jättääkö olio räjähdyksen paineaallon huomiotta.
double KineticFriction
Liikekitka. Liikettä vastustava voima joka ilmenee kun kaksi oliota liikkuu toisiaan vasten (esim...
IList< PhysicsObject > Objects
Rakenteeseen kuuluvat oliot.
double AngularAcceleration
override Vector Position
Rakenteen paikka pelimaailmassa.
PhysicsStructure ParentStructure
Rakenneolio, johon tämä olio kuuluu.
bool IsDestroying
Onko olio tuhoutumassa.
void Add(IGameObject obj)
Lisää olion rakenteeseen.
bool IgnoresCollisionResponse
Vector AbsolutePosition
Olion absoluuttinen paikka pelimaailmassa. Jos olio ei ole minkään toisen peliolion lapsiolio...
double AngularAcceleration
Olion kulmakiihtyvyys.
Action Destroying
Tapahtuu, kun olion tuhoaminen alkaa.
PhysicsStructure ParentStructure
Rakenneolio, johon tämä olio kuuluu.
virtual void MoveTo(Vector location, double speed)
Yrittää siirtyä annettuun paikkaan annetulla nopeudella. Laukaisee tapahtuman ArrivedAt, kun paikkaan on päästy.
override void Destroy()
Tuhoaa olion.
bool IgnoresPhysicsLogics
Jättääkö olio kaikki fysiikkalogiikat (ks. AddPhysicsLogic) huomiotta. Vaikuttaa esim. painovoimaan, mutta ei törmäyksiin.