Jypeli 10
The simple game programming library
PhysicsStructure.cs
Siirry tämän tiedoston dokumentaatioon.
1using System;
2using System.Collections.Generic;
3using System.Linq;
4
5namespace Jypeli
6{
10 public class PhysicsStructure : GameObjects.GameObjectBase, IPhysicsObjectInternal, GameObjectContainer
11 {
12 private List<PhysicsObject> objects;
13
17 public bool IsAddedToGame { get; set; }
18
22 public IList<PhysicsObject> Objects
23 {
24 get { return objects; }
25 }
26
30 public int ObjectCount
31 {
32 get { return objects.Count; }
33 }
34
39 {
40 get
41 {
42 if (objects.Count == 0)
43 return new BoundingRectangle();
44
45 double top = objects[0].Top;
46 double left = objects[0].Left;
47 double bottom = objects[0].Bottom;
48 double right = objects[0].Right;
49
50 for (int i = 1; i < objects.Count; i++)
51 {
52 if (objects[i].Top > top) top = objects[i].Top;
53 if (objects[i].Left < left) left = objects[i].Left;
54 if (objects[i].Bottom < bottom) bottom = objects[i].Bottom;
55 if (objects[i].Right > right) right = objects[i].Right;
56 }
57
58 return new BoundingRectangle(new Vector(left, top), new Vector(right, bottom));
59 }
60 }
61
62 #region IGameObject
63
64 //public event Action AddedToGame;
65
66 bool _isVisible = true;
67 bool _ignoresLighting = false;
69
73 public bool IsVisible
74 {
75 get { return _isVisible; }
76 set
77 {
78 foreach (var obj in objects)
79 {
80 obj.IsVisible = value;
81 }
82
83 _isVisible = value;
84 }
85 }
86
90 public bool IgnoresLighting
91 {
92 get { return _ignoresLighting; }
93 set
94 {
95 objects.ForEach(o => o.IgnoresLighting = value);
96 _ignoresLighting = value;
97 }
98 }
99
103 public List<Listener> AssociatedListeners { get; private set; }
104
108 public override Vector Position
109 {
110 get { return centerObject.Position; }
111 set { centerObject.Position = value; }
112 }
113
117 public override Vector Size
118 {
119 get { return BoundingRectangle.Size; }
120 set { throw new NotImplementedException("Setting size for a structure is not implemented."); }
121 }
122
126 public override Animation Animation
127 {
128 get { return null; }
129 set { throw new InvalidOperationException("Physics structure has no image or animation."); }
130 }
131
136 {
137 get { return new Vector(1, 1); }
138 set { throw new NotImplementedException(); }
139 }
140
145 {
146 get { return false; }
147 set { throw new NotImplementedException(); }
148 }
149
152 {
153 get { return Color.Transparent; }
154 set
155 {
156 foreach (var obj in objects)
157 obj.Color = value;
158 }
159 }
160
165 {
166 get { return Shape.Rectangle; }
167 set { throw new NotImplementedException(); }
168 }
169
173 public override Angle Angle
174 {
175 get { return centerObject.Angle; }
176 set { centerObject.Angle = value; }
177 }
178
179 #endregion
180
181 #region IPhysicsObject
182
183 double? _setMomentOfInertia = null;
185
189 public event CollisionHandler<IPhysicsObject, IPhysicsObject> Collided;
190
195 {
196 // No nested physics structures for now
197 get { return null; }
198 }
199
203 public double Mass
204 {
205 get { return objects.Sum(item => item.Mass); }
206 set { objects.ForEach(item => item.Mass = value); }
207 }
208
212 public bool IgnoresGravity
213 {
214 get { return centerObject.IgnoresGravity; }
215 set
216 {
217 objects.ForEach(item => item.IgnoresGravity = value);
219 }
220 }
221
226 {
228 set
229 {
230 objects.ForEach(item => item.IgnoresCollisionResponse = value);
232 }
233 }
234
239 {
240 get { return centerObject.IgnoresExplosions; }
241 set
242 {
243 objects.ForEach(item => item.IgnoresExplosions = value);
245 }
246 }
247
252 {
253 get { return centerObject.IgnoresPhysicsLogics; }
254 set
255 {
256 objects.ForEach(item => item.IgnoresPhysicsLogics = value);
258 }
259 }
260
265 {
266 get { return centerObject.CollisionIgnorer; }
267 set
268 {
269 objects.ForEach(item => item.CollisionIgnorer = value);
271 }
272 }
273
280 {
281 get { return centerObject.CollisionIgnoreGroup; }
282 set
283 {
284 objects.ForEach(item => item.CollisionIgnoreGroup = value);
286 }
287 }
288
292 public double StaticFriction
293 {
294 get { return centerObject.StaticFriction; }
295 set
296 {
297 objects.ForEach(item => item.StaticFriction = value);
299 }
300 }
301
305 public double KineticFriction
306 {
307 get { return centerObject.KineticFriction; }
308 set
309 {
310 objects.ForEach(item => item.KineticFriction = value);
312 }
313 }
314
318 public double Restitution
319 {
320 get { return centerObject.Restitution; }
321 set
322 {
323 objects.ForEach(item => item.Restitution = value);
325 }
326 }
327
332 public double LinearDamping
333 {
334 get { return centerObject.LinearDamping; }
335 set
336 {
337 objects.ForEach(item => item.LinearDamping = value);
339 }
340 }
341
346 public double AngularDamping
347 {
348 get { return centerObject.AngularDamping; }
349 set { centerObject.AngularDamping = value; }
350 }
351
356 {
357 get { return centerObject.Velocity; }
358 set { centerObject.Velocity = value; }
359 }
360
364 public double AngularVelocity
365 {
366 get { return centerObject.AngularVelocity; }
367 set { centerObject.AngularVelocity = value; }
368 }
369
374 {
375 get { return centerObject.Acceleration; }
376 set { centerObject.Acceleration = value; }
377 }
378
383 {
384 get { return centerObject.AngularAcceleration; }
385 set { centerObject.AngularAcceleration = value; }
386 }
387
391 public double MomentOfInertia
392 {
393 get { return _setMomentOfInertia.HasValue ? _setMomentOfInertia.Value : _calcMomentOfInertia; }
394 set { _setMomentOfInertia = value; }
395 }
396
400 public bool CanRotate
401 {
402 get { return centerObject.CanRotate; }
403 set { centerObject.CanRotate = value; }
404 }
405
406 #endregion
407
412 {
413 centerObject = new PhysicsObject(1, 1) { IsVisible = false };
414 objects = new List<PhysicsObject>();
415 AssociatedListeners = new List<Listener>();
417 Removed += () =>
418 {
420 objects.ForEach(o => Game.Instance.Remove(o)); // TODO: Kappaleet menevät nyt poistoon kahdesti, mutta niitä ei oikeasti poisteta ilman tätä.
421 };
422
423 }
424
429 public PhysicsStructure(params PhysicsObject[] objs)
430 : this()
431 {
432 for (int i = 0; i < objs.Length; i++)
433 {
434 Add(objs[i]);
435 }
436 }
437
441 internal void OnCollided(IPhysicsObject part, IPhysicsObject target)
442 {
443 if (Collided != null)
444 Collided(this, target);
445 }
446
452 public IEnumerable<T> GetChildObjects<T>() where T : IGameObject
453 {
454 foreach (IGameObject o in Objects)
455 {
456 if (o is T)
457 yield return (T)o;
458 }
459 }
460
466 public IEnumerable<T> GetChildObjects<T>(Predicate<T> predicate) where T : IGameObject
467 {
468 foreach (IGameObject o in Objects)
469 {
470 if (o is T && predicate((T)o))
471 yield return (T)o;
472 }
473 }
474
476 public override void Update(Time time)
477 {
478 foreach (var obj in objects)
479 {
480 if (obj.IsUpdated)
481 obj.Update(time);
482 }
483 }
484
489 public void Add(IGameObject obj)
490 {
491 if (!(obj is PhysicsObject))
492 throw new NotImplementedException("Currently only PhysicsObjects can be added to a structure.");
493
494 if (!IsAddedToGame)
495 {
496 if (!obj.IsAddedToGame)
497 Game.Instance.Add(obj);
498 }
499
500 PhysicsObject physObj = (PhysicsObject)obj;
501
502 centerObject.Add(physObj);
503 objects.Add(physObj);
504 physObj.ParentStructure = this;
506
507 }
508
513 public void Remove(IGameObject obj)
514 {
515 if (!(obj is PhysicsObject))
516 throw new NotImplementedException("Currently only PhysicsObjects can be added to a structure.");
517
518 PhysicsObject physObj = (PhysicsObject)obj;
519
520 if (!objects.Contains(physObj))
521 return;
522
523 physObj.ParentStructure = null;
524
526
527 objects.Remove(physObj);
528 centerObject.Body.RegenerateConnectedFixtures();
530 }
531
533 {
534 Vector center = this.Position;
535 _calcMomentOfInertia = 0;
536
537 foreach (var part in objects)
538 {
539 double r = Vector.Distance(center, part.Position);
540 _calcMomentOfInertia += part.Mass * r * r;
541 }
542 }
543
549 public bool IsInside(Vector point)
550 {
551 foreach (var obj in objects)
552 {
553 if (obj.IsInside(point))
554 return true;
555 }
556
557 return false;
558 }
559
560 #region IPhysicsObject
561
566 public void Hit(Vector impulse)
567 {
568 centerObject.Hit(impulse);
569 }
570
575 public void Push(Vector force)
576 {
577 centerObject.Push(force);
578 }
579
585 public void Push(Vector force, TimeSpan time)
586 {
587 centerObject.Push(force, time);
588 }
589
594 public void ApplyTorque(double torque)
595 {
597 }
598
603 public void Move(Vector movement)
604 {
605 centerObject.Move(movement);
606 }
607
609 public override void MoveTo(Vector location, double speed, Action doWhenArrived)
610 {
611 centerObject.MoveTo(location, speed, doWhenArrived);
612 }
613
617 public void StopMoveTo()
618 {
620 }
621
625 public void Stop()
626 {
628 }
629
633 public void StopHorizontal()
634 {
636 }
637
641 public void StopVertical()
642 {
644 }
645
650 public void StopAxial(Vector axis)
651 {
653 }
654
658 public void StopAngular()
659 {
661 }
662
663 #endregion
664
665 #region DelayedDestroyable
666
670 public bool IsDestroying { get; private set; }
671
675 public event Action Destroying;
676
680 protected void OnDestroying()
681 {
682 if (Destroying != null)
683 Destroying();
684 }
685
689 public override void Destroy()
690 {
691 IsDestroying = true;
692 OnDestroying();
694 }
695
699 protected virtual void ReallyDestroy()
700 {
701 foreach (var obj in objects) obj.Destroy();
702 this.MaximumLifetime = new TimeSpan(0);
703 base.Destroy();
704 }
705
706 #endregion
707
708 #region Unimplemented Members / IGameObject
709
711 {
712 get { throw new NotImplementedException(); } // TODO: Tämän ehkä voi poistaa, saattaa toimia.
713 set { throw new NotImplementedException(); }
714 }
715
716 #endregion
717 }
718}
Sarja kuvia, jotka vaihtuvat halutulla nopeudella. Yksi animaatio koostuu yhdestä tai useammasta kuva...
Definition: Animation.cs:62
static void DoNextUpdate(Action action)
Suorittaa aliohjelman seuraavalla päivityksellä.
void Add(Light light)
Lisää valon peliin. Nykyisellään valoja voi olla ainoastaan yksi kappale. Toistaiseksi ei tuettu Wind...
Definition: Effects.cs:27
static Game Instance
Käynnissä olevan pelin pääolio.
Definition: Game.cs:96
void Remove(IGameObject o)
Poistaa olion pelistä. Jos haluat tuhota olion, kutsu mielummin olion Destroy-metodia.
Definition: Layers.cs:211
void StopMoveTo()
Pysäyttää MoveTo-aliohjelmalla aloitetun liikkeen.
Definition: Movement.cs:102
override void MoveTo(Vector location, double speed, Action doWhenArrived)
Yrittää siirtyä annettuun paikkaan annetulla nopeudella. Laukaisee annetun aliohjelman,...
Definition: Movement.cs:82
void Add(IGameObject childObject)
Lisää annetun peliolion tämän olion lapseksi. Lapsiolio liikkuu tämän olion mukana.
Definition: ChildObjects.cs:98
double Top
Olion yläreunan y-koordinaatti.
double Bottom
Olion alareunan y-koordinaatti.
Action AddedToGame
Tapahtuu, kun olio lisätään peliin.
double Left
Olion vasemman reunan x-koordinaatti.
TimeSpan MaximumLifetime
Olion suurin mahdollinen elinaika. Kun Lifetime on suurempi kuin tämä, olio kuolee.
double Right
Olion oikean reunan x-koordinaatti.
Action Removed
Tapahtuu, kun olio poistetaan pelistä (tuhotaan tai ei).
Base class for Collision Ignorers to impliment.
Definition: Ignorer.cs:40
Kantaluokka fysiikkapeleille.
static new PhysicsGameBase Instance
Käynnissä olevan fysiikkapelin pääolio.
void Remove(IAxleJoint j)
Poistaa liitoksen pelistä.
Kappale joka noudattaa fysiikan lakeja, johon voi törmätä. Vaatii että käytössä on fysiikkapeli.
Definition: Collisions.cs:7
bool IgnoresExplosions
Jättääkö räjähdysten paineaallon huomioimatta
double AngularVelocity
Kulmanopeus.
Definition: Movement.cs:35
virtual int? CollisionIgnoreGroup
Törmäysryhmä. Oliot jotka ovat samassa törmäysryhmässä menevät toistensa läpi. Jos ryhmä on nolla tai...
Definition: Collisions.cs:29
double KineticFriction
Liikekitka (hidastaa kun olio on jo liikkeessä). Ks. StaticFriction (lepokitka)
Definition: Collisions.cs:90
bool IgnoresGravity
Jättääkö painovoiman huomiotta.
double AngularAcceleration
Kulmakiihtyvyys.
Definition: Movement.cs:45
IPhysicsBody Body
Fysiikkamoottorin käsittelemä fysiikkakappale.
Definition: Dimensions.cs:12
virtual void Push(Vector force)
Työntää oliota.
Definition: Movement.cs:74
override Angle?? Angle
Definition: Dimensions.cs:55
override Vector?? Position
Definition: Dimensions.cs:30
bool CanRotate
Jos false, olio ei voi pyöriä.
Definition: Inertia.cs:43
bool IgnoresPhysicsLogics
Jättääkö fysiikkakentät (esim. painovoiman) huomiotta.
void StopHorizontal()
Pysäyttää olion liikkeen vaakasuunnassa.
Definition: Movement.cs:130
virtual Ignorer CollisionIgnorer
Olio, jolla voi välttää oliota osumasta tiettyihin muihin olioihin.
Definition: Collisions.cs:14
virtual void Hit(Vector impulse)
Kohdistaa kappaleeseen impulssin. Tällä kappaleen saa nopeasti liikkeeseen.
Definition: Movement.cs:90
void StopAxial(Vector axis)
Pysäyttää liikkeen akselin suunnassa.
Definition: Movement.cs:117
void StopVertical()
Pysäyttää olion liikkeen pystysuunnassa.
Definition: Movement.cs:138
Vector Velocity
Nopeus.
Definition: Movement.cs:15
double LinearDamping
Nopeuskerroin. Pienempi arvo kuin 1 (esim. 0.998) toimii kuten kitka / ilmanvastus.
Definition: Inertia.cs:57
double AngularDamping
Kulmanopeuskerroin. Pienempi arvo kuin 1 (esim. 0.998) toimii kuten kitka / ilmanvastus.
Definition: Inertia.cs:68
void StopAngular()
Pysäyttää kaiken pyörimisliikkeen.
Definition: Movement.cs:146
override void Stop()
Pysäyttää olion.
Definition: Movement.cs:107
bool IgnoresCollisionResponse
Jättääkö törmäykset huomiotta.
Definition: Collisions.cs:52
Vector Acceleration
Kiihtyvyys.
Definition: Movement.cs:25
override void Move(Vector movement)
Siirtää oliota.
Definition: Movement.cs:186
virtual void ApplyTorque(double torque)
Kohdistaa kappaleeseen vääntövoiman. Voiman suunta riippuu merkistä.
Definition: Movement.cs:99
PhysicsStructure ParentStructure
Rakenneolio, johon tämä olio kuuluu.
double StaticFriction
Lepokitka (hidastaa liikkeelle lähtiessä). Ks. KineticFriction (liikekitka)
Definition: Collisions.cs:73
double Restitution
Kimmoisuuskerroin (0 = ei kimmoisa, 1 = täysin kimmoisa, yli 1 = saa energiaa tyhjästä)
Definition: Collisions.cs:62
Rakenne, joka pitää fysiikkaoliot kiinteän matkan päässä toisistaan.
Ignorer CollisionIgnorer
Olio, jolla voidaan välttää törmäykset muihin olioihin
override void Destroy()
Tuhoaa olion
double AngularDamping
Kulmanopeuskerroin. Pienempi arvo kuin 1 (esim. 0.998) toimii kuten kitka / ilmanvastus.
Vector Velocity
Keskipisteen nopeus
bool IgnoresGravity
Jätetäänkö painovoima huomioimatta
double? MomentOfInertia
Hitausmomentti
Action Destroying
Tapahtuu, kun olion tuhoaminen alkaa.
void Push(Vector force, TimeSpan time)
Työntää keskipistettä jonkin ajan
void Push(Vector force)
Työntää rakenteen keskipistettä
virtual void ReallyDestroy()
Tuhoaa olion välittömästi, ei kutsu OnDestroying funktiota.
bool IgnoresLighting
Jättääkö olio kentän valaistuksen huomiotta.
bool TextureFillsShape
Ei toteutettu
PhysicsStructure ParentStructure
Rakenneolio, johon tämä olio kuuluu.
int CollisionIgnoreGroup
Törmäysryhmä. Oliot jotka ovat samassa törmäysryhmässä menevät toistensa läpi. Jos ryhmä on nolla tai...
IList< PhysicsObject > Objects
Rakenteeseen kuuluvat oliot.
void Add(IGameObject obj)
Lisää olion rakenteeseen.
bool IgnoresCollisionResponse
Jätetäänkö törmäykset huomioimatta
double LinearDamping
Nopeuskerroin. Pienempi arvo kuin 1 (esim. 0.998) toimii kuten kitka / ilmanvastus.
void StopAngular()
Pysäyttää pyörimisen
bool IgnoresPhysicsLogics
Jättääkö fysiikkalogiikat huomioimatta
int ObjectCount
Rakenteeseen kuuluvien olioiden määrä.
Vector TextureWrapSize
Ei toteutettu
override void MoveTo(Vector location, double speed, Action doWhenArrived)
Yrittää siirtyä annettuun paikkaan annetulla nopeudella. Laukaisee annetun aliohjelman,...
void StopAxial(Vector axis)
Pysäyttää annetun akselin suuntaisen liikkeen
void OnCollided(IPhysicsObject part, IPhysicsObject target)
Kutsutaan kun törmätään.
Vector Acceleration
Keskipisteen kiihtyvyys
void OnDestroying()
Kun oliota käydään tuhoamaan
void ApplyTorque(double torque)
Kohdistaa vääntömomentin
CollisionHandler< IPhysicsObject, IPhysicsObject > Collided
Tapahtuu kun olio törmää toiseen.
void Stop()
Pysäyttää liikkeen
List< Listener > AssociatedListeners
Tähän liittyvät näppäinkuuntelijat
bool IsVisible
Onko olio näkyvissä.
List< PhysicsObject > objects
BoundingRectangle BoundingRectangle
Fysiikkastruktuurin ympäröivä neliö
double AngularAcceleration
Keskipisteen kulmakiihtyvyys
override Vector Size
Ei toteutettu
PhysicsStructure()
Luo uuden tyhjän rakenteen.
void StopHorizontal()
Pysäyttää sivusuuntaisen liikkeen
IEnumerable< T > GetChildObjects< T >()
Palauttaa rakenteeseen kuuluvat oliot.
override void Update(Time time)
Peliolion päivitys. Tätä kutsutaan, kun IsUpdated-ominaisuuden arvoksi on asetettu true ja olio on li...
double StaticFriction
Lepokitka
PhysicsStructure(params PhysicsObject[] objs)
Luo uuden rakenteen ja varustaa sen fysiikkaolioilla.
double KineticFriction
Liikekita
bool IgnoresExplosions
Jätetäänkö räjähdyksien paineaalto huomioimatta
void Remove(IGameObject obj)
Poistaa kappaleen fysiikkastruktuurista
void Move(Vector movement)
Liikuttaa rakennetta
override Vector Position
Rakenteen paikka pelimaailmassa.
bool IsDestroying
Onko olio tuhoutumassa.
bool IsAddedToGame
Onko rakenne lisätty peliin.
void StopVertical()
Pysäyttää pystysuuntaisen liikkeen
bool IsInside(Vector point)
Onko piste fysiikkarakenteen sisällä
void StopMoveTo()
Lopettaa liikkumisen kohdetta kohti
void Hit(Vector impulse)
Kohdistaa rakenteen keskipisteeseen impulssin
bool CanRotate
Jos false, olio ei voi pyöriä.
double Restitution
Kimmoisuuskerroin (0 = ei kimmoisa, 1 = täysin kimmoisa, yli 1 = saa energiaa tyhjästä)
double AngularVelocity
Keskipisteen kulmanopeus
Kuvio.
Definition: Shapes.cs:47
static readonly Rectangle Rectangle
Suorakulmio.
Definition: Shapes.cs:73
Rajapinta luokalle joka sisältää peliolioita.
Yhteinen rajapinta kaikille peliolioille.
Definition: IGameObject.cs:11
Yhteinen rajapinta kaikille fysiikkaolioille.
Jypelin sisäiset metodit ja propertyt joihin käyttäjän ei tarvitse päästä käsiksi kuuluvat tÃ...
Suuntakulma (rajoitettu -180 ja 180 asteen välille) asteina ja radiaaneina. Tietoja kulmasta: http://...
Definition: Angle.cs:40
Vector Size
Suorakaiteen koko
Väri.
Definition: Color.cs:13
Color(XnaColor c)
Definition: Color.cs:38
static readonly Color Transparent
Läpinäkyvä väri.
Definition: Color.cs:931
Sisältää tiedon ajasta, joka on kulunut pelin alusta ja viime päivityksestä.
Definition: Time.cs:14
2D-vektori.
Definition: Vector.cs:67
static double Distance(Vector p1, Vector p2)
Etäisyys kahden pisteen välillä.
Definition: Vector.cs:141