Jypeli 10
The simple game programming library
Weapon.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
30using System;
31
32namespace Jypeli.Assets
33{
37 public abstract class Weapon : GameObject
38 {
39 private TimeSpan timeOfLastUse;
40
45 public virtual bool IsReady
46 {
47 get
48 {
49 return ( Ammo > 0 ) && ( ( Game.Time.SinceStartOfGame - timeOfLastUse ) > TimeBetweenUse );
50 }
51 }
52
56 public bool CanHitOwner { get; set; }
57
61 public DoubleMeter Power { get; protected set; }
62
66 public IntMeter Ammo { get; protected set; }
67
71 public bool InfiniteAmmo
72 {
73 get { return Ammo.Value == Int32.MaxValue; }
74 set
75 {
76 if ( !value && Ammo.Value == Int32.MaxValue )
77 Ammo.Value = 100;
78 else if ( value )
79 Ammo.Value = Int32.MaxValue;
80 }
81 }
82
86 public bool AmmoIgnoresGravity { get; set; }
87
91 public bool AmmoIgnoresExplosions { get; set; }
92
97 public TimeSpan MaxAmmoLifetime { get; set; }
98
102 public SoundEffect AttackSound { get; set; }
103
107 public TimeSpan TimeBetweenUse { get; set; }
108
113 public double Volume { get; set; }
114
118 public double FireRate
119 {
120 get { return 1 / TimeBetweenUse.TotalSeconds; }
121 set
122 {
123 if (value < 0) throw new ArgumentException("Fire rate cannot be negative!");
124 if (value == 0) TimeBetweenUse = TimeSpan.MaxValue;
125 else TimeBetweenUse = TimeSpan.FromSeconds( 1 / value );
126 }
127 }
128
134 public event Action<PhysicsObject> Shooting;
135
140 protected void OnShooting( PhysicsObject projectile )
141 {
142 if ( Shooting != null )
143 Shooting( projectile );
144 }
145
150
156 public Weapon( double width, double height )
157 : base( width, height )
158 {
160 Power = new DoubleMeter( 0 );
161 Power.MinValue = 0;
162 Ammo = new IntMeter( Int32.MaxValue, 0, Int32.MaxValue );
163 Ammo.MinValue = 0;
164 MaxAmmoLifetime = TimeSpan.MaxValue;
165 Volume = 0.5;
166 }
167
173 protected abstract PhysicsObject CreateProjectile();
174
186 {
187 if ( IsReady )
188 {
190
191 if (AttackSound != null)
192 AttackSound.Play(Volume, 0, 0);
193
195
201 if ( !InfiniteAmmo ) Ammo.Value--;
202 Power.Reset();
203 OnShooting( p );
204
205 return p;
206 }
207
208 return null;
209 }
210
216 protected void ShootProjectile( PhysicsObject projectile, double power )
217 {
218 if ( !IsAddedToGame )
219 return;
220
221 Vector impulse = Vector.FromLengthAndAngle( power, Angle );
222 Vector direction = Vector.FromLengthAndAngle( 1.0, Angle );
223 Vector position = this.Position;
224
225 if ( Parent != null )
226 {
227 //0.75 * max(width, height) -> projectiles don't hit the PlatformCharacter's collisionHelpers.
228 //Would be better to choose the width or height manually based on the direction.
229 position = this.Position + direction * 0.75 * ( Math.Max(this.Parent.Width, this.Parent.Height) );
230 }
231
232 projectile.Position = position;
233 projectile.Angle = this.Angle;
234
235 if ( Parent is PhysicsObject && !CanHitOwner )
236 {
237 // The projectile can not hit the owner of the weapon.
238 // Owner's CollisionIgnorer can be null if no CollisionIgnorer is set for the owner
239 // Must set CollisionIgnorer separetly for PlatformCharacter because of it's CollisionHelpers
240 PhysicsObject physParent = (PhysicsObject)Parent;
241 if (physParent.CollisionIgnorer == null)
242 {
243 if (physParent is PlatformCharacter)
244 (physParent as PlatformCharacter).CollisionIgnorer = new Jypeli.ObjectIgnorer();
245 else
246 physParent.CollisionIgnorer = new Jypeli.ObjectIgnorer();
247 }
248 projectile.CollisionIgnorer = physParent.CollisionIgnorer;
249 }
250
251 Game.Instance.Add( projectile );
252 projectile.Hit( impulse );
253 }
254
261 {
262 if ( handler == null )
263 return;
264
266 {
268 pg.AddCollisionHandler( projectile, handler );
269 }
270 else
271 throw new InvalidOperationException( "Cannot set a collision handler to non-physics game!" );
272 }
273
275 public override void Update(Time time)
276 {
277 base.Update(time);
278 }
279 }
280}
Kokoelma valmiita törmäyksenkäsittelijöitä.
Action< PhysicsObject > Shooting
Tapahtumankäsittelijä ampumiselle, parametrinä ammus. Voit antaa kaikille aseesta lähteville ammuksil...
Definition: Weapon.cs:134
bool CanHitOwner
Voi ammus osua aseen omistajaan?
Definition: Weapon.cs:56
double FireRate
Tulinopeus (ammusta sekunnissa)
Definition: Weapon.cs:119
abstract PhysicsObject CreateProjectile()
Luo uuden ammuksen. Ylikirjoitetaan aliluokissa.
override void Update(Time time)
Peliolion päivitys. Tätä kutsutaan, kun IsUpdated-ominaisuuden arvoksi on asetettu true ja olio on li...
Definition: Weapon.cs:275
bool AmmoIgnoresExplosions
Jättävätkö panokset räjähdyksen paineaallot huomiotta.
Definition: Weapon.cs:91
DoubleMeter Power
Voima, jolla panos ammutaan. Nollautuu ammuttaessa.
Definition: Weapon.cs:61
virtual bool IsReady
Voiko asetta valmiina käytettäväksi. Ottaa huomioon tulinopeuden, ammukset jne.
Definition: Weapon.cs:46
void ShootProjectile(PhysicsObject projectile, double power)
Ampuu ammuksen annetulla voimalla
Definition: Weapon.cs:216
bool AmmoIgnoresGravity
Jättävätkö panokset painovoiman huomiotta.
Definition: Weapon.cs:86
void OnShooting(PhysicsObject projectile)
Suoritetaan kun ase ampuu
Definition: Weapon.cs:140
bool InfiniteAmmo
Loputtomat ammukset.
Definition: Weapon.cs:72
TimeSpan MaxAmmoLifetime
Ammuksen elinikä. TimeSpan.MaxValue jos ikuinen, TimeSpan.FromSeconds( 5 ) jos 5 sekuntia jne.
Definition: Weapon.cs:97
PhysicsObject Shoot()
Ampuu aseella, ja palauttaa ammuksen tai null, jos ampuminen ei onnistu (esimerkiksi jos panokset ova...
Definition: Weapon.cs:185
Weapon(double width, double height)
Luo uuden aseen.
Definition: Weapon.cs:156
void SetCollisionHandler(PhysicsObject projectile, CollisionHandler< PhysicsObject, PhysicsObject > handler)
Lisää törmäyksenkäsittelijän ammukselle
Definition: Weapon.cs:260
IntMeter Ammo
Panosten määrä.
Definition: Weapon.cs:66
double Volume
Aseen laukauksen voimakkuus väliltä 0-1.0. Oletuksena 0.5.
Definition: Weapon.cs:113
CollisionHandler< PhysicsObject, PhysicsObject > ProjectileCollision
Tapahtumankäsittelijä ammuksen törmäykselle.
Definition: Weapon.cs:149
TimeSpan timeOfLastUse
Definition: Weapon.cs:39
TimeSpan TimeBetweenUse
Kuinka kauan kestää, että asetta voidaan käyttää uudestaan.
Definition: Weapon.cs:107
SoundEffect AttackSound
Hyökkäysääni (pistoolin pamaus jne.)
Definition: Weapon.cs:102
Mittari, joka mittaa double-tyyppisiä arvoja. Sidottavissa näyttöihin, kuten ValueDisplay ja BarGa...
Definition: DoubleMeter.cs:11
static Time Time
Peliaika. Sisältää tiedon siitä, kuinka kauan peliä on pelattu (Time.SinceStartOfGame) ja kuinka kaua...
Definition: Time.cs:25
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
Pelialueella liikkuva olio. Käytä fysiikkapeleissä PhysicsObject-olioita.
Definition: Appearance.cs:34
override Vector?? Position
Definition: Dimensions.cs:72
bool IsAddedToGame
Onko olio lisätty peliin.
override Angle?? Angle
Definition: Dimensions.cs:102
IGameObject Parent
Olio, jonka lapsiolio tämä olio on. Jos null, olio ei ole minkään olion lapsiolio.
TimeSpan MaximumLifetime
Olion suurin mahdollinen elinaika. Kun Lifetime on suurempi kuin tämä, olio kuolee.
Mittari, joka mittaa int-tyyppisiä arvoja. Sidottavissa näyttöihin, kuten ValueDisplay ja BarGauge...
Definition: IntMeter.cs:11
void Reset()
Palauttaa mittarin arvon oletusarvoonsa.
Definition: Meter.cs:273
ValueType Value
Mittarin arvo.
Definition: Meter.cs:129
ValueType MinValue
Mittarin pienin sallittu arvo. Kun mittari saavuttaa tämän arvon, laukeaa tapahtuma LowerLimit.
Definition: Meter.cs:167
A collision ignorer that uses reference comparison. All Bodies with the same instance of this ignorer...
Kantaluokka fysiikkapeleille.
void AddCollisionHandler(IPhysicsObject obj, CollisionHandler< IPhysicsObject, IPhysicsObject > handler)
Määrää, mihin aliohjelmaan siirrytään kun yleinen fysiikkaolio
Kappale joka noudattaa fysiikan lakeja, johon voi törmätä. Vaatii että käytössä on fysiikkapeli.
Definition: Collisions.cs:7
bool IgnoresExplosions
Jättääkö räjähdysten paineaallon huomioimatta
bool IgnoresGravity
Jättääkö painovoiman huomiotta.
override Angle?? Angle
Definition: Dimensions.cs:55
override Vector?? Position
Definition: Dimensions.cs:30
virtual Ignorer CollisionIgnorer
Olio, jolla voi välttää oliota osumasta tiettyihin muihin olioihin.
Definition: Collisions.cs:14
virtual void Hit(Vector impulse)
Kohdistaa kappaleeseen impulssin. Tällä kappaleen saa nopeasti liikkeeseen.
Definition: Movement.cs:90
Kuvio.
Definition: Shapes.cs:47
static readonly Rectangle Rectangle
Suorakulmio.
Definition: Shapes.cs:73
Ääniefekti. Yhdestä efektistä voi luoda CreateSound-metodilla monta ääntä (Sound),...
Definition: SoundEffect.cs:17
bool Play()
Soittaa äänen.
Definition: SoundEffect.cs:131
Tasohyppelypelin hahmo. Voi liikkua ja hyppiä. Lisäksi sillä voi olla ase.
new double Width
Leveys.
Definition: Dimensional.cs:77
Suuntakulma (rajoitettu -180 ja 180 asteen välille) asteina ja radiaaneina. Tietoja kulmasta: http://...
Definition: Angle.cs:40
Sisältää tiedon ajasta, joka on kulunut pelin alusta ja viime päivityksestä.
Definition: Time.cs:14
TimeSpan SinceStartOfGame
Aika joka on kulunut pelin alusta.
Definition: Time.cs:35
2D-vektori.
Definition: Vector.cs:67
static Vector FromLengthAndAngle(double length, double angle)
Luo vektorin pituuden ja kulman perusteella.
Definition: Vector.cs:114