Jypeli 10
The simple game programming library
PlatformCharacter.cs
Siirry tämän tiedoston dokumentaatioon.
1
2#if DEBUG
3//#define VISUALIZE
4// TODO: Tää voisi olla ihan ajonaikainen asetus.
5#endif
6
7using System;
8using System.Collections.Generic;
9using System.ComponentModel;
10using System.Linq;
11using Jypeli;
12using Jypeli.Assets;
13
14
19{
20 private class CollisionHelper
21 {
22#if VISUALIZE
23 private struct Appearance
24 {
25 public Color Color;
26 public Animation Animation;
27 }
28
29 private static Dictionary<PhysicsObject, Appearance> originalAppearances = new Dictionary<PhysicsObject, Appearance>();
30
31 private static void ResetAppearance(PhysicsObject o)
32 {
33 if (!originalAppearances.ContainsKey(o))
34 return;
35 Appearance original = originalAppearances[o];
36 o.Color = original.Color;
37 o.Animation = original.Animation;
38 originalAppearances.Remove(o);
39 }
40#endif
41
45
47 {
48 this.parent = parent;
49 }
50
51 public void SetObjectBeingHit(PhysicsObject collisionHelper, PhysicsObject target)
52 {
53 if (target != parent && IsPlatform(target))
54 {
55#if VISUALIZE
56 if (! originalAppearances.ContainsKey(target))
57 {
58 originalAppearances.Add(target, new Appearance { Animation = target.Animation, Color = target.Color });
59 }
60
61 target.Color = Color.Red;
62 target.Animation = null;
63 Timer.SingleShot(1.0, delegate() { ResetAppearance(target); });
64#endif
65
66 LastHitObject = target;
67 }
68 }
69 }
70
71 private enum PlatformCharacterState { Idle, Falling, Jumping }
73
74
75 private Weapon weapon = null;
80 private bool isWalking = false;
81 private bool _turnsWhenWalking = true;
82 private double lastDt = 0;
84
85 private double lowTolerance { get { return Height * 0.1; } }
86 private double highTolerance { get { return Height * 0.2; } }
87
88 private bool customAnimPlaying = false;
90
95 {
96 get { return _facingDirection; }
97 set { Turn( value ); }
98 }
99
104 {
105 get { return _turnsWhenWalking; }
106 set { _turnsWhenWalking = value; }
107 }
108
110 public override Vector Size
111 {
112 get
113 {
114 return base.Size;
115 }
116 set
117 {
118 base.Size = value;
119 for (int i = 0; i < collisionHelpers.Length; i++)
120 collisionHelpers[i].Object.Size = new Vector(value.X / 3, value.Y);
121 }
122 }
123
128 public bool CanWalkAgainstWalls { get; set; }
129
132 {
133 get
134 {
135 return base.CollisionIgnorer;
136 }
137 set
138 {
139 base.CollisionIgnorer = value;
140 for (int i = 0; i < collisionHelpers.Length; i++)
141 collisionHelpers[i].Object.CollisionIgnorer = value;
142 }
143 }
144
146 public override int CollisionIgnoreGroup
147 {
148 get { return base.CollisionIgnoreGroup; }
149 set
150 {
151 base.CollisionIgnoreGroup = value;
152 for (int i = 0; i < collisionHelpers.Length; i++)
153 collisionHelpers[i].Object.CollisionIgnoreGroup = value;
154 }
155 }
156
161 {
162 get { return weapon; }
163 set
164 {
165 // First check: same weapon
166 if ( weapon == value ) return;
167
168 // Remove the previous weapon if any
169 if ( weapon != null )
170 {
171 // Reset the weapon when removing
172
173 if ( !IsWeaponFacingRight() )
174 {
175 weapon.X *= -1;
176 weapon.TextureWrapSize = new Vector( 1, 1 );
177 }
178
180 this.Remove( weapon );
181 }
182 this.weapon = value;
183 if ( value == null )
184 return;
185
186 this.Add( value );
187
189 {
190 // If facing left, set the weapon to match the direction
191 //weapon.X *= -1;
193 weapon.TextureWrapSize = new Vector( 1, -1 );
194 }
195
196 weapon.Position = this.Position;
197 }
198 }
199
203 public bool CanMoveOnAir { get; set; }
204
208 public bool MaintainMomentum { get; set; }
209
213 public Animation AnimWalk { get; set; }
214
218 public Animation AnimJump { get; set; }
219
223 public Animation AnimFall { get; set; }
224
228 public bool LoopJumpAnim { get; set; }
229
233 public bool LoopFallAnim { get; set; }
234
238 public Animation AnimIdle { get; set; }
239
243 public bool WalkOnAir { get; set; }
244
248 public event Action<Direction> DirectionChanged;
249
255 public PlatformCharacter(double width, double height)
256 : this(width, height, Shape.Rectangle)
257 {
258 }
259
266 public PlatformCharacter(double width, double height, Shape shape)
267 : base(width, height, shape/*, CollisionShapeQuality.FromValue(0.7)*/)
268 {
269 KineticFriction = 0.0;
270 Restitution = 0.0;
271 CanRotate = false;
272 CanMoveOnAir = true;
273
274 // This avoids high speeds, particularly when falling. This then avoids
275 // going through objects.
276 LinearDamping = 0.96;
277
278 for (int i = 0; i < collisionHelpers.Length; i++)
279 {
280 collisionHelpers[i] = new CollisionHelper( this );
281 collisionHelpers[i].Object = new PhysicsObject(width / 3, height)
282 {
283 IgnoresGravity = true,
285 IgnoresExplosions = true,
286#if VISUALIZE
287 IsVisible = true,
288#else
289 IsVisible = false,
290#endif
291 };
292 }
293
294#if VISUALIZE
295 collisionHelpers[0].Object.Color = new Color(150, 150, 0, 100);
296 collisionHelpers[1].Object.Color = new Color(150, 180, 0, 100);
297 collisionHelpers[2].Object.Color = new Color(150, 210, 0, 100);
298#endif
299
303
304 IsUpdated = true;
305 }
306
307 private void SetIdleAnim()
308 {
309 if ( state == PlatformCharacterState.Idle )
311 }
312
313 private void AddCollisionHelpers()
314 {
316 if ( physicsGame == null ) throw new InvalidOperationException( "Cannot have a platform character in non-physics game" );
317
318 for (int i = 0; i < collisionHelpers.Length; i++)
319 {
320 physicsGame.Add(collisionHelpers[i].Object);
321 }
322
323 physicsGame.AddProtectedCollisionHandler<PhysicsObject, PhysicsObject>(this, OnCollision);
324
325 for (int i = 0; i < collisionHelpers.Length; i++)
326 {
327 physicsGame.AddProtectedCollisionHandler<PhysicsObject, PhysicsObject>( collisionHelpers[i].Object, collisionHelpers[i].SetObjectBeingHit );
328 }
329 }
330
332 {
334 if (physicsGame == null) throw new InvalidOperationException("Cannot have a platform character in non-physics game");
335
336 for (int i = 0; i < collisionHelpers.Length; i++)
337 {
338 physicsGame.Remove(collisionHelpers[i].Object);
339 }
340
341 physicsGame.RemoveCollisionHandlers(this, null, null, null);
342
343 for (int i = 0; i < collisionHelpers.Length; i++)
344 {
345 physicsGame.RemoveProtectedCollisionHandlers(collisionHelpers[i].Object, null, null, null);
346 }
347 }
348
352 public void Reset()
353 {
355 customAnimPlaying = false;
356 }
357
358 private void SetAnimation( Animation anim, bool loop = true )
359 {
360 if ( customAnimPlaying || anim == null || Animation == anim || anim.FrameCount == 0 )
361 return;
362
363 Animation = anim;
364
365 if ( loop )
367 else
368 Animation.Start( 1 );
369 }
370
376 public void PlayAnimation( Animation anim, Action onPlayed = null )
377 {
378 customAnimPlaying = true;
379 customAnimAction = onPlayed;
380 this.Animation = anim;
381 anim.Played += AnimationPlayed;
382 anim.Start( 1 );
383 }
384
385 private void AnimationPlayed()
386 {
388 customAnimPlaying = false;
389
390 if ( customAnimAction != null )
392 }
393
394 private static bool IsPlatform(PhysicsObject o)
395 {
396 return !o.IgnoresCollisionResponse;
397 }
398
403 public void Walk(double horizontalVelocity)
404 {
405 if ( horizontalVelocity > 0 && TurnsWhenWalking )
407 else if ( horizontalVelocity < 0 && TurnsWhenWalking )
409
410 if ( CanWalk( horizontalVelocity * lastDt ) )
411 {
412 this.Velocity = new Vector( horizontalVelocity / 2, this.Velocity.Y );
413 this.X += horizontalVelocity * lastDt; // Hahmo törmäsi tasaisen pinnan reunoihin farseerilla,
414 // clipataan niiden sisälle jolloin moottori "korjaa" sijaintia hieman ylöspäin.
415 }
416
417 if ( state == PlatformCharacterState.Idle || WalkOnAir )
419
420 isWalking = true;
421 }
422
427 public void Turn( Direction direction )
428 {
429 if ( direction == FacingDirection || ( direction != Direction.Left && direction != Direction.Right ) )
430 return;
431
433
434 if ( Weapon != null )
435 {
438 }
439
440 _facingDirection = direction;
441
442 if ( DirectionChanged != null )
443 {
444 DirectionChanged( direction );
445 }
446 }
447
448 private bool IsWeaponFacingRight()
449 {
450 return (-Math.PI / 2) < Weapon.Angle.Radians
451 && Weapon.Angle.Radians < (Math.PI / 2);
452 }
453
459 public bool Jump(double speed)
460 {
461 for (int i = 0; i < collisionHelpers.Length; i++)
462 {
463 if (IsStandingOn(collisionHelpers[i].LastHitObject, highTolerance))
464 {
465 ForceJump( speed );
466 return true;
467 }
468 }
469 return false;
470 }
471
476 public bool IsAboutToFall()
477 {
478
479 /* TODO:
480 * E = elephant, # = platform
481 *
482 * E#
483 * ### <-- E.IsAboutToFall == true, when walking to the right.
484 *
485 * E#
486 * #### <-- seems to work fine
487*/
488
489 double speedDirection = this.FacingDirection.GetVector().X;
490 double lowestPoint = this.Bottom;
491
492 for (int i = 0; i < this.collisionHelpers.Length; i++)
493 {
494 if (collisionHelpers[i].Object.Bottom < lowestPoint) lowestPoint = collisionHelpers[i].Object.Bottom;
495 }
496
497 if (lastPlatform != null
498 && this.X + speedDirection * (this.Width / 2) < lastPlatform.Right
499 && this.X + speedDirection * (this.Width / 2) > lastPlatform.Left
500 && lowestPoint < lastPlatform.Top
501 && lowestPoint > lastPlatform.Bottom)
502 {
503 return false;
504 }
505
506 GameObject platform = this.Game.GetObjectAt(new Vector(this.X + speedDirection * (this.Width/ 2), lowestPoint - 1));
507 if (platform == null) return true;
508
509 PhysicsObject p = platform as PhysicsObject;
510 if (p == null) return true;
511 if (p.IgnoresCollisionResponse) return true;
512 if (p.CollisionIgnoreGroup == this.CollisionIgnoreGroup && p.CollisionIgnoreGroup != 0) return true;
513
514 return false;
515 }
516
521 public void ForceJump( double speed )
522 {
524 IgnoresGravity = false;
525 Hit( new Vector( 0, speed * Mass ) );
527
528 Timer t = new Timer();
529 t.Interval = 0.01;
530 t.Timeout += delegate
531 {
532 if ( this.Velocity.Y < 0 )
533 {
534 t.Stop();
537 }
538 };
539 t.Start();
540 }
541
543 protected override void PrepareThrowable( PhysicsObject obj, Angle angle, double force, double distanceDelta, double axialDelta )
544 {
545 double d = ( this.Width + obj.Width ) / 2;
546 Angle throwAngle = FacingDirection == Direction.Left ? Angle.StraightAngle - angle : angle;
547 obj.Position = this.Position + this.FacingDirection.GetVector() * d + Vector.UnitY * axialDelta;
548 obj.Hit( Vector.FromLengthAndAngle( force, throwAngle ) );
549 }
550
551 private double GetPlatformTopY( GameObject platform )
552 {
553 if ( platform.Angle == Angle.Zero )
554 return platform.Top;
555
556 Vector uTargetX = Vector.FromAngle( platform.Angle );
557 Vector uTargetY = uTargetX.LeftNormal;
558
559 double leftProj = new Vector( this.Left - platform.Position.X, this.Bottom - platform.Position.Y ).ScalarProjection( uTargetX );
560 double rightProj = new Vector( this.Right - platform.Position.X, this.Bottom - platform.Position.Y ).ScalarProjection( uTargetX );
561 Vector leftTopPoint = leftProj * uTargetX + platform.Height / 2 * uTargetY;
562 Vector rightTopPoint = rightProj * uTargetX + platform.Height / 2 * uTargetY;
563
564 return platform.Position.Y + Math.Max( leftTopPoint.Y, rightTopPoint.Y );
565 }
566
572 private bool IsStandingOn(PhysicsObject target, double yTolerance)
573 {
574 if (target == null || target.IsDestroyed || this.IgnoresCollisionWith(target)) return false;
575
576 // This prevents jumping when on the side of the wall, not on top of it.
577 double epsilon = Width / 6;
578
579 double targetTop = this.GetPlatformTopY( target );
580 return (target.Position.Y <= this.Position.Y
581 && (this.Bottom - targetTop) < yTolerance
582 && (target.Left + epsilon) < this.Right
583 && this.Left < (target.Right - epsilon));
584 }
585
586 private void OnCollision(PhysicsObject collisionHelperObject, PhysicsObject target)
587 {
588 // Velocity <= 0 condition is here to allow jumping through a platform without stopping
589 if (IsPlatform(target) && IsStandingOn(target, highTolerance) && Velocity.Y <= 0)
590 {
591 IgnoresGravity = true;
592 StopVertical();
595 }
596 }
597
599 public override void Destroy()
600 {
601 for (int i = 0; i < collisionHelpers.Length; i++)
602 {
604 }
605 base.Destroy();
606 }
607
613 [EditorBrowsable(EditorBrowsableState.Never)]
614 public override void Update(Time time)
615 {
616 Visualize();
618
619 if (!isWalking)
620 StopWalking();
621 isWalking = false;
622
623 lastDt = time.SinceLastUpdate.TotalSeconds;
624 base.Update(time);
625 }
626
627 private bool CanWalk(double dx)
628 {
629 if ( !CanMoveOnAir && !collisionHelpers.Any( c => IsStandingOn( c.LastHitObject, lowTolerance ) ) )
630 return false;
631
632 if ( CanWalkAgainstWalls || Game == null || Math.Abs( dx ) < float.Epsilon )
633 return true;
634
635 Vector wallPos = this.Position + ( Math.Sign(dx) * this.Width / 2 + dx ) * Vector.UnitX;
636
637 foreach ( var obj in Game.GetObjectsAt( wallPos ) )
638 {
639 if ( !( obj is PhysicsObject ) )
640 continue;
641
642 if ( !this.IgnoresCollisionWith( (PhysicsObject)obj ) )
643 return false;
644 }
645
646 return true;
647 }
648
649 private void Visualize()
650 {
651#if VISUALIZE
652 if ( stateIndicator == null )
653 {
654 stateIndicator = new GameObject( this.Width, 10 );
656 }
657
658 stateIndicator.Position = this.Position + new Vector( 0, this.Height );
659 stateIndicator.Color = GetStateColor( state );
660#endif
661 }
662
663 private void AdjustPosition()
664 {
665 collisionHelpers[0].Object.Position = this.Position - new Vector( -Width / 4, Height * 1 / 8 );
666 collisionHelpers[1].Object.Position = this.Position - new Vector( 0, Height * 1 / 8 );
667 collisionHelpers[2].Object.Position = this.Position - new Vector( Width / 4, Height * 1 / 8 );
668
669 if ( state == PlatformCharacterState.Jumping )
670 return;
671
672 PhysicsObject platform = FindPlatform();
673
674 if ( platform != null && IsStandingOn(platform, lowTolerance) )
675 {
676 this.Y = GetPlatformTopY( platform ) + this.Height / 2;
677
678 if ( lastPlatformPosition.HasValue ) this.X += platform.X - lastPlatformPosition.Value.X;
680 lastPlatform = platform;
681 }
682 else
683 {
684 IgnoresGravity = false;
688 }
689 }
690
692 {
693 switch ( state )
694 {
695 case PlatformCharacterState.Falling: return Color.Red;
696 case PlatformCharacterState.Jumping: return Color.Yellow;
697 default: return Color.White;
698 }
699 }
700
702 {
703 PhysicsObject platform = null;
704
705 for ( int i = 0; i < collisionHelpers.Length; i++ )
706 {
707 if ( IsStandingOn( collisionHelpers[i].LastHitObject, lowTolerance ) )
708 {
709 platform = collisionHelpers[i].LastHitObject;
710 if ( lastPlatform != platform ) lastPlatformPosition = null;
711 }
712 }
713
714 return platform;
715 }
716
717 private void StopWalking()
718 {
719 if ( !MaintainMomentum )
720 {
722 }
723
724 if ( state == PlatformCharacterState.Idle )
726 }
727
732 public override void Move( Vector movement )
733 {
734 Vector dv = movement - this.Velocity;
735 Walk( dv.X );
736 }
737
739 protected override void MoveToTarget()
740 {
741 if ( !moveTarget.HasValue )
742 {
743 Stop();
744 moveTimer.Stop();
745 return;
746 }
747
748 Vector d = moveTarget.Value - Position;
749 double vt = moveSpeed * moveTimer.Interval;
750
751 if ( d.Magnitude < vt )
752 {
753 Vector targetLoc = moveTarget.Value;
754 Stop();
755 moveTimer.Stop();
756 moveTarget = null;
757
758 if ( arrivedAction != null )
760 }
761 else
762 {
764 Walk( dv.X );
765 }
766 }
767}
Sarja kuvia, jotka vaihtuvat halutulla nopeudella. Yksi animaatio koostuu yhdestä tai useammasta kuva...
Definition: Animation.cs:62
Action Played
Tapahtuma, joka tapahtuu kun animaatio on suoritettu.
Definition: Animation.cs:176
int FrameCount
Ruutujen määrä.
Definition: Animation.cs:89
void Start()
Käynnistää animaation alusta.
Definition: Animation.cs:284
GameObject GetObjectAt(Vector position)
Palauttaa peliolion, joka on annetussa paikassa. Jos paikassa ei ole mitään pelioliota,...
Definition: Layers.cs:404
void Add(Light light)
Lisää valon peliin. Nykyisellään valoja voi olla ainoastaan yksi kappale. Toistaiseksi ei tuettu Wind...
Definition: Effects.cs:27
List< GameObject > GetObjectsAt(Vector position)
Palauttaa listan peliolioista, jotka ovat annetussa paikassa. Jos paikassa ei ole mitään pelioliota,...
Definition: Layers.cs:361
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
Action arrivedAction
Kun olio saapuu kohteeseen
Definition: Movement.cs:57
override Angle?? Angle
Definition: Dimensions.cs:102
Vector TextureWrapSize
Määrittää kuinka moneen kertaan kuva piirretään. Esimerkiksi (3.0, 2.0) piirtää kuvan 3 kerta...
Definition: Appearance.cs:56
GameObject(double width, double height)
Alustaa uuden peliolion.
Definition: GameObject.cs:79
double moveSpeed
Liikkumisnopeus kohdetta kohti
Definition: Movement.cs:52
override void Destroy()
Tuhoaa olion. Tuhottu olio poistuu pelistä.
Definition: GameObject.cs:55
void Remove(IGameObject childObject)
Poistaa lapsiolion. Jos haluat tuhota olion, kutsu mielummin olion Destroy-metodia.
bool IsVisible
Piirretäänkö oliota ruudulle.
Definition: Appearance.cs:43
override Animation Animation
Animaatio. Voi olla null, jolloin piirretään vain väri.
Definition: Appearance.cs:48
Vector? moveTarget
Piste johon liikutaan
Definition: Movement.cs:47
void Add(IGameObject childObject)
Lisää annetun peliolion tämän olion lapseksi. Lapsiolio liikkuu tämän olion mukana.
Definition: ChildObjects.cs:98
Timer moveTimer
Ajastin joka liikuttaa kappaletta kohti kohdepistettä
Definition: Movement.cs:42
virtual Color Color
Väri, jonka värisenä olio piirretään, jos tekstuuria ei ole määritelty.
Definition: Appearance.cs:65
double X
Olion paikan X-koordinaatti.
double Top
Olion yläreunan y-koordinaatti.
double Height
Olion korkeus (Y-suunnassa, korkeimmassa kohdassa).
double Bottom
Olion alareunan y-koordinaatti.
Action AddedToGame
Tapahtuu, kun olio lisätään peliin.
double Left
Olion vasemman reunan x-koordinaatti.
double Y
Olion paikan Y-koordinaatti.
bool IsDestroyed
Onko olio tuhottu.
double Width
Olion leveys (X-suunnassa, leveimmässä kohdassa).
double Right
Olion oikean reunan x-koordinaatti.
Action Removed
Tapahtuu, kun olio poistetaan pelistä (tuhotaan tai ei).
bool IsUpdated
Tarvitseeko olio päivittämistä. Kun perit oman luokkasi tästä luokasta, aseta tämä arvoon true,...
Base class for Collision Ignorers to impliment.
Definition: Ignorer.cs:40
Kantaluokka fysiikkapeleille.
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.
void Remove(IAxleJoint j)
Poistaa liitoksen pelistä.
void Add(IAxleJoint j)
Lisää liitoksen peliin.
void RemoveProtectedCollisionHandlers(PhysicsObject obj=null, PhysicsObject target=null, object tag=null, Delegate handler=null)
Poistaa kaikki ehdot täyttävät törmäyksenkäsittelijät. Jypelin sisäiseen käyttöön!
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
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:29
double KineticFriction
Liikekitka (hidastaa kun olio on jo liikkeessä). Ks. StaticFriction (lepokitka)
Definition: Collisions.cs:90
bool IgnoresGravity
Jättääkö painovoiman huomiotta.
override Vector?? Position
Definition: Dimensions.cs:30
bool CanRotate
Jos false, olio ei voi pyöriä.
Definition: Inertia.cs:43
void StopHorizontal()
Pysäyttää olion liikkeen vaakasuunnassa.
Definition: Movement.cs:130
double Mass
Olion massa (paino). Mitä enemmän massaa, sitä enemmän voimaa tarvitaan saamaan olio liikkeelle / pys...
Definition: Inertia.cs:14
virtual void Hit(Vector impulse)
Kohdistaa kappaleeseen impulssin. Tällä kappaleen saa nopeasti liikkeeseen.
Definition: Movement.cs:90
void StopVertical()
Pysäyttää olion liikkeen pystysuunnassa.
Definition: Movement.cs:138
Vector Velocity
Nopeus.
Definition: Movement.cs:15
double LinearDamping
Nopeuskerroin. Pienempi arvo kuin 1 (esim. 0.998) toimii kuten kitka / ilmanvastus.
Definition: Inertia.cs:57
PhysicsObject(double width, double height, Shape shape, double x=0.0, double y=0.0)
Alustaa fysiikkaolion käyttöön.
bool IgnoresCollisionWith(PhysicsObject target)
Tarkistaa, jätetäänkö törmäämättä toiseen olioon. Ts. tarkistaa, onko joko tällä oliolla tai toisella...
Definition: Collisions.cs:134
override void Stop()
Pysäyttää olion.
Definition: Movement.cs:107
bool IgnoresCollisionResponse
Jättääkö törmäykset huomiotta.
Definition: Collisions.cs:52
double Restitution
Kimmoisuuskerroin (0 = ei kimmoisa, 1 = täysin kimmoisa, yli 1 = saa energiaa tyhjästä)
Definition: Collisions.cs:62
Suorakulmio.
Definition: Shapes.cs:322
Kuvio.
Definition: Shapes.cs:47
Ajastin, joka voidaan asettaa laukaisemaan tapahtumia tietyin väliajoin.
Definition: Timer.cs:38
static void SingleShot(double seconds, Action onTimeout)
Kutsuu aliohjelmaa onTimeout annetun ajan kuluttua. Ajastin luodaan automaattisesti.
Definition: Timer.cs:220
double Interval
Aika sekunneissa, jonka välein TimeOut tapahtuu.
Definition: Timer.cs:87
void Stop()
Pysäyttää ajastimen ja nollaa sen tilan.
Definition: Timer.cs:292
Action Timeout
Tapahtuu väliajoin.
Definition: Timer.cs:44
void Start()
Käynnistää ajastimen.
Definition: Timer.cs:257
void SetObjectBeingHit(PhysicsObject collisionHelper, PhysicsObject target)
CollisionHelper(PhysicsObject parent)
Tasohyppelypelin hahmo. Voi liikkua ja hyppiä. Lisäksi sillä voi olla ase.
bool TurnsWhenWalking
Kääntyykö hahmo automaattisesti kun se kävelee.
void ForceJump(double speed)
Hyppää vaikka olio ei olisikaan toisen päällä.
Direction _facingDirection
GameObject stateIndicator
void Walk(double horizontalVelocity)
Liikuttaa hahmoa.
Animation AnimWalk
Kävelyanimaatio (oikealle)
PlatformCharacter(double width, double height, Shape shape)
Luo uuden tasohyppelyhahmon.
Animation AnimIdle
Animaatio, jota käytetään kun hahmo on paikallaan (kääntyneenä oikealle)
override Vector Size
bool CanMoveOnAir
Jos false, hahmoa ei voi liikuttaa kun se on ilmassa.
Color GetStateColor(PlatformCharacterState state)
void SetAnimation(Animation anim, bool loop=true)
override Jypeli.Ignorer CollisionIgnorer
PlatformCharacter(double width, double height)
Luo uuden tasohyppelyhahmon.
Animation AnimJump
Hyppyanimaatio (oikealle)
override void PrepareThrowable(PhysicsObject obj, Angle angle, double force, double distanceDelta, double axialDelta)
Valmistelee heitettävän kappaleen heittoa varten valmiiksi, ei lisää sitä peliin.
double GetPlatformTopY(GameObject platform)
Action< Direction > DirectionChanged
Hahmon suunnan muutos.
bool CanWalk(double dx)
override void Update(Time time)
Ajetaan kun pelitilannetta päivitetään. Päivityksen voi toteuttaa omassa luokassa toteuttamalla tämän...
bool CanWalkAgainstWalls
Voiko hahmo kävellä kun sen edessä on seinä. Oletus false.
static bool IsPlatform(PhysicsObject o)
bool LoopFallAnim
Toistetaanko putoamisanimaatiota useammin kuin kerran.
override int CollisionIgnoreGroup
void PlayAnimation(Animation anim, Action onPlayed=null)
Toistaa hahmolle animaation
bool LoopJumpAnim
Toistetaanko hyppyanimaatiota useammin kuin kerran.
Direction FacingDirection
Hahmon rintamasuunta (vasen tai oikea).
bool MaintainMomentum
Jos true, hahmon liike jatkuu hidastuen vaikka kävelemisen lopettaa.
Animation AnimFall
Putoamisanimaatio (oikealle)
override void Move(Vector movement)
Siirtää oliota.
bool IsStandingOn(PhysicsObject target, double yTolerance)
Checks if the character is located on top of the target.
bool WalkOnAir
Toistetaanko kävelyanimaatiota ilmassa liikuttaessa?
void OnCollision(PhysicsObject collisionHelperObject, PhysicsObject target)
CollisionHelper[] collisionHelpers
void Turn(Direction direction)
Kääntyy.
bool Jump(double speed)
Hyppää, jos hahmo on staattisen olion päällä.
PhysicsObject FindPlatform()
override void MoveToTarget()
Liikuttaa kappaletta kohti määränpäätä.
bool IsAboutToFall()
Onko hahmo astumassa tyhjän päälle.
PhysicsObject lastPlatform
PlatformCharacterState state
void Reset()
Resetoi hahmon tilan ja pysäyttää animaation
override void Destroy()
Tuhoaa olion.
Suuntakulma (rajoitettu -180 ja 180 asteen välille) asteina ja radiaaneina. Tietoja kulmasta: http://...
Definition: Angle.cs:40
static readonly Angle StraightAngle
Oikokulma (180 astetta).
Definition: Angle.cs:54
static Angle Supplement(Angle a)
Laskee suplementtikulman (180 asteen kulman toinen puoli)
Definition: Angle.cs:365
static readonly Angle Zero
Nollakulma.
Definition: Angle.cs:44
double Radians
Palauttaa tai asettaa kulman radiaaneina.
Definition: Angle.cs:85
Väri.
Definition: Color.cs:13
static readonly Color White
Valkoinen.
Definition: Color.cs:956
static readonly Color Yellow
Keltainen.
Definition: Color.cs:961
static readonly Color Red
Punainen.
Definition: Color.cs:866
Perussuunta tasossa.
Definition: Direction.cs:47
static Direction Right
Suunta oikealle.
Definition: Direction.cs:71
Vector GetVector()
Palauttaa suunnan yksikkövektorina.
Definition: Direction.cs:116
static Direction Left
Suunta vasemmalle.
Definition: Direction.cs:66
Sisältää tiedon ajasta, joka on kulunut pelin alusta ja viime päivityksestä.
Definition: Time.cs:14
TimeSpan SinceLastUpdate
Aika joka on kulunut viime päivityksestä.
Definition: Time.cs:27
2D-vektori.
Definition: Vector.cs:67
Vector LeftNormal
Vasen normaali.
Definition: Vector.cs:97
double Y
Vektorin Y-komponentti
Definition: Vector.cs:339
static Vector FromAngle(Angle angle)
Luo vektorin kulman perusteella yksikköpituudella.
Definition: Vector.cs:133
double X
Vektorin X-komponentti.
Definition: Vector.cs:334
Angle Angle
Kulma radiaaneina.
Definition: Vector.cs:372
static readonly Vector UnitY
Pystysuuntainen yksikkövektori (pituus 1, suunta ylös).
Definition: Vector.cs:86
static readonly Vector UnitX
Vaakasuuntainen yksikkövektori (pituus 1, suunta oikealle).
Definition: Vector.cs:81
double ScalarProjection(Vector vector)
Skalaariprojektio annettuun vektoriin https://en.wikipedia.org/wiki/Scalar_projection
Definition: Vector.cs:200
double Magnitude
Vektorin pituus.
Definition: Vector.cs:345
static Vector FromLengthAndAngle(double length, double angle)
Luo vektorin pituuden ja kulman perusteella.
Definition: Vector.cs:114