Jypeli  5
The simple game programming library
AbstractMoverBrain.cs
Siirry tämän tiedoston dokumentaatioon.
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.ComponentModel;
6 
7 namespace Jypeli
8 {
12  [EditorBrowsable( EditorBrowsableState.Never )]
13  public abstract class AbstractMoverBrain : Brain
14  {
15  private double _speed = 100;
16  private UnlimitedAngle _turnSpeed = UnlimitedAngle.Infinity;
17 
22  public virtual double Speed
23  {
24  get { return _speed; }
25  set { _speed = value; }
26  }
27 
31  public bool TurnWhileMoving { get; set; }
32 
37  {
38  get { return _turnSpeed; }
39  set { _turnSpeed = value; }
40  }
41 
43  {
44  }
45 
46  public AbstractMoverBrain( double speed )
47  {
48  this.Speed = speed;
49  }
50 
51  private double dist( double a1, double a2 )
52  {
53  return Math.PI - Math.Abs( Math.Abs( a2 - a1 ) - Math.PI );
54  }
55 
56  public void Turn( Angle angle )
57  {
58  if ( !TurnWhileMoving || Game.Time.SinceLastUpdate.TotalSeconds == 0 || Owner == null || Owner.Angle == angle ) return;
59 
60  double maxTurn = TurnSpeed.Radians * Game.Time.SinceLastUpdate.TotalSeconds;
61  if ( Math.Abs(angle.Radians - Owner.Angle.Radians) <= maxTurn )
62  Owner.Angle = angle;
63  else
64  {
65  double a1 = Owner.Angle.Radians;
66  double a2 = angle.Radians;
67  double d = dist( a2, a1 );
68  double dcw = dist( a2, a1 - maxTurn );
69  double dccw = dist( a2, a1 + maxTurn );
70 
71  double step = dcw < dccw ? -maxTurn : maxTurn;
73  }
74  }
75 
76  protected void Move( Vector direction )
77  {
78  if ( Owner == null || direction == Vector.Zero ) return;
79  double d = Math.Min( direction.Magnitude, Speed );
80  Owner.Move( Vector.FromLengthAndAngle( d, direction.Angle ) );
81  Turn(direction.Angle);
82  }
83 
84  protected void Move( Angle direction )
85  {
86  if ( Owner == null ) return;
87  Owner.Move( Vector.FromLengthAndAngle( Speed, direction ) );
88  Turn( direction );
89  }
90  }
91 }
double Magnitude
Vektorin pituus.
Definition: Vector.cs:281
static readonly UnlimitedAngle Infinity
Ääretön kulma.
Angle Angle
Kulma radiaaneina.
Definition: Vector.cs:308
Suuntakulma (rajoitettu -180 ja 180 asteen välille) asteina ja radiaaneina. Tietoja kulmasta: http://...
Definition: Angle.cs:40
void Move(Angle direction)
virtual double Speed
Nopeus, jolla liikutaan.
TimeSpan SinceLastUpdate
Aika joka on kulunut viime päivityksestä.
Definition: Time.cs:24
Aivoluokka peliolioille. Voidaan käyttää tekoälyn ja tilannekohtaisten toimintamallien luomiseen peli...
Definition: Brain.cs:40
static readonly Vector Zero
Nollavektori.
Definition: Vector.cs:61
bool TurnWhileMoving
Käännytäänkö siihen suuntaan mihin liikutaan.
Yleiset liikkumiseen tarkoitetut aivot.
UnlimitedAngle TurnSpeed
Maksimikääntymisnopeus (radiaania sekunnissa)
Peliluokka reaaliaikaisille peleille.
Definition: DebugScreen.cs:10
void Move(Vector movement)
static Angle FromRadians(double radian)
Luo kulman annettujen radiaanien mukaan.
Definition: Angle.cs:316
double Radians
Palauttaa tai asettaa kulman radiaaneina.
Definition: Angle.cs:86
static Time Time
Peliaika. Sisältää tiedon siitä, kuinka kauan peliä on pelattu (Time.SinceStartOfGame) ja kuinka kaua...
Definition: Game.cs:309
Rajoittamaton kulma (asteina ja radiaaneina). Tietoja kulmasta: http://en.wikipedia.org/wiki/File:Degree-Radian_Conversion.svg
2D-vektori.
Definition: Vector.cs:56
IGameObject Owner
Aivojen haltija.
Definition: Brain.cs:69
void Move(Vector direction)
double Radians
Palauttaa tai asettaa kulman radiaaneina.