Jypeli 10
The simple game programming library
LabyrinthWandererBrain.cs
Siirry tämän tiedoston dokumentaatioon.
1using System.Collections.Generic;
2
3namespace Jypeli
4{
9 {
10 private const double defaultSpeed = 100.0;
11 private double tileSize;
12 private string labyrinthWallTag;
16 private double directionChangeTimeout = 1.0;
17
22 {
23 get
24 {
26 }
27 set
28 {
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
85 protected override void OnAdd(IGameObject newOwner)
86 {
88 destination = newOwner.Position + direction;
89 base.OnAdd(newOwner);
90 }
91
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
139 return;
140 }
141
142 }
143
145 //direction.X = Math.Round(direction.X);
146 //direction.Y = Math.Round(direction.Y);
147
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 }
175 {
176 //If stuck, let's change to opposite direction:
179 timeSinceNewDestination = time.SinceStartOfGame.TotalSeconds;
180 }
181
183 }
184 }
185 }
186}
Yleiset liikkumiseen tarkoitetut aivot.
void Move(Vector direction)
Liikuttaa aivojen hallitsemaa hahmoa
IGameObject Owner
Aivojen haltija.
Definition: Brain.cs:69
static void DoNextUpdate(Action action)
Suorittaa aliohjelman seuraavalla päivityksellä.
GameObject GetObjectAt(Vector position)
Palauttaa peliolion, joka on annetussa paikassa. Jos paikassa ei ole mitään pelioliota,...
Definition: Layers.cs:404
Pelialueella liikkuva olio. Käytä fysiikkapeleissä PhysicsObject-olioita.
Definition: Appearance.cs:34
Aivot, jotka saavat omistajansa liikkumaan labyrinttimäisessä kentässä satunnaisesti edeten.
LabyrinthWandererBrain(double tileSize, double speed)
Luo uudet aivot, jotka saavat omistajansa vaeltelemaan labyrintissä.
void SetNextDirectionAndDestination()
Asetetaan uusi suunta. Hakee olioita edestä ja sivuilta ja arpoo tyhjistä kohdista uuden suunnan....
override void OnAddToGame()
Kutsutaan, kun aivojen omistaja lisätään peliin tai omistajaksi asetetaan olio, joka on jo lisätty pe...
LabyrinthWandererBrain(double tileSize)
Luo uudet aivot, jotka saavat omistajansa vaeltelemaan labyrintissä.
LabyrinthWandererBrain(double tileSize, double speed, string wallTag)
Luo uudet aivot, jotka saavat omistajansa vaeltelemaan labyrintissä.
double DirectionChangeTimeout
Jos jäädään jumiin, kuinka pian arvotaan uusi suunta. Oletuksena 1 sekunti.
override void OnAdd(IGameObject newOwner)
Kutsutaan, kun aivot lisätään oliolle.
override void Update(Time time)
Liikuttaa omistajaa Move-metodilla. Asetetaan uusi suunta jos ollaan saavutettu annettu määränpää,...
string LabyrinthWallTag
Tagi, jolla varustetut oliot tulkitaan seiniksi. Muilla tageilla varustettuja olioita ei väistetä.
Kappale joka noudattaa fysiikan lakeja, johon voi törmätä. Vaatii että käytössä on fysiikkapeli.
Definition: Collisions.cs:7
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
override Vector?? Position
Definition: Dimensions.cs:30
Satunnaisgeneraattori. Luo satunnaisia arvoja, mm. lukuja, vektoreita sekä kulmia.
Definition: RandomGen.cs:39
static Direction NextDirection()
Palauttaa satunnaisen suunnan.
Definition: RandomGen.cs:90
Yhteinen rajapinta kaikille peliolioille.
Definition: IGameObject.cs:11
new Vector Position
Paikka.
Definition: Positional.cs:32
Suuntakulma (rajoitettu -180 ja 180 asteen välille) asteina ja radiaaneina. Tietoja kulmasta: http://...
Definition: Angle.cs:40
static readonly Angle RightAngle
Suora kulma (90 astetta).
Definition: Angle.cs:49
Vector GetVector()
Palauttaa suunnan yksikkövektorina.
Definition: Direction.cs:116
Sisältää tiedon ajasta, joka on kulunut pelin alusta ja viime päivityksestä.
Definition: Time.cs:14
TimeSpan SinceStartOfGame
Aika joka on kulunut pelin alusta.
Definition: Time.cs:35
2D-vektori.
Definition: Vector.cs:67
Vector Normalize()
Palauttaa uuden vektorin, jonka suunta pysyy samana, mutta pituudeksi tulee 1.0.
Definition: Vector.cs:217
Angle Angle
Kulma radiaaneina.
Definition: Vector.cs:372
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