Jypeli  5
The simple game programming library
Tank.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, Janne Nikkanen.
28  */
29 
30 using System;
31 using System.Collections.Generic;
32 using AdvanceMath;
33 using Physics2DDotNet;
34 using Physics2DDotNet.Ignorers;
35 using Physics2DDotNet.Joints;
36 
37 namespace Jypeli.Assets
38 {
42  public class Tank : PhysicsObject
43  {
44  private static Image commonImage = null;
45  private static Shape commonShape = null;
46 
47  private Cannon cannon;
48  private List<PhysicsObject> wheels = new List<PhysicsObject>();
49  private List<AxleJoint> joints = new List<AxleJoint>();
50  //private IntMeter ammo = new IntMeter( 10 );
51  private IntMeter hitPoints = new IntMeter( 10 );
52 
56  public override Vector Size
57  {
58  get { return base.Size; }
59  set { throw new NotImplementedException( "The size of the tank can not be changed." ); }
60  }
61 
66  public IntMeter HitPoints
67  {
68  get { return hitPoints; }
69  }
70 
74  public IntMeter Ammo { get { return Cannon.Ammo; } }
75 
79  public Cannon Cannon { get { return cannon; } }
80 
81 
85  public Tank( double width, double height )
86  : base( width, height )
87  {
88  if ( commonImage == null )
89  commonImage = Game.LoadImageFromResources( "Tank" );
90  if ( commonShape == null )
91  commonShape = Shape.FromImage(commonImage);
92  Image = commonImage;
93  Shape = commonShape;
94  HitPoints.LowerLimit += Break;
95  Body.CollisionIgnorer = new ObjectIgnorer();
96 
97  cannon = new Cannon( Width * 0.75, Height * 0.2 );
98  Cannon.Position = new Vector(0, Height * 0.25);
99  Cannon.TimeBetweenUse = TimeSpan.FromSeconds( 0.5 );
100  Cannon.Ammo.Value = 100;
101  this.Add( Cannon );
102 
103  AddedToGame += AddWheels;
104  }
105 
106  private void AddWheels()
107  {
109  if ( pg == null ) throw new InvalidOperationException( "Cannot have a tank in non-physics game" );
110 
111  const int wheelCount = 6;
112 
113  double r = this.Width / ( 2 * wheelCount );
114  double left = this.X - this.Width / 2 + r;
115  double[] wheelYPositions = new double[wheelCount];
116  for ( int i = 0; i < wheelYPositions.Length; i++ )
117  wheelYPositions[i] = this.Y - this.Height / 2;
118  wheelYPositions[0] = wheelYPositions[wheelCount - 1] = this.Position.Y - ( this.Height * 3 / 8 );
119 
120  for ( int i = 0; i < wheelCount; i++ )
121  {
122  PhysicsObject wheel = new PhysicsObject( 2 * r, 2 * r, Shape.Circle );
123  wheel.Mass = this.Mass / 20;
124  wheel.Color = Color.Gray;
125  wheel.Body.CollisionIgnorer = this.Body.CollisionIgnorer;
126  wheel.Body.AngularDamping = 0.95f;
127  wheel.KineticFriction = 1.0;
128  wheels.Add( wheel );
129  pg.Add( wheel );
130 
131  Vector axlePos = new Vector( left + i * ( this.Width / wheelCount ), wheelYPositions[i] );
132  wheel.Position = axlePos;
133  AxleJoint joint = new AxleJoint( this, wheel, new Vector( axlePos.X, axlePos.Y ) );
134  joint.Softness = 0.01f;
135  joints.Add( joint );
136  pg.Add( joint );
137  }
138  }
139 
140  public override void Destroy()
141  {
142  foreach ( var j in joints )
143  j.Destroy();
144  foreach ( var w in wheels )
145  w.Destroy();
146  Cannon.Destroy();
147  base.Destroy();
148  }
149 
150  private void Break()
151  {
152  Explosion rajahdys = new Explosion( 150 );
153  rajahdys.Force = 10;
154  rajahdys.Position = Position;
155  Game.Instance.Add( rajahdys );
156 
157  this.Destroy();
158  }
159 
164  public void Accelerate( double power )
165  {
166  double realPower = power;
167  if ( power > 1.0 )
168  realPower = 1.0;
169  else if ( power < -1.0 )
170  realPower = -1.0;
171 
172  double torque = Mass * realPower * 3000;
173 
174  foreach ( var w in wheels )
175  {
176  w.Body.ApplyTorque( (float)(torque / wheels.Count) );
177  }
178  }
179 
184  public void Shoot( double power )
185  {
186  Cannon.Power.Value = power;
187  Shoot();
188  }
189 
193  public void Shoot()
194  {
195  Cannon.Shoot();
196  }
197  }
198 }
DoubleMeter Power
Voima, jolla panos ammutaan. Nollautuu ammuttaessa.
Definition: Weapon.cs:61
Color Color
Väri, jonka värisenä olio piirretään, jos tekstuuria ei ole määritelty.
static Image LoadImageFromResources(string name)
Definition: Game.cs:1613
Kuvio.
Definition: Shapes.cs:48
void Add(Physics2DDotNet.Joints.Joint j)
Lisää liitoksen peliin.
Yksinkertainen tykki, joka ampuu kuulia tai muuta ammuksia.
void Shoot()
Ampuu tankin tykillä, jos ammuksia on vielä jäljellä.
Definition: Tank.cs:193
void Shoot(double power)
Ampuu halutulla voimalla.
Definition: Tank.cs:184
Yksinkertainen tankki eli panssarivaunu.
Definition: Tank.cs:42
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
double Mass
Olion massa. Mitä suurempi massa, sitä suurempi voima tarvitaan olion liikuttamiseksi.
Definition: Inertia.cs:69
Saranaliitos kahden olion välille.
Definition: AxleJoint.cs:45
override void Destroy()
Tuhoaa olion.
Definition: Tank.cs:140
Kuva.
Definition: Image.cs:24
static readonly Color Gray
Harmaa.
Definition: Color.cs:639
void Add(IGameObject o)
Lisää olion peliin. Tavalliset oliot tulevat automaattisesti kerrokselle 0 ja ruutuoliot päällimmäise...
Definition: Game.cs:691
double Y
Definition: Vector.cs:275
Peliluokka reaaliaikaisille peleille.
Definition: DebugScreen.cs:10
double Softness
Liitoksen pehmeys eli kuinka paljon sillä on liikkumavaraa.
Definition: AxleJoint.cs:77
static readonly Ellipse Circle
Ympyrä tai ellipsi.
Definition: Shapes.cs:62
Mittari, joka mittaa int-tyyppisiä arvoja. Sidottavissa näyttöihin, kuten ValueDisplay ja BarGauge...
Definition: Meter.cs:387
double X
Definition: Vector.cs:274
Body Body
Fysiikkamoottorin käyttämä tietorakenne.
Definition: Dimensions.cs:42
Väri.
Definition: Color.cs:13
override void Destroy()
Tuhoaa olion. Tuhottu olio poistuu pelistä.
override Vector Position
Olion paikka koordinaatistossa. Käsittää sekä X- että Y-koordinaatin.
Definition: Dimensions.cs:49
IntMeter Ammo
Panosten määrä.
Definition: Weapon.cs:66
double KineticFriction
Liikekitka. Liikettä vastustava voima joka ilmenee kun kaksi oliota liikkuu toisiaan vasten (esim...
Definition: Coefficients.cs:55
2D-vektori.
Definition: Vector.cs:56
static Shape FromImage(Image image)
Luo kuvion annetusta kuvasta. Kuvassa tulee olla vain yksi yhtenäinen muoto (toisin sanoen kuvio ei v...
Definition: Shapes.cs:118
void Accelerate(double power)
Kiihdyttää tankkia.
Definition: Tank.cs:164
Peli, jossa on fysiikan laskenta mukana. Peliin lisätyt
Definition: PhysicsGame.cs:45
double Force
Voima, jolla räjähdyksen paineaallon uloin reuna heittää olioita räjähdyksestä poispäin. Vihje: voit käyttää myös negatiivisia arvoja, jolloin räjähdys imee olioita sisäänsä.
Definition: Explosion.cs:99
PhysicsObject Shoot()
Ampuu aseella, ja palauttaa ammuksen tai null, jos ampuminen ei onnistu (esimerkiksi jos panokset ova...
Definition: Weapon.cs:174
virtual Vector Position
Olion paikka. Jos olio on jonkun toisen peliolion lapsi, paikka on suhteessa tämän vanhempaan (Parent...
Tank(double width, double height)
Alustaa uuden tankin.
Definition: Tank.cs:85
TimeSpan TimeBetweenUse
Kuinka kauan kestää, että asetta voidaan käyttää uudestaan.
Definition: Weapon.cs:107