31 using Microsoft.Xna.Framework;
32 using Microsoft.Xna.Framework.Graphics;
35 using Microsoft.Xna.Framework.Audio;
45 private static Image commonImage = null;
49 private bool initialized;
54 public bool UseShockWave {
get;
set; }
59 public double MaxRadius {
get;
set; }
69 public double CurrentRadius
71 get {
return Size.X; }
74 Size =
new Vector( value, value );
84 public Color ShockwaveColor
86 get {
return shockWave.
Color; }
87 set { shockWave.
Color = value; }
93 public double Speed {
get;
set; }
99 public double Force {
get;
set; }
111 : this( src.MaxRadius )
115 this.Speed = src.
Speed;
116 this.Force = src.
Force;
124 : base( 0.1, 0.1,
Shape.Circle )
131 shockWave.
Color =
new Color( 240, 248, 255, 60 );
140 private void PreloadContent()
151 if ( ShockwaveReachesObject != null )
152 ShockwaveReachesObject( obj, swForce );
162 if ( o == null )
throw new NullReferenceException(
"Object must not be null" );
163 if ( handler == null )
throw new NullReferenceException(
"Handler must not be null" );
168 handler( target, shockForce );
179 if (tag == null)
throw new NullReferenceException(
"Tag must not be null");
180 if (handler == null)
throw new NullReferenceException(
"Handler must not be null");
184 if (target.
Tag == tag)
185 handler(target, shockForce);
191 double distanceFromEdge = distance.
Magnitude - CurrentRadius;
192 if ( distanceFromEdge >= 0 )
195 double relDistance = ( CurrentRadius + distanceFromEdge ) / CurrentRadius;
196 double shockQuotient = 1 / Math.Pow( relDistance, 2 );
197 double shockForce = Force * shockQuotient;
199 if ( Math.Abs( shockForce ) >
float.Epsilon )
202 target.
Hit( shockVector );
204 if ( !shockwaveHitObjects.
Contains( target ) )
206 OnShockwaveReachesObject( target, shockVector );
207 shockwaveHitObjects.
Add( target );
222 shockwaveHitObjects.
Clear();
226 if ( CurrentRadius > MaxRadius )
233 CurrentRadius += dt * Speed;
234 shockwaveHitObjects.
Update( time );
240 shockWave.
Size =
new Vector( 2 * CurrentRadius, 2 * CurrentRadius );
245 foreach ( var o
in layer.Objects )
249 PhysicsObject po = (PhysicsObject)o;
258 Vector distance = o.AbsolutePosition - this.AbsolutePosition;
259 applyShockwave( po, distance );
268 private void PlaySound()
276 pan =
AdvanceMath.MathHelper.Clamp( (
float)pan, (
float)-1.0, (
float)1.0 );
277 if ( !
double.IsNaN( pan ) )
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.
static Image LoadImageFromResources(string name)
double Magnitude
Vektorin pituus.
Angle Angle
Kulma radiaaneina.
Color ShockwaveColor
Paineaallon väri. Shockwave.Color = Color.White
Explosion(double radius)
Luo uuden räjähdyksen.
Yhteinen rajapinta kaikille fysiikkaolioille.
void Update(Time time)
Lisää ja poistaa jonossa olevat elementit sekä kutsuu niiden Update-metodia.
Satunnaisgeneraattori. Luo satunnaisia arvoja, mm. lukuja, vektoreita sekä kulmia.
void AddShockwaveHandler(string tag, Action< IPhysicsObject, Vector > handler)
Laukaisee aliohjelman handler, kun tämän räjähdyksen paineaalto osuu olioon o.
Ääniefekti. Yhdestä efektistä voi luoda CreateSound-metodilla monta ääntä (Sound), jotka voivat soida yhtäaikaa. Ääntä ei tarvitse kuitenkaan luoda itse, jos vain kutsuu Play-metodia.
static double NextDouble(double min, double max)
Palauttaa satunnaisen liukuluvun parametrien
override Vector Size
Olion koko pelimaailmassa. Kertoo olion äärirajat, ei muotoa.
Peliolio, joka noudattaa fysiikkamoottorin määräämiä fysiikan lakeja. Voidaan kuitenkin myös laittaa ...
TimeSpan SinceLastUpdate
Aika joka on kulunut viime päivityksestä.
Sisältää tiedon ajasta, joka on kulunut pelin alusta ja viime päivityksestä.
static SoundEffect LoadSoundEffectFromResources(string name)
SynchronousList< Layer > Layers
Kerrokset, joilla pelioliot viihtyvät.
bool UseShockWave
Onko paineaalto käytössä.
static ScreenView Screen
Näytön dimensiot, eli koko ja reunat.
virtual void Hit(Vector impulse)
Kohdistaa kappaleeseen impulssin. Tällä kappaleen saa nopeasti liikkeeseen.
Peliluokka reaaliaikaisille peleille.
void AddShockwaveHandler(IPhysicsObject o, Action< IPhysicsObject, Vector > handler)
Laukaisee aliohjelman handler, kun tämän räjähdyksen paineaalto osuu olioon o.
override void Update(Time time)
Ajetaan kun pelitilannetta päivitetään. Päivityksen voi toteuttaa omassa luokassa toteuttamalla tämän...
static readonly Ellipse Circle
Ympyrä tai ellipsi.
double Speed
Räjähdyksen leviämisnopeus (pikseliä sekunnissa)
bool IgnoresExplosions
Jättääkö olio räjähdyksen paineaallon huomiotta.
Synkroninen lista, eli lista joka päivittyy vasta kun sen Update-metodia kutsutaan. Jos listalle lisätään IUpdatable-rajapinnan toteuttavia olioita, kutsutaan myös niiden Update-metodeja samalla.
Action< IPhysicsObject, Vector > ShockwaveReachesObject
Tapahtuu, kun paineaalto osuu peliolioon.
double Width
Näytön leveys x-suunnassa.
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ä.
Pelialueella liikkuva olio. Käytä fysiikkapeleissä PhysicsObject-olioita.
static void AssertInitialized(Action actionMethod)
Suorittaa aliohjelman kun peli on varmasti alustettu.