Jypeli 10
The simple game programming library
PlatformCharacter2.cs
Siirry tämän tiedoston dokumentaatioon.
1
2#if DEBUG
3// #define VISUALIZE
4#endif
5
6using System;
7using System.ComponentModel;
8using System.Linq;
9using Jypeli;
10using Jypeli.Assets;
11using Jypeli.Physics;
12
13
18{
19 private int _tolerance = 5;
20 private double _accel = 1000;
21 private double _maxVel = 500;
22
23 private enum PlatformCharacterState { Idle, Falling, Jumping }
25
26 private Weapon weapon = null;
28 private double _cachedGravityMagnitude = 0;
30
31 private bool collisionDetected = false;
32 private int noCollisionCount = 0;
33 private int walkSteps = 0;
35 private Timer detachTimer = new Timer();
36
37 private bool customAnimPlaying = false;
38 private Action customAnimAction;
39
40 private double gravityMagnitude
41 {
42 get
43 {
46 }
47 }
48
50 {
51 get
52 {
55 }
56 }
57
63 {
64 get { return _tolerance; }
65 set { _tolerance = value; }
66 }
67
72 {
73 get { return _curDirection; }
74 set { Turn( value ); }
75 }
76
80 public new double Acceleration
81 {
82 get { return _accel; }
83 set { _accel = value; }
84 }
85
89 public new double MaxVelocity
90 {
91 get { return _maxVel; }
92 set { _maxVel = value; }
93 }
94
95#if VISUALIZE
96 private GameObject ssurface = new GameObject( 1, 2, Shape.Rectangle ) { Color = Color.Blue };
97 private PhysicsObject _platform = null;
98
103 {
104 get { return _platform; }
105 set
106 {
107 if ( value != null )
108 {
109 Vector distNormal = this.Position - value.Position;
110 double sideWidth = Math.Sqrt( Width * Width + Height * Height );
111 ssurface.Position = this.Position - Vector.FromLengthAndAngle( sideWidth, distNormal.Angle );
112 ssurface.Color = Color.Red;
113 }
114 else
115 {
116 ssurface.Color = Color.Blue;
118 }
119
120 _platform = value;
121 }
122 }
123#else
127 public PhysicsObject Platform { get; set; }
128#endif
129
134 public Vector PlatformNormal { get; private set; }
135
140 {
141 get { return weapon; }
142 set
143 {
144 // First check: same weapon
145 if ( weapon == value ) return;
146
147 // Remove the previous weapon if any
148 if ( weapon != null )
149 {
150 // Reset the weapon when removing
151
152 if ( !IsWeaponFacingRight() )
153 {
154 weapon.X *= -1;
155 weapon.TextureWrapSize = new Vector( 1, 1 );
156 }
157
159 this.Remove( weapon );
160 }
161
162 this.weapon = value;
163 if ( value == null )
164 return;
165
166 this.Add( value );
167
169 {
170 // If facing left, set the weapon to match the direction
171 weapon.X *= -1;
173 weapon.TextureWrapSize = new Vector( 1, -1 );
174 }
175 }
176 }
177
181 public bool CanMoveOnAir { get; set; }
182
186 public Animation AnimWalk { get; set; }
187
191 public Animation AnimJump { get; set; }
192
196 public Animation AnimFall { get; set; }
197
201 public bool LoopJumpAnim { get; set; }
202
206 public bool LoopFallAnim { get; set; }
207
211 public Animation AnimIdle { get; set; }
212
216 public bool WalkOnAir { get; set; }
217
221 public event Action<Direction> DirectionChanged;
222
226 public PlatformCharacter2(double width, double height)
227 : this(width, height, Shape.Circle)
228 {
229 }
230
234 public PlatformCharacter2( double width, double height, Shape shape )
235 : base( width, height, shape /*, CollisionShapeQuality.FromValue(0.7)*/ )
236 {
237 KineticFriction = 0.0;
238 Restitution = 0.2;
239 CanRotate = false;
240 CanMoveOnAir = true;
241
242 // This avoids high speeds, particularly when falling. This then avoids
243 // going through objects.
244 LinearDamping = 0.96;
245
247 IsUpdated = true;
248 }
249
250 private void SetAnimation( Animation anim, bool loop = true )
251 {
252 if ( customAnimPlaying || anim == null || Animation == anim || anim.FrameCount == 0 )
253 return;
254
255 Animation = anim;
256
257 if ( loop )
259 else
260 AnimJump.Start( 1 );
261 }
262
268 public void PlayAnimation( Animation anim, Action onPlayed = null )
269 {
270 customAnimPlaying = true;
271 customAnimAction = onPlayed;
272 this.Animation = anim;
273 anim.Played += AnimationPlayed;
274 anim.Start( 1 );
275 }
276
277 private void AnimationPlayed()
278 {
280 customAnimPlaying = false;
281
282 if ( customAnimAction != null )
284 }
285
286 private void updateGravity()
287 {
289 if ( physGame == null ) return;
290
291 if ( physGame.Gravity != _cachedGravity )
292 {
293 _cachedGravity = physGame.Gravity;
296
297#if VISUALIZE
299#endif
300 }
301 }
302
303 private void AddCollisionHandler()
304 {
306 if ( physicsGame == null ) throw new InvalidOperationException( "Cannot have a platform character in non-physics game" );
307
308 this.Body.Colliding += delegate( IPhysicsBody o1, IPhysicsBody o2, Collision c )
309 {
311 Vector normal = c.Contacts.First().Normal;
312 OnColliding( this, other, normal );
313 };
314
315 #if VISUALIZE
316 ssurface.Width = 2 * Math.Sqrt( Game.Level.Width * Game.Level.Width + Game.Level.Height * Game.Level.Height );
317 Game.Instance.Add( ssurface );
318 #endif
319 }
320
324 public void Walk()
325 {
326 walkSteps++;
327
328 if ( state == PlatformCharacterState.Idle || WalkOnAir )
330 }
331
336 public void Walk( Direction direction )
337 {
338 Turn( direction );
339 walkSteps++;
340
341 if ( state == PlatformCharacterState.Idle || WalkOnAir )
343 }
344
349 public void Turn( Direction direction )
350 {
351 if ( direction == FacingDirection || ( direction != Direction.Left && direction != Direction.Right ) )
352 return;
353
354 walkSteps = 0;
356
357 if ( Weapon != null )
358 {
359 Weapon.X *= -1;
362 }
363
364 _curDirection = direction;
365
366 if ( DirectionChanged != null )
367 {
368 DirectionChanged( direction );
369 }
370 }
371
375 public void StopWalking()
376 {
377 walkSteps = 0;
378 if ( state == PlatformCharacterState.Idle )
380 }
381
382 private bool IsWeaponFacingRight()
383 {
384 return (-Math.PI / 2) < Weapon.Angle.Radians
385 && Weapon.Angle.Radians < (Math.PI / 2);
386 }
387
392 public void Jump( double speed )
393 {
394 if ( Platform == null || state == PlatformCharacterState.Jumping ) return;
395 ForceJump( speed );
396 }
397
402 public void ForceJump( double speed )
403 {
404 IgnoresGravity = false;
405 this.Hit( Mass * speed * -gravityNormal );
406 Platform = null;
407
410
411 Timer t = new Timer();
412 t.Interval = 0.01;
413 t.Timeout += delegate
414 {
415 if ( this.Velocity.Y < 0 )
416 {
417 t.Stop();
420 }
421 };
422 t.Start();
423 }
424
426 protected override void PrepareThrowable( PhysicsObject obj, Angle angle, double force, double distanceDelta, double axialDelta )
427 {
428 double d = ( this.Width + obj.Width ) / 2;
429 Angle throwAngle = FacingDirection == Direction.Left ? Angle.StraightAngle - angle : angle;
430 obj.Position = this.Position + this.FacingDirection.GetVector() * d + gravityNormal * axialDelta;
431 obj.Hit( Vector.FromLengthAndAngle( force, throwAngle ) );
432 }
433
434 private void OnColliding( PhysicsObject collisionHelperObject, PhysicsObject target, Vector normal )
435 {
436 if ( target.IgnoresCollisionResponse )
437 return;
438
439 double dot = Vector.DotProduct( normal, gravityNormal );
440 if ( Math.Abs( dot ) < 0.5 )
441 return;
442
443 if ( Platform != null && Platform != target )
444 return;
445
446 if ( Platform == null )
447 Platform = target;
448
449 collisionDetected = true;
451 PlatformNormal = normal;
452
453 if ( state == PlatformCharacterState.Falling )
455 }
456
462 [EditorBrowsable(EditorBrowsableState.Never)]
463 public override void Update(Time time)
464 {
465 if ( Platform != null && !collisionDetected )
466 {
468 {
469 Platform = null;
470
471 if ( state != PlatformCharacterState.Jumping )
472 {
475 }
476 }
477 }
478
479 collisionDetected = false;
480
481 if ( walkSteps > 0 )
482 {
483 // Walking
484 double impulse = Mass * Acceleration * time.SinceLastUpdate.TotalSeconds;
486
488 this.Push( Mass * Acceleration * -unitX );
490 this.Push( Mass * Acceleration * unitX );
491
492 walkSteps--;
493
494 if ( state == PlatformCharacterState.Idle )
496 }
497 else
498 {
499 // Not walking
500 if ( state == PlatformCharacterState.Idle )
502 /*switch ( state )
503 {
504 case PlatformCharacterState.Idle: SetAnimation( AnimIdle ); break;
505 case PlatformCharacterState.Falling: SetAnimation( AnimFall ); break;
506 case PlatformCharacterState.Jumping: SetAnimation( AnimJump ); break;
507 }*/
508 }
509
510 base.Update(time);
511 }
512
517 public override void Move( Vector movement )
518 {
519 if ( movement.X > 0 ) Walk( Direction.Right );
520 else if ( movement.X < 0 ) Walk( Direction.Left );
521 if ( movement.Y > 0 ) Jump( movement.Y );
522 }
523}
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
Level Level
Aktiivinen kenttä.
Definition: Game.cs:145
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
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
void Remove(IGameObject childObject)
Poistaa lapsiolion. Jos haluat tuhota olion, kutsu mielummin olion Destroy-metodia.
void Add(IGameObject childObject)
Lisää annetun peliolion tämän olion lapseksi. Lapsiolio liikkuu tämän olion mukana.
Definition: ChildObjects.cs:98
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 Height
Olion korkeus (Y-suunnassa, korkeimmassa kohdassa).
Action AddedToGame
Tapahtuu, kun olio lisätään peliin.
double Width
Olion leveys (X-suunnassa, leveimmässä kohdassa).
bool IsUpdated
Tarvitseeko olio päivittämistä. Kun perit oman luokkasi tästä luokasta, aseta tämä arvoon true,...
double Width
Kentän leveys.
Definition: Level.cs:109
double Height
Kentän korkeus.
Definition: Level.cs:118
IEnumerable< ContactPoint > Contacts
Definition: Collision.cs:24
Kantaluokka fysiikkapeleille.
Vector Gravity
Painovoima. Voimavektori, joka vaikuttaa kaikkiin ei-staattisiin kappaleisiin.
Kappale joka noudattaa fysiikan lakeja, johon voi törmätä. Vaatii että käytössä on fysiikkapeli.
Definition: Collisions.cs:7
double KineticFriction
Liikekitka (hidastaa kun olio on jo liikkeessä). Ks. StaticFriction (lepokitka)
Definition: Collisions.cs:90
bool IgnoresGravity
Jättääkö painovoiman huomiotta.
IPhysicsBody Body
Fysiikkamoottorin käsittelemä fysiikkakappale.
Definition: Dimensions.cs:12
virtual void Push(Vector force)
Työntää oliota.
Definition: Movement.cs:74
override Vector?? Position
Definition: Dimensions.cs:30
bool CanRotate
Jos false, olio ei voi pyöriä.
Definition: Inertia.cs:43
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
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 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
Kuvio.
Definition: Shapes.cs:47
static readonly Rectangle Rectangle
Suorakulmio.
Definition: Shapes.cs:73
Ajastin, joka voidaan asettaa laukaisemaan tapahtumia tietyin väliajoin.
Definition: Timer.cs:38
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
Tasohyppelypelin hahmo. Voi liikkua ja hyppiä. Lisäksi sillä voi olla ase.
Animation AnimIdle
Animaatio, jota käytetään kun hahmo on paikallaan (kääntyneenä oikealle)
bool CanMoveOnAir
Jos false, hahmoa ei voi liikuttaa kun se on ilmassa.
PlatformCharacterState state
bool WalkOnAir
Toistetaanko kävelyanimaatiota ilmassa liikuttaessa?
void Walk(Direction direction)
Kävelee tiettyyn suuntaan.
void Turn(Direction direction)
Kääntyy.
new double MaxVelocity
Hahmon maksiminopeus.
void Jump(double speed)
Hyppää tietyllä nopeudella, jos hahmo seisoo tukevalla pohjalla.
bool LoopFallAnim
Toistetaanko putoamisanimaatiota useammin kuin kerran.
Animation AnimFall
Putoamisanimaatio (oikealle)
Animation AnimJump
Hyppyanimaatio (oikealle)
Vector PlatformNormal
Suuntavektori, joka osoittaa tason suuntaan. Nollavektori, jos ilmassa.
PlatformCharacter2(double width, double height, Shape shape)
Luo uuden tasohyppelyhahmon.
PhysicsObject Platform
Fysiikkaolio jonka päällä seisotaan.
void Walk()
Kävelee.
Action< Direction > DirectionChanged
Tapahtuu kun suunta vaihtuu.
bool LoopJumpAnim
Toistetaanko hyppyanimaatiota useammin kuin kerran.
override void Update(Time time)
Ajetaan kun pelitilannetta päivitetään. Päivityksen voi toteuttaa omassa luokassa toteuttamalla tämän...
Animation AnimWalk
Kävelyanimaatio (oikealle)
void OnColliding(PhysicsObject collisionHelperObject, PhysicsObject target, Vector normal)
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.
Direction FacingDirection
Hahmon rintamasuunta (vasen tai oikea).
PlatformCharacter2(double width, double height)
Luo uuden tasohyppelyhahmon.
override void Move(Vector movement)
Siirtää oliota.
new double Acceleration
Hahmon kiihtyvyys.
void ForceJump(double speed)
Hyppää vaikka olio ei olisikaan toisen päällä.
int PlatformTolerance
Toleranssiarvo, joka määrittää kuinka monta pelin päivitysjaksoa hahmo voi olla irti tasosta ennen ku...
void SetAnimation(Animation anim, bool loop=true)
void StopWalking()
Pysähtyy.
void PlayAnimation(Animation anim, Action onPlayed=null)
Toistaa animaation
Rajapinta fysiikkamoottorin tietämää fysiikkakappaletta varten.
Definition: IPhysicsBody.cs:10
AdvancedCollisionHandler< IPhysicsBody, IPhysicsBody > Colliding
Definition: IPhysicsBody.cs:57
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 Blue
Sininen.
Definition: Color.cs:566
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 readonly Vector Zero
Nollavektori.
Definition: Vector.cs:71
double X
Vektorin X-komponentti.
Definition: Vector.cs:334
Angle Angle
Kulma radiaaneina.
Definition: Vector.cs:372
static readonly Vector UnitX
Vaakasuuntainen yksikkövektori (pituus 1, suunta oikealle).
Definition: Vector.cs:81
static double DotProduct(Vector left, Vector right)
Pistetulo.
Definition: Vector.cs:155
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