Jypeli  5
The simple game programming library
WeaponTemplates.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.ComponentModel;
32 using Physics2DDotNet;
33 using Physics2DDotNet.Ignorers;
34 
35 
36 namespace Jypeli.Assets
37 {
41  public class Cannon : Weapon
42  {
46  public Cannon( double width, double height )
47  : base( width, height )
48  {
49  Power.DefaultValue = 15000;
50  TimeBetweenUse = TimeSpan.FromSeconds( 1 );
51 
52  Image = Game.LoadImageFromResources( "Cannon" );
53  AttackSound = Game.LoadSoundEffectFromResources( "CannonFire" );
54  }
55 
56  protected override PhysicsObject CreateProjectile()
57  {
58  return new CannonBall( 5 );
59  }
60  }
61 
65  public class AssaultRifle : Weapon
66  {
70  public AssaultRifle( double width, double height )
71  : base( width, height )
72  {
73  AmmoIgnoresGravity = true;
74  Power.DefaultValue = 200;
75  TimeBetweenUse = TimeSpan.FromSeconds( 0.2 );
76 
77  Image = Game.LoadImageFromResources( "AsRifle" );
78  AttackSound = Game.LoadSoundEffectFromResources( "MGAttack" );
79  }
80 
81  protected override PhysicsObject CreateProjectile()
82  {
83  return new Bullet( 5 );
84  }
85  }
86 
90  public class PlasmaCannon : Weapon
91  {
95  public PlasmaCannon( double width, double height )
96  : base( width, height )
97  {
98  Power.DefaultValue = 6000;
99  AmmoIgnoresGravity = true;
100  AmmoIgnoresExplosions = true;
101  MaxAmmoLifetime = TimeSpan.FromSeconds( 0.7 );
102 
103  Image = Game.LoadImageFromResources( "PlasmaCannon" );
104  AttackSound = Game.LoadSoundEffectFromResources( "PlasmaAttack" );
105  TimeBetweenUse = TimeSpan.FromSeconds( 0.1 );
106  }
107 
108  protected override PhysicsObject CreateProjectile()
109  {
110  return new Projectile( 3, 5, Color.Green );
111  }
112  }
113 
117  public class LaserGun : Weapon
118  {
122  public LaserGun( double width, double height )
123  : base( width, height )
124  {
125  Power.DefaultValue = 500;
126  Ammo.DefaultValue = Int32.MaxValue;
127  AmmoIgnoresGravity = true;
128  AmmoIgnoresExplosions = true;
129  //MaxAmmoLifetime = TimeSpan.FromSeconds( 0.7 );
130 
131  Image = Game.LoadImageFromResources( "PlasmaCannon" );
132  AttackSound = Game.LoadSoundEffectFromResources( "laser" );
133  TimeBetweenUse = TimeSpan.FromSeconds( 0 );
134  }
135 
136  protected override PhysicsObject CreateProjectile()
137  {
138  //return new Projectile( 10, 1, 5, Color.Red );
139  PhysicsObject beam = new PhysicsObject( new RaySegment( Vector.Zero, Vector.UnitX, 10 ) );
140  beam.Color = Color.Red;
141  return beam;
142  }
143  }
144 
148  public class CannonBall : Projectile
149  {
153  public CannonBall( double radius )
154  : base( radius, 20, "CannonBall" )
155  {
156  }
157  }
158 
162  public class Bullet : Projectile
163  {
167  public Bullet( double radius )
168  : base( radius, 0.2, "Bullet" )
169  {
170  }
171  }
172 
176  public class Grenade : Projectile
177  {
181  public Explosion Explosion { get; set; }
182 
186  [Obsolete("Use Explosion.MaxRadius")]
187  public double ExplosionRadius
188  {
189  get { return Explosion.MaxRadius; }
190  set { Explosion.MaxRadius = value; }
191  }
192 
196  [Obsolete( "Use Explosion.Speed" )]
197  public double ExplosionSpeed
198  {
199  get { return Explosion.Speed; }
200  set { Explosion.Speed = value; }
201  }
202 
206  [Obsolete( "Use Explosion.Force" )]
207  public double ExplosionForce
208  {
209  get { return Explosion.Force; }
210  set { Explosion.Force = value; }
211  }
212 
216  public TimeSpan FuseTime { get; set; }
217 
222  public Grenade( double radius )
223  : this( radius, TimeSpan.FromSeconds( 3 ) )
224  {
225  }
226 
232  public Grenade( double radius, TimeSpan fuseTime )
233  : base( radius, 20, "Grenade" )
234  {
235  FuseTime = fuseTime;
236  IsUpdated = true;
237  Explosion = new Assets.Explosion( 150 ) { Speed = 150, Force = 1000 };
238  }
239 
243  public virtual void Explode()
244  {
245  if ( !IsAddedToGame )
246  return;
247 
248  this.Destroy();
249  Explosion.Position = this.Position;
251  }
252 
253  [EditorBrowsable( EditorBrowsableState.Never )]
254  public override void Update( Time time )
255  {
256  if ( ( time.SinceStartOfGame - CreationTime ) > FuseTime && IsAddedToGame )
257  {
258  // Boom!
259  Explode();
260  }
261 
262  base.Update( time );
263  }
264  }
265 
270  public class ClusterGrenade : Grenade
271  {
272  private int clusterlevel = 0;
273 
277  public int NumberOfClusters { get; set; }
278 
282  public Angle ClusterDirection { get; set; }
283 
287  public double ClusterArc { get; set; }
288 
294  public ClusterGrenade( double radius, int cl )
295  : base( radius )
296  {
297  Mass = 20;
298  Body.CollisionIgnorer = new ObjectIgnorer();
299  NumberOfClusters = 3;
300  ClusterDirection = Angle.FromRadians( Math.PI / 2 );
301  ClusterArc = Math.PI;
302  clusterlevel = cl - 1;
303  }
304 
308  public override void Explode()
309  {
310  if ( !IsAddedToGame ) return;
311 
312  Vector posOffset;
313  double direction;
314 
315  base.Explode();
316 
317  for ( int i = 0; i < NumberOfClusters; i++ )
318  {
319  double currentRadius = Width / 2;
320  double r = currentRadius * 0.6;
321  // TODO: The mass could be evenly distributed to the clusters and the main projectile.
322  Grenade g = ( clusterlevel > 0 ) ?
323  new ClusterGrenade( r, clusterlevel - 1 ) : new Grenade( r );
324 
325  direction = ClusterDirection.Radians - ( ( i - NumberOfClusters / 2 ) * ClusterArc / NumberOfClusters );
326  posOffset = Vector.FromLengthAndAngle( 2 + this.Size.Magnitude, Angle.FromRadians( direction ) );
327 
328  g.Position = this.Position + posOffset;
329  g.Mass = this.Mass / NumberOfClusters;
330  g.Image = this.Image;
331  g.Color = this.Color;
332  g.FuseTime = this.FuseTime;
333  g.ExplosionForce = this.ExplosionForce / 2;
334  g.ExplosionRadius = this.ExplosionRadius / 2;
335  g.ExplosionSpeed = this.ExplosionSpeed / 2;
336  g.Body.CollisionIgnorer = this.Body.CollisionIgnorer;
337  Game.Instance.Add( g );
338  }
339  }
340  }
341 }
Color Color
Väri, jonka värisenä olio piirretään, jos tekstuuria ei ole määritelty.
Explosion(Explosion src)
Luo uuden räjähdyksen entisen pohjalta.
Definition: Explosion.cs:110
Rypälepommi. Hajoaa räjähtäessään pienempiin osiin, jotka voivat edelleen räjähtää pienempiin osiin...
override PhysicsObject CreateProjectile()
Luo uuden ammuksen. Ylikirjoitetaan aliluokissa.
static Image LoadImageFromResources(string name)
Definition: Game.cs:1613
static readonly Vector UnitX
Vaakasuuntainen yksikkövektori (pituus 1, suunta oikealle).
Definition: Vector.cs:66
static readonly Color Green
Vihreä.
Definition: Color.cs:644
override PhysicsObject CreateProjectile()
Luo uuden ammuksen. Ylikirjoitetaan aliluokissa.
double ExplosionForce
Räjähdyksen voima.
Yksinkertainen tykki, joka ampuu kuulia tai muuta ammuksia.
static readonly Color Red
Punainen.
Definition: Color.cs:804
Suuntakulma (rajoitettu -180 ja 180 asteen välille) asteina ja radiaaneina. Tietoja kulmasta: http://...
Definition: Angle.cs:40
CannonBall(double radius)
Alustaa uuden tykinkuulan.
TimeSpan SinceStartOfGame
Aika joka on kulunut pelin alusta.
Definition: Time.cs:32
Rynnäkkökivääri.
double ExplosionRadius
Räjähdyksen säde.
override PhysicsObject CreateProjectile()
Luo uuden ammuksen. Ylikirjoitetaan aliluokissa.
Image Image
Olion kuva. Voi olla null, jolloin piirretään vain väri.
Peliolio, joka noudattaa fysiikkamoottorin määräämiä fysiikan lakeja. Voidaan kuitenkin myös laittaa ...
Definition: Coefficients.cs:36
override void Explode()
Räjäyttää kranaatin sirpaleiksi.
static Game Instance
Definition: Game.cs:149
static readonly Vector Zero
Nollavektori.
Definition: Vector.cs:61
double Mass
Olion massa. Mitä suurempi massa, sitä suurempi voima tarvitaan olion liikuttamiseksi.
Definition: Inertia.cs:69
Sisältää tiedon ajasta, joka on kulunut pelin alusta ja viime päivityksestä.
Definition: Time.cs:13
ClusterGrenade(double radius, int cl)
Alustaa uuden rypälepommin.
Kuva.
Definition: Image.cs:24
static SoundEffect LoadSoundEffectFromResources(string name)
Definition: Game.cs:1618
void Add(IGameObject o)
Lisää olion peliin. Tavalliset oliot tulevat automaattisesti kerrokselle 0 ja ruutuoliot päällimmäise...
Definition: Game.cs:691
LaserGun(double width, double height)
Alustaa uuden laser-tykin.
AssaultRifle(double width, double height)
Alustaa uuden rynnäkkökiväärin.
Cannon(double width, double height)
Alustaa uuden tykin.
Grenade(double radius)
Luo uuden kranaatin, joka räjähtää kolmen sekunnin päästä.
Peliluokka reaaliaikaisille peleille.
Definition: DebugScreen.cs:10
static Angle FromRadians(double radian)
Luo kulman annettujen radiaanien mukaan.
Definition: Angle.cs:316
Grenade(double radius, TimeSpan fuseTime)
Luo uuden kranaatin.
double MaxRadius
Suurin säde, johon räjähdys voi kasvaa.
Definition: Explosion.cs:59
double ExplosionSpeed
Räjähdyksen nopeus.
Body Body
Fysiikkamoottorin käyttämä tietorakenne.
Definition: Dimensions.cs:42
double Speed
Räjähdyksen leviämisnopeus (pikseliä sekunnissa)
Definition: Explosion.cs:93
Väri.
Definition: Color.cs:13
PlasmaCannon(double width, double height)
Alustaa uuden plasmakiväärin.
TimeSpan FuseTime
Aika, jonka päästä ammus räjähtää itsestään.
override Vector Position
Olion paikka koordinaatistossa. Käsittää sekä X- että Y-koordinaatin.
Definition: Dimensions.cs:49
virtual void Explode()
Räjäytä kranaatti.
override void Update(Time time)
Peliolion päivitys. Tätä kutsutaan, kun IsUpdated-ominaisuuden arvoksi on asetettu true ja olio on li...
override PhysicsObject CreateProjectile()
Luo uuden ammuksen. Ylikirjoitetaan aliluokissa.
2D-vektori.
Definition: Vector.cs:56
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
virtual Vector Position
Olion paikka. Jos olio on jonkun toisen peliolion lapsi, paikka on suhteessa tämän vanhempaan (Parent...
Bullet(double radius)
Alustaa uuden luodin.