Jypeli  5
The simple game programming library
LabyrinthWandererBrain.cs
Siirry tämän tiedoston dokumentaatioon.
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 
6 namespace Jypeli
7 {
12  {
13  private const double defaultSpeed = 100.0;
14  private double tileSize;
15  private string labyrinthWallTag;
16  private Vector direction;
17  private Vector destination;
18  private double timeSinceNewDestination;
19  private double directionChangeTimeout = 1.0;
20 
24  public double DirectionChangeTimeout
25  {
26  get
27  {
28  return directionChangeTimeout;
29  }
30  set
31  {
32  directionChangeTimeout = value;
33  }
34  }
35 
39  public string LabyrinthWallTag
40  {
41  get
42  {
43  return labyrinthWallTag;
44  }
45  set
46  {
47  labyrinthWallTag = value;
48  }
49  }
50 
51 
56  public LabyrinthWandererBrain(double tileSize)
57  : base(defaultSpeed)
58  {
59  this.tileSize = tileSize;
60  }
61 
62 
68  public LabyrinthWandererBrain(double tileSize, double speed)
69  : base(speed)
70  {
71  this.tileSize = tileSize;
72  }
73 
80  public LabyrinthWandererBrain(double tileSize, double speed, string wallTag)
81  :base(speed)
82  {
83  this.tileSize = tileSize;
84  labyrinthWallTag = wallTag;
85  }
86 
87 
88  protected override void OnAdd(IGameObject newOwner)
89  {
90  direction = RandomGen.NextDirection().GetVector() * tileSize;
91  destination = newOwner.Position + direction;
92  base.OnAdd(newOwner);
93  }
94 
95 
96  protected override void OnAddToGame()
97  {
98  Game.DoNextUpdate(SetNextDirectionAndDestination);
99  base.OnAddToGame();
100  }
101 
106  private void SetNextDirectionAndDestination()
107  {
108  PhysicsObject owner = this.Owner as PhysicsObject;
109 
110  if (owner == null || owner.Game == null) return;
111 
112  Game game = owner.Game;
113  List<Vector> directions = new List<Vector>{direction,
114  Vector.FromLengthAndAngle(tileSize, direction.Angle - Angle.RightAngle),
115  Vector.FromLengthAndAngle(tileSize, direction.Angle + Angle.RightAngle)};
116 
117  GameObject tile;
118  double radius = tileSize / 5;
119 
120  while (directions.Count > 0)
121  {
122  Vector directionCandidate = RandomGen.SelectOne<Vector>(directions);
123  directions.Remove(directionCandidate);
124 
125  if (labyrinthWallTag != null)
126  {
127  tile = game.GetObjectAt(owner.Position + directionCandidate, labyrinthWallTag, radius);
128  }
129  else
130  {
131  tile = game.GetObjectAt(owner.Position + directionCandidate, radius);
132  }
133 
134  //PhysicsObjects only!
135  if (tile == null || tile as PhysicsObject == null || (owner.CollisionIgnoreGroup != 0 && (tile as PhysicsObject).CollisionIgnoreGroup == owner.CollisionIgnoreGroup))
136  {
137  direction = directionCandidate.Normalize() * tileSize;
138  //direction.X = Math.Round(direction.X);
139  //direction.Y = Math.Round(direction.Y);
140 
141  destination = owner.Position + direction;
142  return;
143  }
144 
145  }
146 
147  direction = -direction.Normalize() * tileSize;
148  //direction.X = Math.Round(direction.X);
149  //direction.Y = Math.Round(direction.Y);
150 
151  destination = owner.Position + direction;
152  }
153 
154 
160  protected override void Update(Time time)
161  {
162  base.Update(time);
163 
164  if (Owner != null)
165  {
166  Vector distanceToTravel = destination - Owner.Position;
167  if (distanceToTravel.Magnitude < 0.1)
168  {
169  SetNextDirectionAndDestination();
170  timeSinceNewDestination = time.SinceStartOfGame.TotalSeconds;
171  }
172  else if (distanceToTravel.Magnitude > tileSize)
173  {
174  SetNextDirectionAndDestination();
175  timeSinceNewDestination = time.SinceStartOfGame.TotalSeconds;
176  }
177  else if (time.SinceStartOfGame.TotalSeconds - timeSinceNewDestination > DirectionChangeTimeout)
178  {
179  //If stuck, let's change to opposite direction:
180  direction = -direction.Normalize() * tileSize;
181  SetNextDirectionAndDestination();
182  timeSinceNewDestination = time.SinceStartOfGame.TotalSeconds;
183  }
184 
185  Move(direction.Angle);
186  }
187  }
188  }
189 }
static void DoNextUpdate(Action action)
Suorittaa aliohjelman seuraavalla päivityksellä.
Definition: Game.cs:642
static Direction NextDirection()
Palauttaa satunnaisen suunnan.
Definition: RandomGen.cs:99
double Magnitude
Vektorin pituus.
Definition: Vector.cs:281
override void OnAddToGame()
Kutsutaan, kun aivojen omistaja lisätään peliin tai omistajaksi asetetaan olio, joka on jo lisätty pe...
Angle Angle
Kulma radiaaneina.
Definition: Vector.cs:308
Game Game
Peli, johon olio on lisätty. null, jos oliota ei ole lisätty peliin.
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
Suuntakulma (rajoitettu -180 ja 180 asteen välille) asteina ja radiaaneina. Tietoja kulmasta: http://...
Definition: Angle.cs:40
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
LabyrinthWandererBrain(double tileSize, double speed)
Luo uudet aivot, jotka saavat omistajansa vaeltelemaan labyrintissä.
Satunnaisgeneraattori. Luo satunnaisia arvoja, mm. lukuja, vektoreita sekä kulmia.
Definition: RandomGen.cs:39
TimeSpan SinceStartOfGame
Aika joka on kulunut pelin alusta.
Definition: Time.cs:32
Peliolio, joka noudattaa fysiikkamoottorin määräämiä fysiikan lakeja. Voidaan kuitenkin myös laittaa ...
Definition: Coefficients.cs:36
double DirectionChangeTimeout
Jos jäädään jumiin, kuinka pian arvotaan uusi suunta. Oletuksena 1 sekunti.
Sisältää tiedon ajasta, joka on kulunut pelin alusta ja viime päivityksestä.
Definition: Time.cs:13
static readonly Angle RightAngle
Suora kulma (90 astetta).
Definition: Angle.cs:50
Yleiset liikkumiseen tarkoitetut aivot.
Aivot, jotka saavat omistajansa liikkumaan labyrinttimäisessä kentässä satunnaisesti edeten...
Peliluokka reaaliaikaisille peleille.
Definition: DebugScreen.cs:10
override void OnAdd(IGameObject newOwner)
Kutsutaan, kun aivot lisätään oliolle.
LabyrinthWandererBrain(double tileSize)
Luo uudet aivot, jotka saavat omistajansa vaeltelemaan labyrintissä.
Vector GetVector()
Definition: Direction.cs:116
LabyrinthWandererBrain(double tileSize, double speed, string wallTag)
Luo uudet aivot, jotka saavat omistajansa vaeltelemaan labyrintissä.
Yhteinen rajapinta kaikille peliolioille.
Definition: IGameObject.cs:14
override Vector Position
Olion paikka koordinaatistossa. Käsittää sekä X- että Y-koordinaatin.
Definition: Dimensions.cs:49
2D-vektori.
Definition: Vector.cs:56
IGameObject Owner
Aivojen haltija.
Definition: Brain.cs:69
Pelialueella liikkuva olio. Käytä fysiikkapeleissä PhysicsObject-olioita.
Definition: __GameObject.cs:54
void Move(Vector direction)
string LabyrinthWallTag
Tagi, jolla varustetut oliot tulkitaan seiniksi. Muilla tageilla varustettuja olioita ei väistetä...
Vector Normalize()
Palauttaa uuden vektorin, jonka suunta pysyy samana, mutta pituudeksi tulee 1.0.
Definition: Vector.cs:183
override void Update(Time time)
Liikuttaa omistajaa Move-metodilla. Asetetaan uusi suunta jos ollaan saavutettu annettu määränpää...