source: 2014/24/EemeliK/Zombieland/Jypeli/Joints/AxleJoint.cs @ 5974

Revision 5974, 7.2 KB checked in by empaheik, 4 years ago (diff)
Line 
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
30using System;
31using System.Collections.Generic;
32using System.Linq;
33using System.Text;
34using AdvanceMath;
35
36using XnaJoint = Physics2DDotNet.Joints.Joint;
37using XnaHingeJoint = Physics2DDotNet.Joints.HingeJoint;
38using XnaFixedHinge = Physics2DDotNet.Joints.FixedHingeJoint;
39
40namespace Jypeli
41{
42    /// <summary>
43    /// Saranaliitos kahden olion välille.
44    /// </summary>
45    public class AxleJoint : Destroyable, IDisposable
46    {
47        Vector pivot;
48        Vector initialPosition;
49
50        /// <summary>
51        /// Ensimmäinen olio.
52        /// </summary>
53        public PhysicsObject Object1 { get; private set; }
54
55        /// <summary>
56        /// Toinen olio (null jos ensimmäinen olio on sidottu pisteeseen)
57        /// </summary>
58        public PhysicsObject Object2 { get; private set; }
59
60        /// <summary>
61        /// Pyörimisakselin (tämänhetkiset) koordinaatit.
62        /// </summary>
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
73        /// <summary>
74        /// Liitoksen pehmeys eli kuinka paljon sillä on liikkumavaraa.
75        /// </summary>
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
98        /// <summary>
99        /// Kiinnittää olion akselilla pelikenttään.
100        /// </summary>
101        /// <param name="obj">Olio</param>
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
111        /// <summary>
112        /// Luo uuden akseliliitoksen olion ja pisteen välille.
113        /// </summary>
114        /// <param name="obj">Ensimmäinen olio</param>
115        /// <param name="axlePosition">Liitoksen akselin paikka</param>
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
125        /// <summary>
126        /// Luo uuden akseliliitoksen kahden olion välille.
127        /// </summary>
128        /// <param name="firstObject">Ensimmäinen olio</param>
129        /// <param name="secondObject">Toinen olio</param>
130        /// <param name="axlePosition">Liitoksen akselin paikka</param>
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
141        /// <summary>
142        /// Luo uuden akseliliitoksen kahden olion välille.
143        /// Liitos sijoitetaan toisen olion keskipisteeseen.
144        /// </summary>
145        /// <param name="firstObject">Ensimmäinen olio</param>
146        /// <param name="secondObject">Toinen olio</param>
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
169        /// <summary>
170        /// Onko liitos tuhottu.
171        /// </summary>
172        public bool IsDestroyed
173        {
174            get { return innerJoint.Lifetime.IsExpired; }
175        }
176
177        /// <summary>
178        /// Tapahtuu kun liitos on tuhottu.
179        /// </summary>
180        public event Action Destroyed;
181
182        /// <summary>
183        /// Tuhoaa liitoksen.
184        /// </summary>
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}
Note: See TracBrowser for help on using the repository browser.