7 using System.ComponentModel;
8 using System.Collections.Generic;
19 private class CollisionHelper
22 private struct Appearance
28 private static Dictionary<PhysicsObject, Appearance> originalAppearances =
new Dictionary<PhysicsObject, Appearance>();
32 if (!originalAppearances.ContainsKey(o))
34 Appearance original = originalAppearances[o];
35 o.
Color = original.Color;
37 originalAppearances.Remove(o);
52 if (target != parent && IsPlatform(target))
55 if (! originalAppearances.ContainsKey(target))
65 LastHitObject = target;
70 private enum PlatformCharacterState { Idle, Falling, Jumping }
72 private PlatformCharacterState state = PlatformCharacterState.Idle;
75 private Weapon weapon = null;
76 private CollisionHelper[] collisionHelpers =
new CollisionHelper[3];
78 private Vector? lastPlatformPosition = null;
80 private bool isWalking =
false;
81 private bool _turnsWhenWalking =
true;
83 private double lowTolerance {
get {
return Height * 0.1; } }
84 private double highTolerance {
get {
return Height * 0.2; } }
86 private bool customAnimPlaying =
false;
87 Action customAnimAction;
94 get {
return _facingDirection; }
95 set {
Turn( value ); }
103 get {
return _turnsWhenWalking; }
104 set { _turnsWhenWalking = value; }
116 for (
int i = 0; i < collisionHelpers.Length; i++)
117 collisionHelpers[i].Object.Size =
new Vector(value.X / 3, value.Y);
125 return base.CollisionIgnorer;
129 base.CollisionIgnorer = value;
130 for (
int i = 0; i < collisionHelpers.Length; i++)
131 collisionHelpers[i].Object.CollisionIgnorer = value;
137 get {
return base.CollisionIgnoreGroup; }
140 base.CollisionIgnoreGroup = value;
141 for (
int i = 0; i < collisionHelpers.Length; i++)
142 collisionHelpers[i].Object.CollisionIgnoreGroup = value;
151 get {
return weapon; }
155 if ( weapon == value )
return;
158 if ( weapon != null )
162 if ( !IsWeaponFacingRight() )
266 for (
int i = 0; i < collisionHelpers.Length; i++)
268 collisionHelpers[i] =
new CollisionHelper(
this );
269 collisionHelpers[i].Object =
new PhysicsObject(width / 3, height)
283 collisionHelpers[0].Object.Color =
new Color(150, 150, 0, 100);
284 collisionHelpers[1].Object.Color =
new Color(150, 180, 0, 100);
285 collisionHelpers[2].Object.Color =
new Color(150, 210, 0, 100);
290 Removed += RemoveCollisionHelpers;
295 private void SetIdleAnim()
297 if ( state == PlatformCharacterState.Idle )
301 private void AddCollisionHelpers()
304 if ( physicsGame == null )
throw new InvalidOperationException(
"Cannot have a platform character in non-physics game" );
306 for (
int i = 0; i < collisionHelpers.Length; i++)
308 physicsGame.
Add(collisionHelpers[i].Object);
313 for (
int i = 0; i < collisionHelpers.Length; i++)
315 physicsGame.AddProtectedCollisionHandler<
PhysicsObject, PhysicsObject>( collisionHelpers[i].Object, collisionHelpers[i].SetObjectBeingHit );
319 private void RemoveCollisionHelpers()
322 if (physicsGame == null)
throw new InvalidOperationException(
"Cannot have a platform character in non-physics game");
324 for (
int i = 0; i < collisionHelpers.Length; i++)
326 physicsGame.Remove(collisionHelpers[i].Object);
331 for (
int i = 0; i < collisionHelpers.Length; i++)
333 physicsGame.RemoveProtectedCollisionHandlers(collisionHelpers[i].Object, null, null, null);
339 state = PlatformCharacterState.Idle;
340 customAnimPlaying =
false;
343 private void SetAnimation(
Animation anim,
bool loop =
true )
358 customAnimPlaying =
true;
359 customAnimAction = onPlayed;
361 anim.
Played += AnimationPlayed;
365 private void AnimationPlayed()
368 customAnimPlaying =
false;
370 if ( customAnimAction != null )
383 public void Walk(
double horizontalVelocity)
394 if (
CanMoveOnAir || collisionHelpers.Any(c => IsStandingOn(c.LastHitObject, lowTolerance)))
399 if ( state == PlatformCharacterState.Idle ||
WalkOnAir )
423 _facingDirection = direction;
425 if ( DirectionChanged != null )
431 private bool IsWeaponFacingRight()
444 for (
int i = 0; i < collisionHelpers.Length; i++)
446 if (IsStandingOn(collisionHelpers[i].LastHitObject, highTolerance))
473 double lowestPoint = this.
Bottom;
475 for (
int i = 0; i < this.collisionHelpers.Length; i++)
477 if (collisionHelpers[i].Object.Bottom < lowestPoint) lowestPoint = collisionHelpers[i].Object.Bottom;
480 if (lastPlatform != null
481 && this.
X + speedDirection * (this.
Width / 2) < lastPlatform.
Right 482 &&
this.X + speedDirection * (
this.Width / 2) > lastPlatform.
Left 483 && lowestPoint < lastPlatform.
Top 484 && lowestPoint > lastPlatform.
Bottom)
490 if (platform == null)
return true;
493 if (p == null)
return true;
506 state = PlatformCharacterState.Jumping;
518 state = PlatformCharacterState.Falling;
530 obj.
Hit(
Vector.FromLengthAndAngle( force, throwAngle ) );
533 private double GetPlatformTopY(
GameObject platform )
543 Vector leftTopPoint = leftProj * uTargetX + platform.
Height / 2 * uTargetY;
544 Vector rightTopPoint = rightProj * uTargetX + platform.
Height / 2 * uTargetY;
554 private bool IsStandingOn(
PhysicsObject target,
double yTolerance)
556 if (target == null || target.
IsDestroyed ||
this.IgnoresCollisionWith(target))
return false;
559 double epsilon =
Width / 6;
561 double targetTop = this.GetPlatformTopY( target );
563 && (
this.Bottom - targetTop) < yTolerance
564 && (target.
Left + epsilon) <
this.Right
565 &&
this.Left < (target.
Right - epsilon));
571 if (IsPlatform(target) && IsStandingOn(target, highTolerance) &&
Velocity.
Y <= 0)
576 state = PlatformCharacterState.Idle;
582 for (
int i = 0; i < collisionHelpers.Length; i++)
584 collisionHelpers[i].Object.Destroy();
594 [EditorBrowsable(EditorBrowsableState.Never)]
607 private void Visualize()
610 if ( stateIndicator == null )
617 stateIndicator.Color = GetStateColor( state );
621 private void AdjustPosition()
627 if ( state == PlatformCharacterState.Jumping )
632 if ( platform != null && IsStandingOn(platform, lowTolerance) )
634 this.
Y = GetPlatformTopY( platform ) + this.
Height / 2;
636 if ( lastPlatformPosition.HasValue ) this.
X += platform.
X - lastPlatformPosition.Value.
X;
637 lastPlatformPosition = platform.
Position;
638 lastPlatform = platform;
643 lastPlatformPosition = null;
644 state = PlatformCharacterState.Falling;
649 private Color GetStateColor( PlatformCharacterState state )
653 case PlatformCharacterState.Falling:
return Color.
Red;
654 case PlatformCharacterState.Jumping:
return Color.
Yellow;
663 for (
int i = 0; i < collisionHelpers.Length; i++ )
665 if ( IsStandingOn( collisionHelpers[i].LastHitObject, lowTolerance ) )
667 platform = collisionHelpers[i].LastHitObject;
668 if ( lastPlatform != platform ) lastPlatformPosition = null;
675 private void StopWalking()
682 if ( state == PlatformCharacterState.Idle )
double Interval
Aika sekunneissa, jonka välein TimeOut tapahtuu.
Color Color
Väri, jonka värisenä olio piirretään, jos tekstuuria ei ole määritelty.
double AbsRight
Olion oikean reunan absoluuttinen x-koordinaatti.
Action Removed
Tapahtuu, kun olio poistetaan pelistä (tuhotaan tai ei).
double Magnitude
Vektorin pituus.
static Vector FromAngle(Angle angle)
Luo vektorin kulman perusteella yksikköpituudella.
void Add(Physics2DDotNet.Joints.Joint j)
Lisää liitoksen peliin.
Angle Angle
Kulma radiaaneina.
double X
Olion paikan X-koordinaatti.
void Stop()
Pysäyttää ajastimen ja nollaa sen tilan.
Action Timeout
Tapahtuu väliajoin.
virtual int CollisionIgnoreGroup
Törmäysryhmä. Oliot jotka ovat samassa törmäysryhmässä menevät toistensa läpi. Jos ryhmä on nolla tai...
Action Played
Tapahtuma, joka tapahtuu kun animaatio on suoritettu.
bool IsVisible
Piirretäänkö oliota ruudulle.
override Angle Angle
Olion kulma tai rintamasuunta. Nolla = osoittaa oikealle.
PhysicsObject(double width, double height)
Luo uuden fysiikkaolion.
void StopHorizontal()
Pysäyttää olion liikkeen vaakasuunnassa.
double Right
Olion oikean reunan x-koordinaatti.
static readonly Color Red
Punainen.
GameObject(double width, double height)
Alustaa uuden peliolion.
double Y
Olion paikan Y-koordinaatti.
Suuntakulma (rajoitettu -180 ja 180 asteen välille) asteina ja radiaaneina. Tietoja kulmasta: http://...
double LinearDamping
Olion hidastuminen. Hidastaa olion vauhtia, vaikka se ei osuisi mihinkään. Vähän kuin väliaineen (esi...
bool IgnoresCollisionResponse
Jättääkö olio törmäyksen huomioimatta. Jos tosi, törmäyksestä tulee tapahtuma, mutta itse törmäystä e...
double Left
Olion vasemman reunan x-koordinaatti.
double AbsLeft
Olion vasemman reunan absoluuttinen x-koordinaatti.
static Direction Left
Suunta vasemmalle.
override void Stop()
Pysäyttää olion.
Vector Velocity
Olion nopeus.
GameObject GetObjectAt(Vector position)
Palauttaa peliolion, joka on annetussa paikassa. Jos paikassa ei ole mitään pelioliota, palautetaan null. Jos olioita on useampia, palautetaan päällimmäinen.
bool IgnoresGravity
Jättääkö olio painovoiman huomioimatta.
bool IsDestroyed
Onko olio tuhottu.
static readonly Vector UnitY
Pystysuuntainen yksikkövektori (pituus 1, suunta ylös).
bool CanRotate
Jos false, olio ei voi pyöriä.
void Remove(IGameObject childObject)
Poistaa lapsiolion. Jos haluat tuhota olion, kutsu mielummin olion Destroy-metodia.
Peliolio, joka noudattaa fysiikkamoottorin määräämiä fysiikan lakeja. Voidaan kuitenkin myös laittaa ...
static readonly Color Yellow
Keltainen.
double Bottom
Olion alareunan y-koordinaatti.
double Mass
Olion massa. Mitä suurempi massa, sitä suurempi voima tarvitaan olion liikuttamiseksi.
Sisältää tiedon ajasta, joka on kulunut pelin alusta ja viime päivityksestä.
double Top
Olion yläreunan y-koordinaatti.
void StopVertical()
Pysäyttää olion liikkeen pystysuunnassa.
bool IsUpdated
Tarvitseeko olio päivittämistä. Kun perit oman luokkasi tästä luokasta, aseta tämä arvoon true...
void Add(IGameObject o)
Lisää olion peliin. Tavalliset oliot tulevat automaattisesti kerrokselle 0 ja ruutuoliot päällimmäise...
override Animation Animation
Animaatio. Voi olla null, jolloin piirretään vain väri.
static readonly Angle StraightAngle
Oikokulma (180 astetta).
double ScalarProjection(Vector unitVector)
virtual void Hit(Vector impulse)
Kohdistaa kappaleeseen impulssin. Tällä kappaleen saa nopeasti liikkeeseen.
double Restitution
Olion kimmoisuus. Arvo välillä 0.0-1.0. Arvolla 1.0 olio säilyttää kaiken vauhtinsa törmäyksessä...
Peliluokka reaaliaikaisille peleille.
void Start()
Käynnistää animaation alusta.
static void SingleShot(double seconds, Action onTimeout)
Kutsuu aliohjelmaa onTimeout annetun ajan kuluttua. Ajastin luodaan automaattisesti.
Vector LeftNormal
Vasen normaali.
static readonly Angle Zero
Nollakulma.
int FrameCount
Ruutujen määrä.
double Radians
Palauttaa tai asettaa kulman radiaaneina.
Action AddedToGame
Tapahtuu, kun olio lisätään peliin.
Vector TextureWrapSize
Määrittää kuinka moneen kertaan kuva piirretään. Esimerkiksi (3.0, 2.0) piirtää kuvan 3 kertaa vaakas...
Ajastin, joka voidaan asettaa laukaisemaan tapahtumia tietyin väliajoin.
static Angle Supplement(Angle a)
Laskee suplementtikulman (180 asteen kulman toinen puoli)
Sarja kuvia, jotka vaihtuvat halutulla nopeudella. Yksi animaatio koostuu yhdestä tai useammasta kuva...
override Vector Position
Olion paikka koordinaatistossa. Käsittää sekä X- että Y-koordinaatin.
void RemoveCollisionHandlers(PhysicsObject obj=null, PhysicsObject target=null, object tag=null, Delegate handler=null)
Poistaa kaikki ehdot täyttävät törmäyksenkäsittelijät.
bool IgnoresExplosions
Jättääkö olio räjähdyksen paineaallon huomiotta.
void Add(IGameObject childObject)
Lisää annetun peliolion tämän olion lapseksi. Lapsiolio liikkuu tämän olion mukana, ja sen paikka ja koko ilmaistaan suhteessa tähän olioon.
double KineticFriction
Liikekitka. Liikettä vastustava voima joka ilmenee kun kaksi oliota liikkuu toisiaan vasten (esim...
void Start()
Käynnistää ajastimen.
static Direction Right
Suunta oikealle.
double Width
Olion leveys (X-suunnassa, leveimmässä kohdassa).
Kappaleen kuvion laatu törmäyksentunnistuksessa.
Peli, jossa on fysiikan laskenta mukana. Peliin lisätyt
Pelialueella liikkuva olio. Käytä fysiikkapeleissä PhysicsObject-olioita.
Vector AbsolutePosition
Olion absoluuttinen paikka pelimaailmassa. Jos olio ei ole minkään toisen peliolion lapsiolio...
static readonly Color White
Valkoinen.
double Height
Olion korkeus (Y-suunnassa, korkeimmassa kohdassa).