Jypeli  5
The simple game programming library
PhysicsObject.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 System.Collections.Generic;
32 using Physics2DDotNet;
33 using Physics2DDotNet.Shapes;
34 
35 namespace Jypeli
36 {
41  public partial class PhysicsObject : GameObject, IPhysicsObjectInternal
42  {
46  internal List<Force> ActiveForces = new List<Force>();
47 
51  public PhysicsStructure ParentStructure { get; internal set; }
52 
56  public bool IgnoresExplosions { get; set; }
57 
61  public bool IgnoresGravity
62  {
63  get { return Body.IgnoresGravity; }
64  set { Body.IgnoresGravity = value; }
65  }
66 
71  public bool IgnoresPhysicsLogics
72  {
73  get { return Body.IgnoresPhysicsLogics; }
74  set { Body.IgnoresPhysicsLogics = value; }
75  }
76 
77  #region Constructors
78 
84  public PhysicsObject( double width, double height )
85  : this( width, height, Shape.Rectangle )
86  {
87  }
88 
95  public PhysicsObject( double width, double height, Shape shape )
96  : this( width, height, shape, CreatePhysicsShape( shape, new Vector( width, height ) ) )
97  {
98  }
99 
105  public PhysicsObject( Image image )
106  : this( image.Width, image.Height, Shape.Rectangle )
107  {
108  this.Image = image;
109  }
110 
111  public PhysicsObject( double width, double height, Shape shape, CollisionShapeParameters shapeParameters )
112  : this( width, height, shape, CreatePhysicsShape( shape, new Vector( width, height ), shapeParameters ) )
113  {
114  }
115 
116  [Obsolete( "Use CollisionShapeParameters or the PhysicsTemplates class." )]
117  internal PhysicsObject( double width, double height, Shape shape, CollisionShapeQuality quality )
118  : this( width, height, shape, CreatePhysicsShape( shape, new Vector( width, height ) ) )
119  {
120  }
121 
122  [Obsolete( "Use constructor with CollisionShapeParameters" )]
123  internal PhysicsObject( double width, double height, Shape shape, double maxDistanceBetweenVertices, double gridSpacing )
124  : this( width, height, shape, new CollisionShapeParameters( maxDistanceBetweenVertices, gridSpacing ) )
125  {
126  }
127 
132  public PhysicsObject( RaySegment raySegment )
133  : this( 1, 1, raySegment )
134  {
135  }
136 
141  internal PhysicsObject( double width, double height, Shape shape, IShape physicsShape )
142  : base( width, height, shape )
143  {
144  Coefficients c = new Coefficients( DefaultCoefficients.Restitution, DefaultCoefficients.StaticFriction, DefaultCoefficients.DynamicFriction );
145  Body = new Body( new PhysicsState( ALVector2D.Zero ), physicsShape, DefaultMass, c, new Lifespan() );
146  Body.Tag = this;
147  Body.Collided += this.OnCollided;
148  }
149 
150  #endregion
151 
152  #region DelayedDestroyable
153 
157  public bool IsDestroying { get; private set; }
158 
162  public event Action Destroying;
163 
164  protected void OnDestroying()
165  {
166  if ( Destroying != null )
167  Destroying();
168  }
169 
170  public override void Destroy()
171  {
172  IsDestroying = true;
173  OnDestroying();
175  }
176 
177  protected virtual void ReallyDestroy()
178  {
179  Body.Lifetime.IsExpired = true;
180  base.Destroy();
181  }
182 
183  #endregion
184 
185  public override void Update( Time time )
186  {
188  Velocity = Vector.FromLengthAndAngle( MaxVelocity, Velocity.Angle );
189  if ( Math.Abs( AngularVelocity ) > MaxAngularVelocity )
191 
192  for ( int i = ActiveForces.Count - 1; i >= 0; i-- )
193  {
194  if ( ActiveForces[i].IsDestroyed() )
195  {
196  ActiveForces.RemoveAt( i );
197  continue;
198  }
199 
200  // Apply the force
201  Push( ActiveForces[i].Value * time.SinceLastUpdate.TotalSeconds );
202  }
203 
204  base.Update( time );
205  }
206  }
207 }
static void DoNextUpdate(Action action)
Suorittaa aliohjelman seuraavalla päivityksellä.
Definition: Game.cs:642
Kuvio.
Definition: Shapes.cs:48
double Magnitude
Vektorin pituus.
Definition: Vector.cs:281
override void Destroy()
Tuhoaa olion. Tuhottu olio poistuu pelistä.
PhysicsObject(double width, double height, Shape shape)
Luo uuden fysiikkaolion.
Angle Angle
Kulma radiaaneina.
Definition: Vector.cs:308
Action Destroying
Tapahtuu, kun olion tuhoaminen alkaa.
virtual void Push(Vector force)
Työntää oliota.
Definition: Movement.cs:127
PhysicsObject(double width, double height)
Luo uuden fysiikkaolion.
Suorakulmio.
Definition: Shapes.cs:315
Vector Velocity
Olion nopeus.
Definition: Movement.cs:46
bool IgnoresGravity
Jättääkö olio painovoiman huomioimatta.
bool IsDestroyed
Onko olio tuhottu.
Törmäyskuvion laatuun vaikuttavat parametrit.
TimeSpan SinceLastUpdate
Aika joka on kulunut viime päivityksestä.
Definition: Time.cs:24
PhysicsObject(Image image)
Luo uuden fysiikkaolion. Kappaleen koko ja ulkonäkö ladataan parametrina annetusta kuvasta...
Sisältää tiedon ajasta, joka on kulunut pelin alusta ja viime päivityksestä.
Definition: Time.cs:13
override void Update(Time time)
Peliolion päivitys. Tätä kutsutaan, kun IsUpdated-ominaisuuden arvoksi on asetettu true ja olio on li...
Kuva.
Definition: Image.cs:24
Rakenne, joka pitää fysiikkaoliot kiinteän matkan päässä toisistaan.
Peliluokka reaaliaikaisille peleille.
Definition: DebugScreen.cs:10
virtual void ReallyDestroy()
double AngularVelocity
Olion kulmanopeus.
Definition: Movement.cs:60
PhysicsObject(double width, double height, Shape shape, CollisionShapeParameters shapeParameters)
PhysicsObject(RaySegment raySegment)
Luo fysiikkaolion, jonka muotona on säde.
Body Body
Fysiikkamoottorin käyttämä tietorakenne.
Definition: Dimensions.cs:42
double MaxAngularVelocity
Suurin kulmanopeus, jonka olio voi saavuttaa.
Definition: Movement.cs:80
bool IgnoresExplosions
Jättääkö olio räjähdyksen paineaallon huomiotta.
double Width
Olion leveys (X-suunnassa, leveimmässä kohdassa).
Kappaleen kuvion laatu törmäyksentunnistuksessa.
PhysicsStructure ParentStructure
Rakenneolio, johon tämä olio kuuluu.
2D-vektori.
Definition: Vector.cs:56
double MaxVelocity
Suurin nopeus, jonka olio voi saavuttaa.
Definition: Movement.cs:70
bool IsDestroying
Onko olio tuhoutumassa.
bool IgnoresPhysicsLogics
Jättääkö olio kaikki fysiikkalogiikat (ks. AddPhysicsLogic) huomiotta. Vaikuttaa esim. painovoimaan, mutta ei törmäyksiin.
double Height
Olion korkeus (Y-suunnassa, korkeimmassa kohdassa).