Jypeli 10
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
30using System;
31using System.Collections.Generic;
33
34namespace Jypeli.Assets
35{
39 public class Tank : PhysicsObject
40 {
41 private static Image commonImage = null;
42 private static Shape commonShape = null;
43
44 private Cannon cannon;
45 private List<PhysicsObject> wheels = new List<PhysicsObject>();
46 private List<IMotorJoint> joints = new List<IMotorJoint>();
47 //private IntMeter ammo = new IntMeter( 10 );
48 private IntMeter hitPoints = new IntMeter( 10 );
49
53 public override Vector Size
54 {
55 get { return base.Size; }
56 set { throw new NotImplementedException( "The size of the tank can not be changed." ); }
57 }
58
64 {
65 get { return hitPoints; }
66 }
67
71 public IntMeter Ammo { get { return Cannon.Ammo; } }
72
76 public Cannon Cannon { get { return cannon; } }
77
81 public double MotorTorque
82 {
83 get
84 {
85 return joints[0].MaxMotorTorque;
86 }
87 set
88 {
89 joints.ForEach(j => j.MaxMotorTorque = value);
90 }
91 }
92
93
97 public Tank( double width, double height )
98 : base( width, height )
99 {
100 if ( commonImage == null )
102 if ( commonShape == null )
108 LinearDamping = 0.99;
109
110 cannon = new Cannon( Width * 0.75, Height * 0.2 );
111 Cannon.Position = new Vector(0, Height * 0.25);
112 Cannon.TimeBetweenUse = TimeSpan.FromSeconds( 0.5 );
113 Cannon.Ammo.Value = 100;
114 this.Add( Cannon );
115
117 }
118
119 private void AddWheels()
120 {
122 if ( pg == null ) throw new InvalidOperationException( "Cannot have a tank in non-physics game" );
123
124 const int wheelCount = 6;
125
126 double r = this.Width / ( 2 * wheelCount );
127 double left = this.X - this.Width / 2 + r;
128 double[] wheelYPositions = new double[wheelCount];
129 for ( int i = 0; i < wheelYPositions.Length; i++ )
130 wheelYPositions[i] = this.Y - this.Height / 2;
131 wheelYPositions[0] = wheelYPositions[wheelCount - 1] = this.Position.Y - ( this.Height * 3 / 8 );
132
133 for ( int i = 0; i < wheelCount; i++ )
134 {
135 PhysicsObject wheel = new PhysicsObject( 2 * r, 2 * r, Shape.Circle );
136 wheel.Color = Color.Gray;
138 wheels.Add( wheel );
139 pg.Add( wheel );
140 Vector axlePos = new Vector(left + i * (this.Width / wheelCount), wheelYPositions[i]);
141 wheel.Position = axlePos;
142 wheel.Mass = this.Mass / 20;
143 wheel.KineticFriction = 1.0;
144 wheel.AngularDamping = 0.8;
145
146 IMotorJoint joint = (IMotorJoint)pg.Engine.CreateJoint(this, wheel, JointTypes.WheelJoint);
147
148 joint.Softness = Mass;
149 joint.MaxMotorTorque = Mass * 50;
150 joint.MotorEnabled = false;
151 joint.Axis = Vector.UnitY;
152
153 joints.Add(joint);
154 pg.Add(joint);
155 }
156 }
157
159 public override void Destroy()
160 {
161 foreach ( var j in joints )
162 j.Destroy();
163 foreach ( var w in wheels )
164 w.Destroy();
165 Cannon.Destroy();
166 base.Destroy();
167 }
168
169 private void Break()
170 {
171 Explosion rajahdys = new Explosion( 150 );
172 rajahdys.Force = 10;
173 rajahdys.Position = Position;
174 Game.Instance.Add( rajahdys );
175
176 this.Destroy();
177 }
178
184 public void Accelerate(double speed)
185 {
186 double rotSpeed = speed / wheels[0].Width * 2;
187 foreach (var j in joints)
188 {
189 j.MotorEnabled = true;
190 j.MotorSpeed = rotSpeed;
191 }
192 }
193
198 public void Shoot( double power )
199 {
200 Cannon.Power.Value = power;
201 Shoot();
202 }
203
207 public void Shoot()
208 {
209 Cannon.Shoot();
210 }
211
213 public override void Update(Time time)
214 {
215 foreach (var j in joints)
216 {
217 j.MotorEnabled = false;
218 }
219 base.Update(time);
220 }
221 }
222}
Yksinkertainen tykki, joka ampuu kuulia tai muuta ammuksia.
double Force
Voima, jolla räjähdyksen paineaallon uloin reuna heittää olioita räjähdyksestä poispäin....
Definition: Explosion.cs:94
Yksinkertainen tankki eli panssarivaunu.
Definition: Tank.cs:40
IntMeter HitPoints
Tankin osumapisteet. Kun nämä menevät nollaan, tankki hajoaa.
Definition: Tank.cs:64
void AddWheels()
Definition: Tank.cs:119
static Image commonImage
Definition: Tank.cs:41
override void Update(Time time)
Peliolion päivitys. Tätä kutsutaan, kun IsUpdated-ominaisuuden arvoksi on asetettu true ja olio on li...
Definition: Tank.cs:213
List< IMotorJoint > joints
Definition: Tank.cs:46
void Shoot()
Ampuu tankin tykillä, jos ammuksia on vielä jäljellä.
Definition: Tank.cs:207
static Shape commonShape
Definition: Tank.cs:42
Tank(double width, double height)
Alustaa uuden tankin.
Definition: Tank.cs:97
double MotorTorque
Moottorin vääntömomentti
Definition: Tank.cs:82
IntMeter Ammo
Ammusten määrä.
Definition: Tank.cs:71
Cannon Cannon
Tankin piippu.
Definition: Tank.cs:76
void Accelerate(double speed)
Kiihdyttää tankkia annettuun nopeuteen. Kutsu tätä jatkuvasti (Esim. Keyboard.Listen ja ButtonState....
Definition: Tank.cs:184
void Shoot(double power)
Ampuu halutulla voimalla.
Definition: Tank.cs:198
override Vector Size
Tankin koko. Tätä ei voi muuttaa.
Definition: Tank.cs:54
override void Destroy()
Tuhoaa olion.
Definition: Tank.cs:159
IntMeter hitPoints
Definition: Tank.cs:48
Cannon cannon
Definition: Tank.cs:44
void Break()
Definition: Tank.cs:169
List< PhysicsObject > wheels
Definition: Tank.cs:45
DoubleMeter Power
Voima, jolla panos ammutaan. Nollautuu ammuttaessa.
Definition: Weapon.cs:61
PhysicsObject Shoot()
Ampuu aseella, ja palauttaa ammuksen tai null, jos ampuminen ei onnistu (esimerkiksi jos panokset ova...
Definition: Weapon.cs:185
IntMeter Ammo
Panosten määrä.
Definition: Weapon.cs:66
TimeSpan TimeBetweenUse
Kuinka kauan kestää, että asetta voidaan käyttää uudestaan.
Definition: Weapon.cs:107
static Image LoadImageFromResources(string name)
Lataa kuvan Jypelin sisäisistä resursseista.
Definition: Content.cs:91
void Add(Light light)
Lisää valon peliin. Nykyisellään valoja voi olla ainoastaan yksi kappale. Toistaiseksi ei tuettu Wind...
Definition: Effects.cs:27
static Game Instance
Käynnissä olevan pelin pääolio.
Definition: Game.cs:96
override Vector?? Position
Definition: Dimensions.cs:72
override void Destroy()
Tuhoaa olion. Tuhottu olio poistuu pelistä.
Definition: GameObject.cs:55
void Add(IGameObject childObject)
Lisää annetun peliolion tämän olion lapseksi. Lapsiolio liikkuu tämän olion mukana.
Definition: ChildObjects.cs:98
virtual Color Color
Väri, jonka värisenä olio piirretään, jos tekstuuria ei ole määritelty.
Definition: Appearance.cs:65
double X
Olion paikan X-koordinaatti.
double Height
Olion korkeus (Y-suunnassa, korkeimmassa kohdassa).
Action AddedToGame
Tapahtuu, kun olio lisätään peliin.
double Y
Olion paikan Y-koordinaatti.
double Width
Olion leveys (X-suunnassa, leveimmässä kohdassa).
Kuva.
Definition: Image.cs:30
Mittari, joka mittaa int-tyyppisiä arvoja. Sidottavissa näyttöihin, kuten ValueDisplay ja BarGauge...
Definition: IntMeter.cs:11
Action LowerLimit
Tapahtuu, kun mittari saavuttaa pienimmän sallitun arvonsa.
Definition: Meter.cs:197
ValueType Value
Mittarin arvo.
Definition: Meter.cs:129
A collision ignorer that uses reference comparison. All Bodies with the same instance of this ignorer...
Kantaluokka fysiikkapeleille.
void Add(IAxleJoint j)
Lisää liitoksen peliin.
Kappale joka noudattaa fysiikan lakeja, johon voi törmätä. Vaatii että käytössä on fysiikkapeli.
Definition: Collisions.cs:7
double KineticFriction
Liikekitka (hidastaa kun olio on jo liikkeessä). Ks. StaticFriction (lepokitka)
Definition: Collisions.cs:90
override Vector?? Position
Definition: Dimensions.cs:30
double Mass
Olion massa (paino). Mitä enemmän massaa, sitä enemmän voimaa tarvitaan saamaan olio liikkeelle / pys...
Definition: Inertia.cs:14
virtual Ignorer CollisionIgnorer
Olio, jolla voi välttää oliota osumasta tiettyihin muihin olioihin.
Definition: Collisions.cs:14
double LinearDamping
Nopeuskerroin. Pienempi arvo kuin 1 (esim. 0.998) toimii kuten kitka / ilmanvastus.
Definition: Inertia.cs:57
PhysicsObject(double width, double height, Shape shape, double x=0.0, double y=0.0)
Alustaa fysiikkaolion käyttöön.
double AngularDamping
Kulmanopeuskerroin. Pienempi arvo kuin 1 (esim. 0.998) toimii kuten kitka / ilmanvastus.
Definition: Inertia.cs:68
Kuvio.
Definition: Shapes.cs:47
static readonly Ellipse Circle
Ympyrä tai ellipsi.
Definition: Shapes.cs:63
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:119
double Softness
Liitoksen pehmeys eli kuinka paljon sillä on liikkumavaraa.
Definition: IAxleJoint.cs:78
Rajapinta liitoksille jotka pitävät sisällään moottorin. Esimerkiksi Farseerin WheelJoint
Definition: IMotorJoint.cs:14
Vector Axis
Akseli, jonka suhteen liitos joustaa. Vector.One(oletus) sallii liikkumisen x ja y-akselilla....
Definition: IMotorJoint.cs:35
bool MotorEnabled
Onko liitoksen sisältämä moottori päällä.
Definition: IMotorJoint.cs:18
double MaxMotorTorque
Vääntömomentti jolla moottori yrittää pyörittää siihen liitettyä kappaletta.
Definition: IMotorJoint.cs:28
JointTypes
Käytössä olevat liitostyypit
Definition: IAxleJoint.cs:39
Väri.
Definition: Color.cs:13
static readonly Color Gray
Harmaa.
Definition: Color.cs:696
Sisältää tiedon ajasta, joka on kulunut pelin alusta ja viime päivityksestä.
Definition: Time.cs:14
2D-vektori.
Definition: Vector.cs:67
double Y
Vektorin Y-komponentti
Definition: Vector.cs:339
static readonly Vector UnitY
Pystysuuntainen yksikkövektori (pituus 1, suunta ylös).
Definition: Vector.cs:86