Jypeli  5
The simple game programming library
Movement.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: Tero Jäntti, Tomi Karppinen, Janne Nikkanen.
28  */
29 
30 using System;
31 using Physics2DDotNet.Shapes;
32 using AdvanceMath;
33 using Physics2DDotNet;
34 namespace Jypeli
35 {
36  public partial class PhysicsObject
37  {
38  private double _maxAngularV = double.PositiveInfinity;
39  private double _maxLinearV = double.PositiveInfinity;
40 
44  [Save]
45  public Vector Velocity
46  {
47  get
48  {
49  Vector2D v = Body.State.Velocity.Linear;
50  return new Vector( v.X, v.Y );
51  }
52  set { Body.State.Velocity.Linear = new Vector2D( value.X, value.Y ); }
53  }
54 
58  [Save]
59  public double AngularVelocity
60  {
61  get { return Body.State.Velocity.Angular; }
62  set { Body.State.Velocity.Angular = value; }
63  }
64 
68  [Save]
69  public double MaxVelocity
70  {
71  get { return _maxLinearV; }
72  set { _maxLinearV = value; IsUpdated = true; }
73  }
74 
78  [Save]
79  public double MaxAngularVelocity
80  {
81  get { return _maxAngularV; }
82  set { _maxAngularV = value; IsUpdated = true; }
83  }
84 
88  [Save]
89  public Vector Acceleration
90  {
91  get
92  {
93  Vector2D v = Body.State.Acceleration.Linear;
94  return new Vector( v.X, v.Y );
95  }
96  set { Body.State.Acceleration.Linear = new Vector2D( value.X, value.Y ); }
97  }
98 
102  [Save]
103  public double AngularAcceleration
104  {
105  get { return Body.State.Acceleration.Angular; }
106  set { Body.State.Acceleration.Angular = value; }
107  }
108 
109  [Save]
110  internal Vector ForceAccumulator
111  {
112  get { return new Vector( Body.State.ForceAccumulator.Linear.X, Body.State.ForceAccumulator.Linear.Y ); }
113  set { Body.State.ForceAccumulator.Linear = new Vector2D( value.X, value.Y ); }
114  }
115 
116  [Save]
117  internal double AngularForceAccumulator
118  {
119  get { return Body.State.ForceAccumulator.Angular; }
120  set { Body.State.ForceAccumulator.Angular = value; }
121  }
122 
127  public virtual void Push( Vector force )
128  {
129  Body.ApplyForce( new Vector2D( force.X, force.Y ) );
130  }
131 
137  public virtual void Push( Vector force, TimeSpan time )
138  {
139  IsUpdated = true;
140  Body.ApplyForce( new Vector2D( force.X, force.Y ) );
141  ActiveForces.Add( new Force( force, time ) );
142  }
143 
147  public virtual void Hit( Vector impulse )
148  {
149  Body.ApplyImpulse( new Vector2D( impulse.X, impulse.Y ) );
150  }
151 
156  public virtual void ApplyTorque( double torque )
157  {
158  Body.ApplyTorque( torque );
159  }
160 
164  public override void Stop()
165  {
166  Body.ClearForces();
167  Body.State.Acceleration = ALVector2D.Zero;
168  Body.State.Velocity = ALVector2D.Zero;
169  Body.State.ForceAccumulator = ALVector2D.Zero;
170  base.Stop();
171  }
172 
176  public void StopHorizontal()
177  {
179  }
180 
184  public void StopVertical()
185  {
187  }
188 
193  public void StopAxial( Vector axis )
194  {
195  StopMoveTo();
196 
197  // TODO: Distinguish between horizontal and vertical oscillations
199 
202 
203  Vector oldForce = new Vector( Body.State.ForceAccumulator.Linear.X, Body.State.ForceAccumulator.Linear.Y );
204  Vector newForce = oldForce.Project( axis.LeftNormal );
205  double aForce = Body.State.ForceAccumulator.Angular;
206  Body.State.ForceAccumulator = new ALVector2D( aForce, newForce.X, newForce.Y );
207  }
208 
212  public void StopAngular()
213  {
214  Body.State.Acceleration.Angular = 0;
215  Body.State.Velocity.Angular = 0;
216  Body.State.ForceAccumulator.Angular = 0;
217  }
218 
223  public override void Move( Vector movement )
224  {
225  Vector dv = movement - this.Velocity;
226  Hit( Mass * dv );
227  }
228 
229  protected override void MoveToTarget()
230  {
231  if ( !moveTarget.HasValue )
232  {
233  Stop();
234  moveTimer.Stop();
235  return;
236  }
237 
238  Vector d = moveTarget.Value - AbsolutePosition;
239  double vt = moveSpeed * moveTimer.Interval;
240 
241  if ( d.Magnitude < vt )
242  {
243  Vector targetLoc = moveTarget.Value;
244  Stop();
245  moveTimer.Stop();
246  moveTarget = null;
247 
248  if ( arrivedAction != null )
249  arrivedAction();
250  }
251  else
252  {
253  Vector dv = Vector.FromLengthAndAngle( moveSpeed, d.Angle ) - this.Velocity;
254  Hit( Mass * dv );
255  }
256  }
257 
258  protected virtual void PrepareThrowable( PhysicsObject obj, Angle angle, double force, double distanceDelta, double axialDelta )
259  {
260  double d = ( this.Width + obj.Width ) / 2 + distanceDelta;
261  Angle a = this.AbsoluteAngle + angle;
262  obj.Position = this.AbsolutePosition + a.GetVector() * d + (a + Angle.RightAngle).GetVector() * axialDelta;
263  obj.Hit( Vector.FromLengthAndAngle( force, a ) );
264  }
265 
275  public void Throw( PhysicsObject obj, Angle angle, double force, double distOffset = 0, int layer = 0, double axialOffset = 0 )
276  {
277  PrepareThrowable( obj, angle, force, distOffset, axialOffset );
278  Game.Add( obj, layer );
279  }
280  }
281 }
double Interval
Aika sekunneissa, jonka välein TimeOut tapahtuu.
Definition: Timer.cs:99
void ClearOscillations()
Poistaa kaikki värähtelyt kappaleelta.
Definition: Movement.cs:211
static readonly Vector UnitX
Vaakasuuntainen yksikkövektori (pituus 1, suunta oikealle).
Definition: Vector.cs:66
double Magnitude
Vektorin pituus.
Definition: Vector.cs:281
Angle Angle
Kulma radiaaneina.
Definition: Vector.cs:308
void Stop()
Pysäyttää ajastimen ja nollaa sen tilan.
Definition: Timer.cs:255
virtual void Push(Vector force)
Työntää oliota.
Definition: Movement.cs:127
void StopHorizontal()
Pysäyttää olion liikkeen vaakasuunnassa.
Definition: Movement.cs:176
Suuntakulma (rajoitettu -180 ja 180 asteen välille) asteina ja radiaaneina. Tietoja kulmasta: http://...
Definition: Angle.cs:40
Angle AbsoluteAngle
Olion absoluuttinen kulma pelimaailmassa. Jos olio ei ole minkään toisen peliolion lapsiolio...
Action arrivedAction
Definition: Movement.cs:43
override void Stop()
Pysäyttää olion.
Definition: Movement.cs:164
Vector Velocity
Olion nopeus.
Definition: Movement.cs:46
Vector Acceleration
Olion kiihtyvyys.
Definition: Movement.cs:90
virtual void PrepareThrowable(PhysicsObject obj, Angle angle, double force, double distanceDelta, double axialDelta)
Definition: Movement.cs:258
static readonly Vector UnitY
Pystysuuntainen yksikkövektori (pituus 1, suunta ylös).
Definition: Vector.cs:71
Peliolio, joka noudattaa fysiikkamoottorin määräämiä fysiikan lakeja. Voidaan kuitenkin myös laittaa ...
Definition: Coefficients.cs:36
void Throw(PhysicsObject obj, Angle angle, double force, double distOffset=0, int layer=0, double axialOffset=0)
Heittää kappaleen hahmon rintamasuuntaa kohti.
Definition: Movement.cs:275
double Mass
Olion massa. Mitä suurempi massa, sitä suurempi voima tarvitaan olion liikuttamiseksi.
Definition: Inertia.cs:69
void StopVertical()
Pysäyttää olion liikkeen pystysuunnassa.
Definition: Movement.cs:184
static readonly Angle RightAngle
Suora kulma (90 astetta).
Definition: Angle.cs:50
Vector Project(Vector to)
Definition: Vector.cs:174
bool IsUpdated
Tarvitseeko olio päivittämistä. Kun perit oman luokkasi tästä luokasta, aseta tämä arvoon true...
virtual void Push(Vector force, TimeSpan time)
Työntää oliota tietyn ajan tietyllä voimalla.
Definition: Movement.cs:137
void Add(IGameObject o)
Lisää olion peliin. Tavalliset oliot tulevat automaattisesti kerrokselle 0 ja ruutuoliot päällimmäise...
Definition: Game.cs:691
void StopAngular()
Pysäyttää kaiken pyörimisliikkeen.
Definition: Movement.cs:212
override void MoveToTarget()
Definition: Movement.cs:229
virtual void Hit(Vector impulse)
Kohdistaa kappaleeseen impulssin. Tällä kappaleen saa nopeasti liikkeeseen.
Definition: Movement.cs:147
double Y
Definition: Vector.cs:275
Peliluokka reaaliaikaisille peleille.
Definition: DebugScreen.cs:10
Vector LeftNormal
Vasen normaali.
Definition: Vector.cs:82
double AngularVelocity
Olion kulmanopeus.
Definition: Movement.cs:60
double X
Definition: Vector.cs:274
virtual void ApplyTorque(double torque)
Kohdistaa kappaleeseen vääntövoiman. Voiman suunta riippuu merkistä.
Definition: Movement.cs:156
Body Body
Fysiikkamoottorin käyttämä tietorakenne.
Definition: Dimensions.cs:42
double MaxAngularVelocity
Suurin kulmanopeus, jonka olio voi saavuttaa.
Definition: Movement.cs:80
double Width
Olion leveys (X-suunnassa, leveimmässä kohdassa).
Vector GetVector()
Definition: Angle.cs:447
2D-vektori.
Definition: Vector.cs:56
override void Move(Vector movement)
Siirtää oliota.
Definition: Movement.cs:223
Vector AbsolutePosition
Olion absoluuttinen paikka pelimaailmassa. Jos olio ei ole minkään toisen peliolion lapsiolio...
double AngularAcceleration
Olion kulmakiihtyvyys.
Definition: Movement.cs:104
double MaxVelocity
Suurin nopeus, jonka olio voi saavuttaa.
Definition: Movement.cs:70
void StopAxial(Vector axis)
Pysäyttää liikkeen akselin suunnassa.
Definition: Movement.cs:193
void StopMoveTo()
Pysäyttää MoveTo-aliohjelmalla aloitetun liikkeen.
Definition: Movement.cs:90