Jypeli  5
The simple game programming library
PlatformCharacter.cs
Siirry tämän tiedoston dokumentaatioon.
1 
2 #if DEBUG
3 // #define VISUALIZE
4 #endif
5 
6 using System;
7 using System.ComponentModel;
8 using System.Collections.Generic;
9 using System.Linq;
10 using Jypeli;
11 using Jypeli.Assets;
12 
13 
18 {
19  private class CollisionHelper
20  {
21 #if VISUALIZE
22  private struct Appearance
23  {
24  public Color Color;
25  public Animation Animation;
26  }
27 
28  private static Dictionary<PhysicsObject, Appearance> originalAppearances = new Dictionary<PhysicsObject, Appearance>();
29 
30  private static void ResetAppearance(PhysicsObject o)
31  {
32  if (!originalAppearances.ContainsKey(o))
33  return;
34  Appearance original = originalAppearances[o];
35  o.Color = original.Color;
36  o.Animation = original.Animation;
37  originalAppearances.Remove(o);
38  }
39 #endif
40 
41  private PhysicsObject parent;
42  public PhysicsObject Object;
43  public PhysicsObject LastHitObject;
44 
45  public CollisionHelper( PhysicsObject parent )
46  {
47  this.parent = parent;
48  }
49 
50  public void SetObjectBeingHit(PhysicsObject collisionHelper, PhysicsObject target)
51  {
52  if (target != parent && IsPlatform(target))
53  {
54 #if VISUALIZE
55  if (! originalAppearances.ContainsKey(target))
56  {
57  originalAppearances.Add(target, new Appearance { Animation = target.Animation, Color = target.Color });
58  }
59 
60  target.Color = Color.Red;
61  target.Animation = null;
62  Timer.SingleShot(1.0, delegate() { ResetAppearance(target); });
63 #endif
64 
65  LastHitObject = target;
66  }
67  }
68  }
69 
70  private enum PlatformCharacterState { Idle, Falling, Jumping }
71  private GameObject stateIndicator;
72  private PlatformCharacterState state = PlatformCharacterState.Idle;
73 
74 
75  private Weapon weapon = null;
76  private CollisionHelper[] collisionHelpers = new CollisionHelper[3];
77  private Direction _facingDirection = Direction.Right;
78  private Vector? lastPlatformPosition = null;
79  private PhysicsObject lastPlatform = null;
80  private bool isWalking = false;
81  private bool _turnsWhenWalking = true;
82 
83  private double lowTolerance { get { return Height * 0.1; } }
84  private double highTolerance { get { return Height * 0.2; } }
85 
86  private bool customAnimPlaying = false;
87  Action customAnimAction;
88 
93  {
94  get { return _facingDirection; }
95  set { Turn( value ); }
96  }
97 
101  public bool TurnsWhenWalking
102  {
103  get { return _turnsWhenWalking; }
104  set { _turnsWhenWalking = value; }
105  }
106 
107  public override Vector Size
108  {
109  get
110  {
111  return base.Size;
112  }
113  set
114  {
115  base.Size = value;
116  for (int i = 0; i < collisionHelpers.Length; i++)
117  collisionHelpers[i].Object.Size = new Vector(value.X / 3, value.Y);
118  }
119  }
120 
121  public override Physics2DDotNet.Ignorers.Ignorer CollisionIgnorer
122  {
123  get
124  {
125  return base.CollisionIgnorer;
126  }
127  set
128  {
129  base.CollisionIgnorer = value;
130  for (int i = 0; i < collisionHelpers.Length; i++)
131  collisionHelpers[i].Object.CollisionIgnorer = value;
132  }
133  }
134 
135  public override int CollisionIgnoreGroup
136  {
137  get { return base.CollisionIgnoreGroup; }
138  set
139  {
140  base.CollisionIgnoreGroup = value;
141  for (int i = 0; i < collisionHelpers.Length; i++)
142  collisionHelpers[i].Object.CollisionIgnoreGroup = value;
143  }
144  }
145 
149  public Weapon Weapon
150  {
151  get { return weapon; }
152  set
153  {
154  // First check: same weapon
155  if ( weapon == value ) return;
156 
157  // Remove the previous weapon if any
158  if ( weapon != null )
159  {
160  // Reset the weapon when removing
161 
162  if ( !IsWeaponFacingRight() )
163  {
164  weapon.X *= -1;
165  weapon.TextureWrapSize = new Vector( 1, 1 );
166  }
167 
168  weapon.Angle = Angle.Zero;
169  this.Remove( weapon );
170  }
171 
172  this.weapon = value;
173  if ( value == null )
174  return;
175 
176  this.Add( value );
177 
178  if ( FacingDirection == Direction.Left )
179  {
180  // If facing left, set the weapon to match the direction
181  weapon.X *= -1;
182  weapon.Angle = Angle.StraightAngle;
183  weapon.TextureWrapSize = new Vector( 1, -1 );
184  }
185  }
186  }
187 
191  public bool CanMoveOnAir { get; set; }
192 
196  public bool MaintainMomentum { get; set; }
197 
201  public Animation AnimWalk { get; set; }
202 
206  public Animation AnimJump { get; set; }
207 
211  public Animation AnimFall { get; set; }
212 
216  public bool LoopJumpAnim { get; set; }
217 
221  public bool LoopFallAnim { get; set; }
222 
226  public Animation AnimIdle { get; set; }
227 
231  public bool WalkOnAir { get; set; }
232 
236  public event Action<Direction> DirectionChanged;
237 
243  public PlatformCharacter(double width, double height)
244  : this(width, height, Shape.Rectangle)
245  {
246  }
247 
254  public PlatformCharacter(double width, double height, Shape shape)
255  : base(width, height, shape, CollisionShapeQuality.FromValue(0.7))
256  {
257  KineticFriction = 0.0;
258  Restitution = 0.0;
259  CanRotate = false;
260  CanMoveOnAir = true;
261 
262  // This avoids high speeds, particularly when falling. This then avoids
263  // going through objects.
264  LinearDamping = 0.96;
265 
266  for (int i = 0; i < collisionHelpers.Length; i++)
267  {
268  collisionHelpers[i] = new CollisionHelper( this );
269  collisionHelpers[i].Object = new PhysicsObject(width / 3, height)
270  {
271  IgnoresGravity = true,
273  IgnoresExplosions = true,
274 #if VISUALIZE
275  IsVisible = true,
276 #else
277  IsVisible = false,
278 #endif
279  };
280  }
281 
282 #if VISUALIZE
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);
286 #endif
287 
288  AddedToGame += AddCollisionHelpers;
289  AddedToGame += SetIdleAnim;
290  Removed += RemoveCollisionHelpers;
291 
292  IsUpdated = true;
293  }
294 
295  private void SetIdleAnim()
296  {
297  if ( state == PlatformCharacterState.Idle )
298  SetAnimation( AnimIdle );
299  }
300 
301  private void AddCollisionHelpers()
302  {
303  PhysicsGame physicsGame = Game.Instance as PhysicsGame;
304  if ( physicsGame == null ) throw new InvalidOperationException( "Cannot have a platform character in non-physics game" );
305 
306  for (int i = 0; i < collisionHelpers.Length; i++)
307  {
308  physicsGame.Add(collisionHelpers[i].Object);
309  }
310 
311  physicsGame.AddProtectedCollisionHandler<PhysicsObject, PhysicsObject>(this, OnCollision);
312 
313  for (int i = 0; i < collisionHelpers.Length; i++)
314  {
315  physicsGame.AddProtectedCollisionHandler<PhysicsObject, PhysicsObject>( collisionHelpers[i].Object, collisionHelpers[i].SetObjectBeingHit );
316  }
317  }
318 
319  private void RemoveCollisionHelpers()
320  {
321  PhysicsGame physicsGame = Game.Instance as PhysicsGame;
322  if (physicsGame == null) throw new InvalidOperationException("Cannot have a platform character in non-physics game");
323 
324  for (int i = 0; i < collisionHelpers.Length; i++)
325  {
326  physicsGame.Remove(collisionHelpers[i].Object);
327  }
328 
329  physicsGame.RemoveCollisionHandlers(this, null, null, null);
330 
331  for (int i = 0; i < collisionHelpers.Length; i++)
332  {
333  physicsGame.RemoveProtectedCollisionHandlers(collisionHelpers[i].Object, null, null, null);
334  }
335  }
336 
337  public void Reset()
338  {
339  state = PlatformCharacterState.Idle;
340  customAnimPlaying = false;
341  }
342 
343  private void SetAnimation( Animation anim, bool loop = true )
344  {
345  if ( customAnimPlaying || anim == null || Animation == anim || anim.FrameCount == 0 )
346  return;
347 
348  Animation = anim;
349 
350  if ( loop )
351  Animation.Start();
352  else
353  Animation.Start( 1 );
354  }
355 
356  public void PlayAnimation( Animation anim, Action onPlayed = null )
357  {
358  customAnimPlaying = true;
359  customAnimAction = onPlayed;
360  this.Animation = anim;
361  anim.Played += AnimationPlayed;
362  anim.Start( 1 );
363  }
364 
365  private void AnimationPlayed()
366  {
367  Animation.Played -= AnimationPlayed;
368  customAnimPlaying = false;
369 
370  if ( customAnimAction != null )
371  customAnimAction();
372  }
373 
374  private static bool IsPlatform(PhysicsObject o)
375  {
376  return !o.IgnoresCollisionResponse;
377  }
378 
383  public void Walk(double horizontalVelocity)
384  {
385  // TODO: Don't walk when against a wall. The character doesn't
386  // fall down when walking against the wall (because of the friction,
387  // I guess).
388 
389  if ( horizontalVelocity > 0 && TurnsWhenWalking )
390  Turn( Direction.Right );
391  else if ( horizontalVelocity < 0 && TurnsWhenWalking )
392  Turn( Direction.Left );
393 
394  if (CanMoveOnAir || collisionHelpers.Any(c => IsStandingOn(c.LastHitObject, lowTolerance)))
395  {
396  this.Velocity = new Vector(horizontalVelocity, this.Velocity.Y);
397  }
398 
399  if ( state == PlatformCharacterState.Idle || WalkOnAir )
400  SetAnimation( AnimWalk );
401 
402  isWalking = true;
403  }
404 
409  public void Turn( Direction direction )
410  {
411  if ( direction == FacingDirection || ( direction != Direction.Left && direction != Direction.Right ) )
412  return;
413 
415 
416  if ( Weapon != null )
417  {
418  Weapon.X *= -1;
421  }
422 
423  _facingDirection = direction;
424 
425  if ( DirectionChanged != null )
426  {
427  DirectionChanged( direction );
428  }
429  }
430 
431  private bool IsWeaponFacingRight()
432  {
433  return (-Math.PI / 2) < Weapon.Angle.Radians
434  && Weapon.Angle.Radians < (Math.PI / 2);
435  }
436 
442  public bool Jump(double speed)
443  {
444  for (int i = 0; i < collisionHelpers.Length; i++)
445  {
446  if (IsStandingOn(collisionHelpers[i].LastHitObject, highTolerance))
447  {
448  ForceJump( speed );
449  return true;
450  }
451  }
452  return false;
453  }
454 
459  public bool IsAboutToFall()
460  {
461 
462  /* TODO:
463  * E = elephant, # = platform
464  *
465  * E#
466  * ### <-- E.IsAboutToFall == true, when walking to the right.
467  *
468  * E#
469  * #### <-- seems to work fine
470 */
471 
472  double speedDirection = this.FacingDirection.GetVector().X;
473  double lowestPoint = this.Bottom;
474 
475  for (int i = 0; i < this.collisionHelpers.Length; i++)
476  {
477  if (collisionHelpers[i].Object.Bottom < lowestPoint) lowestPoint = collisionHelpers[i].Object.Bottom;
478  }
479 
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)
485  {
486  return false;
487  }
488 
489  GameObject platform = this.Game.GetObjectAt(new Vector(this.X + speedDirection * (this.Width/ 2), lowestPoint - 1));
490  if (platform == null) return true;
491 
492  PhysicsObject p = platform as PhysicsObject;
493  if (p == null) return true;
494  if (p.IgnoresCollisionResponse) return true;
495  if (p.CollisionIgnoreGroup == this.CollisionIgnoreGroup && p.CollisionIgnoreGroup != 0) return true;
496 
497  return false;
498  }
499 
504  public void ForceJump( double speed )
505  {
506  state = PlatformCharacterState.Jumping;
507  IgnoresGravity = false;
508  Hit( new Vector( 0, speed * Mass ) );
509  SetAnimation( AnimJump, LoopJumpAnim );
510 
511  Timer t = new Timer();
512  t.Interval = 0.01;
513  t.Timeout += delegate
514  {
515  if ( this.Velocity.Y < 0 )
516  {
517  t.Stop();
518  state = PlatformCharacterState.Falling;
519  SetAnimation( AnimFall, LoopFallAnim );
520  }
521  };
522  t.Start();
523  }
524 
525  protected override void PrepareThrowable( PhysicsObject obj, Angle angle, double force, double distanceDelta, double axialDelta )
526  {
527  double d = ( this.Width + obj.Width ) / 2;
528  Angle throwAngle = FacingDirection == Direction.Left ? Angle.StraightAngle - angle : angle;
529  obj.Position = this.AbsolutePosition + this.FacingDirection.GetVector() * d + Vector.UnitY * axialDelta;
530  obj.Hit( Vector.FromLengthAndAngle( force, throwAngle ) );
531  }
532 
533  private double GetPlatformTopY( GameObject platform )
534  {
535  if ( platform.Angle == Angle.Zero )
536  return platform.Top;
537 
538  Vector uTargetX = Vector.FromAngle( platform.Angle );
539  Vector uTargetY = uTargetX.LeftNormal;
540 
541  double leftProj = new Vector( this.AbsLeft - platform.AbsolutePosition.X, this.AbsBottom - platform.AbsolutePosition.Y ).ScalarProjection( uTargetX );
542  double rightProj = new Vector( this.AbsRight - platform.AbsolutePosition.X, this.AbsBottom - platform.AbsolutePosition.Y ).ScalarProjection( uTargetX );
543  Vector leftTopPoint = leftProj * uTargetX + platform.Height / 2 * uTargetY;
544  Vector rightTopPoint = rightProj * uTargetX + platform.Height / 2 * uTargetY;
545 
546  return platform.AbsolutePosition.Y + Math.Max( leftTopPoint.Y, rightTopPoint.Y );
547  }
548 
554  private bool IsStandingOn(PhysicsObject target, double yTolerance)
555  {
556  if (target == null || target.IsDestroyed || this.IgnoresCollisionWith(target)) return false;
557 
558  // This prevents jumping when on the side of the wall, not on top of it.
559  double epsilon = Width / 6;
560 
561  double targetTop = this.GetPlatformTopY( target );
562  return ( target.AbsolutePosition.Y <= this.AbsolutePosition.Y
563  && (this.Bottom - targetTop) < yTolerance
564  && (target.Left + epsilon) < this.Right
565  && this.Left < (target.Right - epsilon));
566  }
567 
568  private void OnCollision(PhysicsObject collisionHelperObject, PhysicsObject target)
569  {
570  // Velocity <= 0 condition is here to allow jumping through a platform without stopping
571  if (IsPlatform(target) && IsStandingOn(target, highTolerance) && Velocity.Y <= 0)
572  {
573  IgnoresGravity = true;
574  StopVertical();
575  SetAnimation( AnimIdle );
576  state = PlatformCharacterState.Idle;
577  }
578  }
579 
580  public override void Destroy()
581  {
582  for (int i = 0; i < collisionHelpers.Length; i++)
583  {
584  collisionHelpers[i].Object.Destroy();
585  }
586  base.Destroy();
587  }
588 
594  [EditorBrowsable(EditorBrowsableState.Never)]
595  public override void Update(Time time)
596  {
597  Visualize();
598  AdjustPosition();
599 
600  if (!isWalking)
601  StopWalking();
602  isWalking = false;
603 
604  base.Update(time);
605  }
606 
607  private void Visualize()
608  {
609 #if VISUALIZE
610  if ( stateIndicator == null )
611  {
612  stateIndicator = new GameObject( this.Width, 10 );
613  Game.Add( stateIndicator );
614  }
615 
616  stateIndicator.AbsolutePosition = this.AbsolutePosition + new Vector( 0, this.Height );
617  stateIndicator.Color = GetStateColor( state );
618 #endif
619  }
620 
621  private void AdjustPosition()
622  {
623  collisionHelpers[0].Object.AbsolutePosition = this.AbsolutePosition - new Vector( -Width / 4, Height * 1 / 8 );
624  collisionHelpers[1].Object.AbsolutePosition = this.AbsolutePosition - new Vector( 0, Height * 1 / 8 );
625  collisionHelpers[2].Object.AbsolutePosition = this.AbsolutePosition - new Vector( Width / 4, Height * 1 / 8 );
626 
627  if ( state == PlatformCharacterState.Jumping )
628  return;
629 
630  PhysicsObject platform = FindPlatform();
631 
632  if ( platform != null && IsStandingOn(platform, lowTolerance) )
633  {
634  this.Y = GetPlatformTopY( platform ) + this.Height / 2;
635 
636  if ( lastPlatformPosition.HasValue ) this.X += platform.X - lastPlatformPosition.Value.X;
637  lastPlatformPosition = platform.Position;
638  lastPlatform = platform;
639  }
640  else
641  {
642  IgnoresGravity = false;
643  lastPlatformPosition = null;
644  state = PlatformCharacterState.Falling;
645  SetAnimation( AnimFall, LoopFallAnim );
646  }
647  }
648 
649  private Color GetStateColor( PlatformCharacterState state )
650  {
651  switch ( state )
652  {
653  case PlatformCharacterState.Falling: return Color.Red;
654  case PlatformCharacterState.Jumping: return Color.Yellow;
655  default: return Color.White;
656  }
657  }
658 
659  private PhysicsObject FindPlatform()
660  {
661  PhysicsObject platform = null;
662 
663  for ( int i = 0; i < collisionHelpers.Length; i++ )
664  {
665  if ( IsStandingOn( collisionHelpers[i].LastHitObject, lowTolerance ) )
666  {
667  platform = collisionHelpers[i].LastHitObject;
668  if ( lastPlatform != platform ) lastPlatformPosition = null;
669  }
670  }
671 
672  return platform;
673  }
674 
675  private void StopWalking()
676  {
677  if ( !MaintainMomentum )
678  {
679  StopHorizontal();
680  }
681 
682  if ( state == PlatformCharacterState.Idle )
683  SetAnimation( AnimIdle );
684  }
685 
690  public override void Move( Vector movement )
691  {
692  Vector dv = movement - this.Velocity;
693  Walk( dv.X );
694  }
695 
696  protected override void MoveToTarget()
697  {
698  if ( !moveTarget.HasValue )
699  {
700  Stop();
701  moveTimer.Stop();
702  return;
703  }
704 
705  Vector d = moveTarget.Value - AbsolutePosition;
706  double vt = moveSpeed * moveTimer.Interval;
707 
708  if ( d.Magnitude < vt )
709  {
710  Vector targetLoc = moveTarget.Value;
711  Stop();
712  moveTimer.Stop();
713  moveTarget = null;
714 
715  if ( arrivedAction != null )
716  arrivedAction();
717  }
718  else
719  {
720  Vector dv = Vector.FromLengthAndAngle( moveSpeed, d.Angle ) - this.Velocity;
721  Walk( dv.X );
722  }
723  }
724 }
double Interval
Aika sekunneissa, jonka välein TimeOut tapahtuu.
Definition: Timer.cs:99
bool LoopFallAnim
Toistetaanko putoamisanimaatiota useammin kuin kerran.
Color Color
Väri, jonka värisenä olio piirretään, jos tekstuuria ei ole määritelty.
Animation AnimWalk
Kävelyanimaatio (oikealle)
double AbsRight
Olion oikean reunan absoluuttinen x-koordinaatti.
Action Removed
Tapahtuu, kun olio poistetaan pelistä (tuhotaan tai ei).
Kuvio.
Definition: Shapes.cs:48
double Magnitude
Vektorin pituus.
Definition: Vector.cs:281
static Vector FromAngle(Angle angle)
Luo vektorin kulman perusteella yksikköpituudella.
Definition: Vector.cs:118
void Add(Physics2DDotNet.Joints.Joint j)
Lisää liitoksen peliin.
Angle Angle
Kulma radiaaneina.
Definition: Vector.cs:308
double X
Olion paikan X-koordinaatti.
override Vector Size
void Stop()
Pysäyttää ajastimen ja nollaa sen tilan.
Definition: Timer.cs:255
Action Timeout
Tapahtuu väliajoin.
Definition: Timer.cs:46
virtual int CollisionIgnoreGroup
Törmäysryhmä. Oliot jotka ovat samassa törmäysryhmässä menevät toistensa läpi. Jos ryhmä on nolla tai...
Definition: Collisions.cs:57
Action Played
Tapahtuma, joka tapahtuu kun animaatio on suoritettu.
Definition: Animation.cs:174
bool IsVisible
Piirretäänkö oliota ruudulle.
Definition: __GameObject.cs:91
override Angle Angle
Olion kulma tai rintamasuunta. Nolla = osoittaa oikealle.
bool TurnsWhenWalking
Kääntyykö hahmo automaattisesti kun se kävelee.
PhysicsObject(double width, double height)
Luo uuden fysiikkaolion.
void StopHorizontal()
Pysäyttää olion liikkeen vaakasuunnassa.
Definition: Movement.cs:176
Animation AnimIdle
Animaatio, jota käytetään kun hahmo on paikallaan (kääntyneenä oikealle)
override void PrepareThrowable(PhysicsObject obj, Angle angle, double force, double distanceDelta, double axialDelta)
double Right
Olion oikean reunan x-koordinaatti.
static readonly Color Red
Punainen.
Definition: Color.cs:804
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://...
Definition: Angle.cs:40
Animation AnimJump
Hyppyanimaatio (oikealle)
double LinearDamping
Olion hidastuminen. Hidastaa olion vauhtia, vaikka se ei osuisi mihinkään. Vähän kuin väliaineen (esi...
Definition: Inertia.cs:196
bool IgnoresCollisionResponse
Jättääkö olio törmäyksen huomioimatta. Jos tosi, törmäyksestä tulee tapahtuma, mutta itse törmäystä e...
Definition: Collisions.cs:72
double Left
Olion vasemman reunan x-koordinaatti.
Action arrivedAction
Definition: Movement.cs:43
double AbsLeft
Olion vasemman reunan absoluuttinen x-koordinaatti.
static Direction Left
Suunta vasemmalle.
Definition: Direction.cs:70
Suorakulmio.
Definition: Shapes.cs:315
override void Stop()
Pysäyttää olion.
Definition: Movement.cs:164
Vector Velocity
Olion nopeus.
Definition: Movement.cs:46
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.
Definition: Game.cs:868
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).
Definition: Vector.cs:71
bool CanMoveOnAir
Jos false, hahmoa ei voi liikuttaa kun se on ilmassa.
bool CanRotate
Jos false, olio ei voi pyöriä.
Definition: Inertia.cs:45
void Remove(IGameObject childObject)
Poistaa lapsiolion. Jos haluat tuhota olion, kutsu mielummin olion Destroy-metodia.
override void Destroy()
Tuhoaa olion.
Peliolio, joka noudattaa fysiikkamoottorin määräämiä fysiikan lakeja. Voidaan kuitenkin myös laittaa ...
Definition: Coefficients.cs:36
static Game Instance
Definition: Game.cs:149
static readonly Color Yellow
Keltainen.
Definition: Color.cs:899
override void Update(Time time)
Ajetaan kun pelitilannetta päivitetään. Päivityksen voi toteuttaa omassa luokassa toteuttamalla tämän...
double Bottom
Olion alareunan y-koordinaatti.
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
double Top
Olion yläreunan y-koordinaatti.
void StopVertical()
Pysäyttää olion liikkeen pystysuunnassa.
Definition: Movement.cs:184
bool IsUpdated
Tarvitseeko olio päivittämistä. Kun perit oman luokkasi tästä luokasta, aseta tämä arvoon true...
PlatformCharacter(double width, double height, Shape shape)
Luo uuden tasohyppelyhahmon. Hahmon leveysHahmon korkeusHahmon muoto
bool WalkOnAir
Toistetaanko kävelyanimaatiota ilmassa liikuttaessa?
void Add(IGameObject o)
Lisää olion peliin. Tavalliset oliot tulevat automaattisesti kerrokselle 0 ja ruutuoliot päällimmäise...
Definition: Game.cs:691
override Animation Animation
Animaatio. Voi olla null, jolloin piirretään vain väri.
static readonly Angle StraightAngle
Oikokulma (180 astetta).
Definition: Angle.cs:55
double ScalarProjection(Vector unitVector)
Definition: Vector.cs:169
Perussuunta tasossa.
Definition: Direction.cs:50
virtual void Hit(Vector impulse)
Kohdistaa kappaleeseen impulssin. Tällä kappaleen saa nopeasti liikkeeseen.
Definition: Movement.cs:147
double Y
Definition: Vector.cs:275
double Restitution
Olion kimmoisuus. Arvo välillä 0.0-1.0. Arvolla 1.0 olio säilyttää kaiken vauhtinsa törmäyksessä...
Definition: Coefficients.cs:66
Peliluokka reaaliaikaisille peleille.
Definition: DebugScreen.cs:10
void Start()
Käynnistää animaation alusta.
Definition: Animation.cs:282
static void SingleShot(double seconds, Action onTimeout)
Kutsuu aliohjelmaa onTimeout annetun ajan kuluttua. Ajastin luodaan automaattisesti.
Definition: Timer.cs:186
Vector LeftNormal
Vasen normaali.
Definition: Vector.cs:82
static readonly Angle Zero
Nollakulma.
Definition: Angle.cs:45
Action< Direction > DirectionChanged
Hahmon suunnan muutos.
bool Jump(double speed)
Hyppää, jos hahmo on staattisen olion päällä.
Direction FacingDirection
Hahmon rintamasuunta (vasen tai oikea).
int FrameCount
Ruutujen määrä.
Definition: Animation.cs:82
Vector GetVector()
Definition: Direction.cs:116
override void Move(Vector movement)
Siirtää oliota.
Animation AnimFall
Putoamisanimaatio (oikealle)
double X
Definition: Vector.cs:274
bool MaintainMomentum
Jos true, hahmon liike jatkuu hidastuen vaikka kävelemisen lopettaa.
double Radians
Palauttaa tai asettaa kulman radiaaneina.
Definition: Angle.cs:86
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.
Definition: Timer.cs:39
Väri.
Definition: Color.cs:13
override int CollisionIgnoreGroup
Tasohyppelypelin hahmo. Voi liikkua ja hyppiä. Lisäksi sillä voi olla ase.
void ForceJump(double speed)
Hyppää vaikka olio ei olisikaan toisen päällä.
static Angle Supplement(Angle a)
Laskee suplementtikulman (180 asteen kulman toinen puoli)
Definition: Angle.cs:366
Sarja kuvia, jotka vaihtuvat halutulla nopeudella. Yksi animaatio koostuu yhdestä tai useammasta kuva...
Definition: Animation.cs:56
override Vector Position
Olion paikka koordinaatistossa. Käsittää sekä X- että Y-koordinaatin.
Definition: Dimensions.cs:49
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.
PlatformCharacter(double width, double height)
Luo uuden tasohyppelyhahmon.
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...
Definition: Coefficients.cs:55
void Start()
Käynnistää ajastimen.
Definition: Timer.cs:220
static Direction Right
Suunta oikealle.
Definition: Direction.cs:75
double Width
Olion leveys (X-suunnassa, leveimmässä kohdassa).
Kappaleen kuvion laatu törmäyksentunnistuksessa.
override void MoveToTarget()
2D-vektori.
Definition: Vector.cs:56
void PlayAnimation(Animation anim, Action onPlayed=null)
bool LoopJumpAnim
Toistetaanko hyppyanimaatiota useammin kuin kerran.
override Physics2DDotNet.Ignorers.Ignorer CollisionIgnorer
Peli, jossa on fysiikan laskenta mukana. Peliin lisätyt
Definition: PhysicsGame.cs:45
Pelialueella liikkuva olio. Käytä fysiikkapeleissä PhysicsObject-olioita.
Definition: __GameObject.cs:54
Vector AbsolutePosition
Olion absoluuttinen paikka pelimaailmassa. Jos olio ei ole minkään toisen peliolion lapsiolio...
static readonly Color White
Valkoinen.
Definition: Color.cs:894
void Walk(double horizontalVelocity)
Liikuttaa hahmoa.
bool IsAboutToFall()
Onko hahmo astumassa tyhjän päälle.
double Height
Olion korkeus (Y-suunnassa, korkeimmassa kohdassa).
void Turn(Direction direction)
Kääntyy.