Jypeli  9
The simple game programming library
LabyrinthWandererBrain.cs
Siirry tämän tiedoston dokumentaatioon.
1 using System.Collections.Generic;
2 
3 namespace Jypeli
4 {
9  {
10  private const double defaultSpeed = 100.0;
11  private double tileSize;
12  private string labyrinthWallTag;
13  private Vector direction;
15  private double timeSinceNewDestination;
16  private double directionChangeTimeout = 1.0;
17 
21  public double DirectionChangeTimeout
22  {
23  get
24  {
26  }
27  set
28  {
29  directionChangeTimeout = value;
30  }
31  }
32 
36  public string LabyrinthWallTag
37  {
38  get
39  {
40  return labyrinthWallTag;
41  }
42  set
43  {
44  labyrinthWallTag = value;
45  }
46  }
47 
48 
54  : base(defaultSpeed)
55  {
56  this.tileSize = tileSize;
57  }
58 
59 
65  public LabyrinthWandererBrain(double tileSize, double speed)
66  : base(speed)
67  {
68  this.tileSize = tileSize;
69  }
70 
77  public LabyrinthWandererBrain(double tileSize, double speed, string wallTag)
78  :base(speed)
79  {
80  this.tileSize = tileSize;
81  labyrinthWallTag = wallTag;
82  }
83 
84 
85  protected override void OnAdd(IGameObject newOwner)
86  {
88  destination = newOwner.Position + direction;
89  base.OnAdd(newOwner);
90  }
91 
92 
93  protected override void OnAddToGame()
94  {
96  base.OnAddToGame();
97  }
98 
104  {
105  PhysicsObject owner = this.Owner as PhysicsObject;
106 
107  if (owner == null || owner.Game == null) return;
108 
109  Game game = owner.Game;
110  List<Vector> directions = new List<Vector>{direction,
113 
114  GameObject tile;
115  double radius = tileSize / 5;
116 
117  while (directions.Count > 0)
118  {
119  Vector directionCandidate = RandomGen.SelectOne<Vector>(directions);
120  directions.Remove(directionCandidate);
121 
122  if (labyrinthWallTag != null)
123  {
124  tile = game.GetObjectAt(owner.Position + directionCandidate, labyrinthWallTag, radius);
125  }
126  else
127  {
128  tile = game.GetObjectAt(owner.Position + directionCandidate, radius);
129  }
130 
131  //PhysicsObjects only!
132  if (tile == null || tile as PhysicsObject == null || (owner.CollisionIgnoreGroup != 0 && (tile as PhysicsObject).CollisionIgnoreGroup == owner.CollisionIgnoreGroup))
133  {
134  direction = directionCandidate.Normalize() * tileSize;
135  //direction.X = Math.Round(direction.X);
136  //direction.Y = Math.Round(direction.Y);
137 
138  destination = owner.Position + direction;
139  return;
140  }
141 
142  }
143 
145  //direction.X = Math.Round(direction.X);
146  //direction.Y = Math.Round(direction.Y);
147 
148  destination = owner.Position + direction;
149  }
150 
151 
157  protected override void Update(Time time)
158  {
159  base.Update(time);
160 
161  if (Owner != null)
162  {
163  Vector distanceToTravel = destination - Owner.Position;
164  if (distanceToTravel.Magnitude < 0.1)
165  {
167  timeSinceNewDestination = time.SinceStartOfGame.TotalSeconds;
168  }
169  else if (distanceToTravel.Magnitude > tileSize)
170  {
172  timeSinceNewDestination = time.SinceStartOfGame.TotalSeconds;
173  }
174  else if (time.SinceStartOfGame.TotalSeconds - timeSinceNewDestination > DirectionChangeTimeout)
175  {
176  //If stuck, let's change to opposite direction:
179  timeSinceNewDestination = time.SinceStartOfGame.TotalSeconds;
180  }
181 
183  }
184  }
185  }
186 }
Jypeli.LabyrinthWandererBrain.DirectionChangeTimeout
double DirectionChangeTimeout
Jos jäädään jumiin, kuinka pian arvotaan uusi suunta. Oletuksena 1 sekunti.
Definition: LabyrinthWandererBrain.cs:22
Jypeli.LabyrinthWandererBrain.direction
Vector direction
Definition: LabyrinthWandererBrain.cs:13
Jypeli.LabyrinthWandererBrain.timeSinceNewDestination
double timeSinceNewDestination
Definition: LabyrinthWandererBrain.cs:15
Jypeli.LabyrinthWandererBrain.OnAdd
override void OnAdd(IGameObject newOwner)
Kutsutaan, kun aivot lisätään oliolle.
Definition: LabyrinthWandererBrain.cs:85
Jypeli.Brain.Owner
IGameObject Owner
Aivojen haltija.
Definition: Brain.cs:69
Jypeli.Direction.GetVector
Vector GetVector()
Palauttaa suunnan yksikkövektorina.
Definition: Direction.cs:116
Jypeli
Definition: Automobile.cs:5
Jypeli.LabyrinthWandererBrain.tileSize
double tileSize
Definition: LabyrinthWandererBrain.cs:11
Jypeli.IGameObject
Yhteinen rajapinta kaikille peliolioille.
Definition: IGameObject.cs:11
Jypeli.LabyrinthWandererBrain.LabyrinthWallTag
string LabyrinthWallTag
Tagi, jolla varustetut oliot tulkitaan seiniksi. Muilla tageilla varustettuja olioita ei väistetä.
Definition: LabyrinthWandererBrain.cs:37
Jypeli.Game.DoNextUpdate
static void DoNextUpdate(Action action)
Suorittaa aliohjelman seuraavalla päivityksellä.
Definition: DelayedActions.cs:65
Jypeli.PhysicsObject.CollisionIgnoreGroup
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:28
Jypeli.RandomGen
Satunnaisgeneraattori. Luo satunnaisia arvoja, mm. lukuja, vektoreita sekä kulmia.
Definition: RandomGen.cs:39
Jypeli.LabyrinthWandererBrain.defaultSpeed
const double defaultSpeed
Definition: LabyrinthWandererBrain.cs:10
Jypeli.LabyrinthWandererBrain.LabyrinthWandererBrain
LabyrinthWandererBrain(double tileSize)
Luo uudet aivot, jotka saavat omistajansa vaeltelemaan labyrintissä.
Definition: LabyrinthWandererBrain.cs:53
Jypeli.LabyrinthWandererBrain.Update
override void Update(Time time)
Liikuttaa omistajaa Move-metodilla. Asetetaan uusi suunta jos ollaan saavutettu annettu määränpää,...
Definition: LabyrinthWandererBrain.cs:157
Jypeli.LabyrinthWandererBrain.OnAddToGame
override void OnAddToGame()
Kutsutaan, kun aivojen omistaja lisätään peliin tai omistajaksi asetetaan olio, joka on jo lisätty pe...
Definition: LabyrinthWandererBrain.cs:93
Jypeli.LabyrinthWandererBrain.LabyrinthWandererBrain
LabyrinthWandererBrain(double tileSize, double speed, string wallTag)
Luo uudet aivot, jotka saavat omistajansa vaeltelemaan labyrintissä.
Definition: LabyrinthWandererBrain.cs:77
Jypeli.Time
Sisältää tiedon ajasta, joka on kulunut pelin alusta ja viime päivityksestä.
Definition: Time.cs:14
Jypeli.Game.GetObjectAt
GameObject GetObjectAt(Vector position)
Palauttaa peliolion, joka on annetussa paikassa. Jos paikassa ei ole mitään pelioliota,...
Definition: Layers.cs:382
Jypeli.Vector.Angle
Angle Angle
Kulma radiaaneina.
Definition: Vector.cs:346
Jypeli.PositionalRW.Position
new Vector Position
Paikka.
Definition: Positional.cs:32
Jypeli.PhysicsObject.Position
override Vector Position
Definition: Dimensions.cs:27
Jypeli.AbstractMoverBrain
Yleiset liikkumiseen tarkoitetut aivot.
Definition: AbstractMoverBrain.cs:11
Jypeli.Time.SinceStartOfGame
TimeSpan SinceStartOfGame
Aika joka on kulunut pelin alusta.
Definition: Time.cs:32
Jypeli.Vector.FromLengthAndAngle
static Vector FromLengthAndAngle(double length, double angle)
Luo vektorin pituuden ja kulman perusteella.
Definition: Vector.cs:106
Jypeli.LabyrinthWandererBrain.labyrinthWallTag
string labyrinthWallTag
Definition: LabyrinthWandererBrain.cs:12
Jypeli.Vector.Magnitude
double Magnitude
Vektorin pituus.
Definition: Vector.cs:319
Jypeli.Vector
2D-vektori.
Definition: Vector.cs:59
System
Definition: CFFauxAttributes.cs:29
Jypeli.Angle.RightAngle
static readonly Angle RightAngle
Suora kulma (90 astetta).
Definition: Angle.cs:49
Jypeli.PhysicsObject
Definition: Collisions.cs:6
Jypeli.RandomGen.NextDirection
static Direction NextDirection()
Palauttaa satunnaisen suunnan.
Definition: RandomGen.cs:90
Jypeli.LabyrinthWandererBrain
Aivot, jotka saavat omistajansa liikkumaan labyrinttimäisessä kentässä satunnaisesti edeten.
Definition: LabyrinthWandererBrain.cs:9
Jypeli.LabyrinthWandererBrain.destination
Vector destination
Definition: LabyrinthWandererBrain.cs:14
Jypeli.GameObject
Pelialueella liikkuva olio. Käytä fysiikkapeleissä PhysicsObject-olioita.
Definition: Appearance.cs:34
Jypeli.LabyrinthWandererBrain.SetNextDirectionAndDestination
void SetNextDirectionAndDestination()
Asetetaan uusi suunta. Hakee olioita edestä ja sivuilta ja arpoo tyhjistä kohdista uuden suunnan....
Definition: LabyrinthWandererBrain.cs:103
Jypeli.Game
Definition: Content.cs:46
Jypeli.Vector.Normalize
Vector Normalize()
Palauttaa uuden vektorin, jonka suunta pysyy samana, mutta pituudeksi tulee 1.0.
Definition: Vector.cs:198
Jypeli.LabyrinthWandererBrain.LabyrinthWandererBrain
LabyrinthWandererBrain(double tileSize, double speed)
Luo uudet aivot, jotka saavat omistajansa vaeltelemaan labyrintissä.
Definition: LabyrinthWandererBrain.cs:65
Jypeli.LabyrinthWandererBrain.directionChangeTimeout
double directionChangeTimeout
Definition: LabyrinthWandererBrain.cs:16
Jypeli.Angle
Suuntakulma (rajoitettu -180 ja 180 asteen välille) asteina ja radiaaneina. Tietoja kulmasta: http://...
Definition: Angle.cs:40
Jypeli.AbstractMoverBrain.Move
void Move(Vector direction)
Definition: AbstractMoverBrain.cs:74