Jypeli  5
The simple game programming library
AxleJoint.cs
Siirry tämän tiedoston dokumentaatioon.
1 #region MIT License
2 /*
3  * Copyright (c) 2009 University of Jyväskylä, Department of Mathematical
4  * Information Technology.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  */
24 #endregion
25 
26 /*
27  * Authors: Vesa Lappalainen, Tero Jäntti, Tomi Karppinen.
28  */
29 
30 using System;
31 using System.Collections.Generic;
32 using System.Linq;
33 using System.Text;
34 using AdvanceMath;
35 
36 using XnaJoint = Physics2DDotNet.Joints.Joint;
37 using XnaHingeJoint = Physics2DDotNet.Joints.HingeJoint;
38 using XnaFixedHinge = Physics2DDotNet.Joints.FixedHingeJoint;
39 
40 namespace Jypeli
41 {
45  public class AxleJoint : Destroyable, IDisposable
46  {
47  Vector pivot;
48  Vector initialPosition;
49 
53  public PhysicsObject Object1 { get; private set; }
54 
58  public PhysicsObject Object2 { get; private set; }
59 
63  public Vector AxlePoint
64  {
65  get
66  {
67  return Object2 != null ? pivot + Object2.Position - initialPosition : pivot;
68  }
69  }
70 
71  internal XnaJoint innerJoint;
72 
76  public double Softness
77  {
78  get
79  {
80  if ( innerJoint is XnaHingeJoint )
81  return ( (XnaHingeJoint)innerJoint ).Softness;
82  else if ( innerJoint is XnaFixedHinge )
83  return ( (XnaFixedHinge)innerJoint ).Softness;
84  else
85  throw new ArgumentException( "Invalid type for inner joint: " + innerJoint.GetType() );
86  }
87  set
88  {
89  if ( innerJoint is XnaHingeJoint )
90  ( (XnaHingeJoint)innerJoint ).Softness = value;
91  else if ( innerJoint is XnaFixedHinge )
92  ( (XnaFixedHinge)innerJoint ).Softness = value;
93  else
94  throw new ArgumentException( "Invalid type for inner joint: " + innerJoint.GetType() );
95  }
96  }
97 
102  public AxleJoint( PhysicsObject obj )
103  {
104  Vector2D pos = new Vector2D( obj.AbsolutePosition.X, obj.AbsolutePosition.Y );
105  innerJoint = new XnaFixedHinge( obj.Body, pos, new Physics2DDotNet.Lifespan() );
106  Object1 = obj;
107  Object2 = null;
108  pivot = obj.AbsolutePosition;
109  }
110 
116  public AxleJoint( PhysicsObject obj, Vector axlePosition )
117  {
118  Vector2D pos = new Vector2D( axlePosition.X, axlePosition.Y );
119  innerJoint = new XnaFixedHinge( obj.Body, pos, new Physics2DDotNet.Lifespan() );
120  Object1 = obj;
121  Object2 = null;
122  pivot = axlePosition;
123  }
124 
131  public AxleJoint( PhysicsObject firstObject, PhysicsObject secondObject, Vector axlePosition )
132  {
133  Vector2D pos = new Vector2D( axlePosition.X, axlePosition.Y );
134  innerJoint = new XnaHingeJoint( firstObject.Body, secondObject.Body, pos, new Physics2DDotNet.Lifespan() );
135  Object1 = firstObject;
136  Object2 = secondObject;
137  pivot = axlePosition;
138  initialPosition = secondObject.AbsolutePosition;
139  }
140 
147  public AxleJoint( PhysicsObject firstObject, PhysicsObject secondObject )
148  {
149  Vector2D pos = new Vector2D( secondObject.AbsolutePosition.X, secondObject.AbsolutePosition.Y );
150  innerJoint = new XnaHingeJoint( firstObject.Body, secondObject.Body, pos, new Physics2DDotNet.Lifespan() );
151  Object1 = firstObject;
152  Object2 = secondObject;
153  pivot = secondObject.AbsolutePosition;
154  initialPosition = secondObject.AbsolutePosition;
155  }
156 
157  internal void DelayedAddJoint()
158  {
159  if ( !Object1.IsAddedToGame || ( Object2 != null && !Object2.IsAddedToGame ) )
160  return;
161 
162  ( (PhysicsGameBase)( Game.Instance ) ).Add( innerJoint );
163  Object1.AddedToGame -= this.DelayedAddJoint;
164  if ( Object2 != null ) Object2.AddedToGame -= this.DelayedAddJoint;
165  }
166 
167  #region Destroyable
168 
172  public bool IsDestroyed
173  {
174  get { return innerJoint.Lifetime.IsExpired; }
175  }
176 
180  public event Action Destroyed;
181 
185  public void Destroy()
186  {
187  innerJoint.Lifetime.IsExpired = true;
188  }
189 
190  #endregion
191 
192  #region IDisposable
193 
194  public void Dispose()
195  {
196  Destroy();
197  }
198 
199  #endregion
200  }
201 }
bool IsAddedToGame
Onko olio lisätty peliin.
AxleJoint(PhysicsObject obj, Vector axlePosition)
Luo uuden akseliliitoksen olion ja pisteen välille.
Definition: AxleJoint.cs:116
AxleJoint(PhysicsObject firstObject, PhysicsObject secondObject)
Luo uuden akseliliitoksen kahden olion välille. Liitos sijoitetaan toisen olion keskipisteeseen.
Definition: AxleJoint.cs:147
AxleJoint(PhysicsObject obj)
Kiinnittää olion akselilla pelikenttään.
Definition: AxleJoint.cs:102
Peliolio, joka noudattaa fysiikkamoottorin määräämiä fysiikan lakeja. Voidaan kuitenkin myös laittaa ...
Definition: Coefficients.cs:36
static Game Instance
Definition: Game.cs:149
bool IsDestroyed
Onko liitos tuhottu.
Definition: AxleJoint.cs:173
PhysicsObject Object2
Toinen olio (null jos ensimmäinen olio on sidottu pisteeseen)
Definition: AxleJoint.cs:58
Saranaliitos kahden olion välille.
Definition: AxleJoint.cs:45
double Y
Definition: Vector.cs:275
Peliluokka reaaliaikaisille peleille.
Definition: DebugScreen.cs:10
Action Destroyed
Tapahtuu kun liitos on tuhottu.
Definition: AxleJoint.cs:180
Physics2DDotNet.Joints.HingeJoint XnaHingeJoint
Definition: AxleJoint.cs:37
double Softness
Liitoksen pehmeys eli kuinka paljon sillä on liikkumavaraa.
Definition: AxleJoint.cs:77
PhysicsObject Object1
Ensimmäinen olio.
Definition: AxleJoint.cs:53
double X
Definition: Vector.cs:274
Action AddedToGame
Tapahtuu, kun olio lisätään peliin.
AxleJoint(PhysicsObject firstObject, PhysicsObject secondObject, Vector axlePosition)
Luo uuden akseliliitoksen kahden olion välille.
Definition: AxleJoint.cs:131
Body Body
Fysiikkamoottorin käyttämä tietorakenne.
Definition: Dimensions.cs:42
Kantaluokka fysiikkapeleille.
override Vector Position
Olion paikka koordinaatistossa. Käsittää sekä X- että Y-koordinaatin.
Definition: Dimensions.cs:49
Physics2DDotNet.Joints.FixedHingeJoint XnaFixedHinge
Definition: AxleJoint.cs:38
void Destroy()
Tuhoaa liitoksen.
Definition: AxleJoint.cs:185
2D-vektori.
Definition: Vector.cs:56
Vector AbsolutePosition
Olion absoluuttinen paikka pelimaailmassa. Jos olio ei ole minkään toisen peliolion lapsiolio...
Vector AxlePoint
Pyörimisakselin (tämänhetkiset) koordinaatit.
Definition: AxleJoint.cs:64
Rajapinta olioille, jotka ovat tuhottavissa.
Definition: Destroyable.cs:8