Jypeli  9
The simple game programming library
Layers.cs
Siirry tämän tiedoston dokumentaatioon.
1 using System;
2 using System.Collections.Generic;
3 using System.Diagnostics;
4 using System.Linq;
5 using Jypeli.Controls;
6 
7 namespace Jypeli
8 {
9  public partial class Game : GameObjectContainer
10  {
14  public SynchronousList<Layer> Layers { get; private set; }
15 
19  public IList<Layer> StaticLayers
20  {
21  get
22  {
23 #if WINDOWS_STOREAPP
24  return Layers.FindAll( l => l.IgnoresZoom && l.RelativeTransition == Vector.Zero );
25 #else
26  return Layers.FindAll( l => l.IgnoresZoom && l.RelativeTransition == Vector.Zero ).AsReadOnly();
27 #endif
28  }
29  }
30 
34  public IList<Layer> DynamicLayers
35  {
36 #if WINDOWS_STOREAPP
37  get { return Layers.FindAll( l => !l.IgnoresZoom || l.RelativeTransition != Vector.Zero ); }
38 #else
39  get { return Layers.FindAll( l => !l.IgnoresZoom || l.RelativeTransition != Vector.Zero ).AsReadOnly(); }
40 #endif
41  }
42 
46  public int MinLayer
47  {
48  get { return Layers.FirstIndex; }
49  }
50 
54  public int MaxLayer
55  {
56  get { return Layers.LastIndex; }
57  }
58 
62  public int LayerCount
63  {
64  get { return Layers.Count; }
65  }
66 
70  internal int ObjectCount
71  {
72  get
73  {
74  return Layers.Sum<Layer>( l => l.Objects.Count );
75  }
76  }
77 
78  private void InitLayers()
79  {
80  Layers = new SynchronousList<Layer>( -3 );
81  Layers.ItemAdded += OnLayerAdded;
82  Layers.ItemRemoved += OnLayerRemoved;
83 
84  for ( int i = 0; i < 7; i++ )
85  {
86  Layers.Add( new Layer() );
87  }
88 
89  // This is the widget layer
91 
92  Layers.UpdateChanges();
93  }
94 
95  protected virtual void OnObjectAdded( IGameObject obj )
96  {
98  if ( iObj == null ) return;
99  iObj.IsAddedToGame = true;
100  iObj.OnAddedToGame();
101 
102  ControlContexted cObj = obj as ControlContexted;
103  if ( cObj != null ) ActivateObject( cObj );
104  }
105 
106  protected virtual void OnObjectRemoved( IGameObject obj )
107  {
109  if ( iObj == null ) return;
110  iObj.IsAddedToGame = false;
111  iObj.OnRemoved();
112 
113  ControlContexted cObj = obj as ControlContexted;
114  if ( cObj != null ) DeactivateObject( cObj );
115  }
116 
117  internal static void OnAddObject( IGameObject obj )
118  {
119  Debug.Assert( Instance != null );
120  Instance.OnObjectAdded( obj );
121  }
122 
123  internal static void OnRemoveObject( IGameObject obj )
124  {
125  Debug.Assert( Instance != null );
126  Instance.OnObjectRemoved( obj );
127  }
128 
129  private void OnLayerAdded( Layer l )
130  {
131  l.Objects.ItemAdded += this.OnObjectAdded;
132  l.Objects.ItemRemoved += this.OnObjectRemoved;
133  }
134 
135  private void OnLayerRemoved( Layer l )
136  {
137  l.Objects.ItemAdded -= this.OnObjectAdded;
138  l.Objects.ItemRemoved -= this.OnObjectRemoved;
139  }
140 
146  public void Add( IGameObject o )
147  {
148  if ( o.Layer != null && o.Layer.Objects.WillContain( o ) )
149  {
150  if ( o.Layer == Layers[0] )
151  {
152  throw new NotSupportedException( "Object cannot be added twice" );
153  }
154  else
155  throw new NotSupportedException( "Object cannot be added to multiple layers" );
156  }
157 
158  if ( o is Widget ) Add( o, MaxLayer );
159  else Add( o, 0 );
160  }
161 
167  public virtual void Add( IGameObject o, int layer )
168  {
169  if ( o == null ) throw new NullReferenceException( "Tried to add a null object to game" );
170  Layers[layer].Add( o );
171  }
172 
173  internal static IList<IGameObject> GetObjectsAboutToBeAdded()
174  {
175  List<IGameObject> result = new List<IGameObject>();
176 
177  foreach ( Layer layer in Game.Instance.Layers )
178  {
179  layer.GetObjectsAboutToBeAdded( result );
180  }
181 
182  return result;
183  }
184 
189  public void Add( Layer l )
190  {
191  Layers.Add( l );
192  Layers.UpdateChanges();
193  }
194 
203  public void Remove( IGameObject o )
204  {
205  if ( !o.IsAddedToGame )
206  return;
207 
208  foreach ( Layer l in Layers )
209  l.Remove( o );
210  }
211 
216  public void Remove( Layer l )
217  {
218  Layers.Remove( l );
219  Layers.UpdateChanges();
220  }
221 
225  public void ClearGameObjects()
226  {
227  foreach (var layer in Layers)
228  {
229  layer.Clear();
230  }
231 
232  // Layer.Clear on synkronoitu operaatio, joten viestinäyttöä ei ole vielä poistettu.
233  // Siksi viestinäytön palauttaminen on lisättävä operaatiojonoon pakotetusti.
234  addMessageDisplay(force: true);
235  }
236 
240  public void ResetLayers()
241  {
242  foreach (var layer in Layers)
243  {
244  layer.Clear();
245 
246  // Jos muutoksia ei päivitetä, niin taso ei ehdi oikeasti hävittää
247  // olioitaan, koska InitLayers luo uudet tasot ja sen jälkeen
248  // vanhat tasot muuttuvat roskaksi - siten esim. peliolioiden
249  // OnRemoved-metodia ei kutsuta ilman tätä ApplyChanges()-kutsua
250  layer.ApplyChanges();
251  }
252 
253  InitLayers();
254  }
255 
259  public void RemoveAllLayers()
260  {
262  Layers.Clear();
263  }
264 
265  #region GetObject methods
266  public List<GameObject> GetObjects( Predicate<GameObject> condition )
273  {
274  List<GameObject> objs = new List<GameObject>();
275 
276  for ( int i = MaxLayer; i >= MinLayer; i-- )
277  {
278  foreach ( var obj in Layers[i].Objects )
279  {
280  GameObject gobj = obj as GameObject;
281 
282  if ( gobj != null && condition( gobj ) )
283  objs.Add( gobj );
284  }
285  }
286 
287  return objs;
288  }
289 
295  public List<GameObject> GetAllObjects()
296  {
297  return GetObjects(g => true);
298  }
299 
306  public List<GameObject> GetObjectsWithTag( params string[] tags )
307  {
308  return GetObjects( o => tags.Contains<string>( o.Tag as string ) );
309  }
310 
316  public GameObject GetFirstObject( Predicate<GameObject> condition )
317  {
318  for ( int i = MaxLayer; i >= MinLayer; i-- )
319  {
320  foreach ( var obj in Layers[i].Objects )
321  {
322  GameObject gobj = obj as GameObject;
323 
324  if ( gobj != null && condition( gobj ) )
325  return gobj;
326  }
327  }
328 
329  return null;
330  }
331 
339  public List<GameObject> GetObjectsAt( Vector position )
340  {
341  return GetObjects( obj => obj.IsInside( position ) );
342  }
343 
352  public List<GameObject> GetObjectsAt( Vector position, double radius )
353  {
354  Predicate<GameObject> isInsideRadius = delegate( GameObject obj )
355  {
356  if ( IsJypeliWidget<GameObject>( obj ) ) return false;
357 
358  Vector positionUp = new Vector( position.X, position.Y + radius );
359  Vector positionDown = new Vector( position.X, position.Y - radius );
360  Vector positionLeft = new Vector( position.X - radius, position.Y );
361  Vector positionRight = new Vector( position.X + radius, position.Y );
362 
363  if ( obj.IsInside( position ) ) return true;
364  if ( obj.IsInside( positionUp ) ) return true;
365  if ( obj.IsInside( positionDown ) ) return true;
366  if ( obj.IsInside( positionLeft ) ) return true;
367  if ( obj.IsInside( positionRight ) ) return true;
368 
369  return false;
370  };
371 
372  return GetObjects( isInsideRadius );
373  }
374 
382  public GameObject GetObjectAt( Vector position )
383  {
384  return GetFirstObject( obj => obj.IsInside( position ) && !IsJypeliWidget<GameObject>( obj ) );
385  }
386 
395  public GameObject GetObjectAt( Vector position, double radius )
396  {
397  var objs = GetObjectsAt( position, radius );
398  return objs.Count > 0 ? objs[0] : null;
399  }
400 
410  public List<GameObject> GetObjectsAt( Vector position, object tag )
411  {
412  return GetObjectsAt( position ).FindAll( obj => obj.Tag == tag );
413  }
414 
424  public GameObject GetObjectAt( Vector position, object tag )
425  {
426  return GetObjectsAt( position ).Find( obj => obj.Tag == tag );
427  }
428 
439  public List<GameObject> GetObjectsAt( Vector position, object tag, double radius )
440  {
441  return GetObjectsAt( position, radius ).FindAll<GameObject>( obj => obj.Tag == tag );
442  }
443 
454  public GameObject GetObjectAt( Vector position, object tag, double radius )
455  {
456  return GetObjectsAt( position, radius ).Find( obj => obj.Tag == tag );
457  }
458 
466  public List<GameObject> GetObjectsBetween(Vector pos1, Vector pos2)
467  {
468  return GetObjects(palikka => !(palikka is Widget) && palikka.IsBetween(pos1, pos2));
469  }
470 
476  public Widget GetFirstWidget( Predicate<Widget> condition )
477  {
478  return (Widget)GetFirstObject( obj => obj is Widget && condition( (Widget)obj ) );
479  }
480 
488  public Widget GetWidgetAt( Vector position )
489  {
490  return (Widget)GetFirstObject( obj => obj is Widget && obj.IsInside( position ) && !IsJypeliWidget<IGameObject>( obj ) );
491  }
492 #endregion
493  }
494 }
Jypeli.Game.GetObjectsAt
List< GameObject > GetObjectsAt(Vector position)
Palauttaa listan peliolioista, jotka ovat annetussa paikassa. Jos paikassa ei ole mitään pelioliota,...
Definition: Layers.cs:339
Jypeli.IGameObjectInternal.OnRemoved
void OnRemoved()
Jypeli.Game.GetObjectsBetween
List< GameObject > GetObjectsBetween(Vector pos1, Vector pos2)
Palauttaa listan peliolioista, jotka ovat kahden annetun pisteen välissä. Lista ei sisällä widgettejä...
Definition: Layers.cs:466
Jypeli.Game.DynamicLayers
IList< Layer > DynamicLayers
Kerrokset, joilla olevat pelioliot liikkuvat kameran mukana.
Definition: Layers.cs:35
Jypeli.Controls.ControlContexted
Definition: ListenContext.cs:115
Jypeli.IGameObjectInternal.OnAddedToGame
void OnAddedToGame()
Jypeli.Game.StaticLayers
IList< Layer > StaticLayers
Kerrokset, joilla olevat pelioliot eivät liiku kameran mukana.
Definition: Layers.cs:20
Jypeli.Game.ObjectCount
int ObjectCount
Kuinka monta pelioliota pelissä on
Definition: Layers.cs:71
Jypeli.Vector.X
double X
Definition: Vector.cs:312
Jypeli.Game.GetObjectsAboutToBeAdded
static IList< IGameObject > GetObjectsAboutToBeAdded()
Definition: Layers.cs:173
Jypeli.Vector.Zero
static readonly Vector Zero
Nollavektori.
Definition: Vector.cs:63
Jypeli.Game.GetObjectsAt
List< GameObject > GetObjectsAt(Vector position, object tag, double radius)
Palauttaa listan peliolioista, jotka ovat annetussa paikassa tietyllä säteellä. Jos paikassa ei ole m...
Definition: Layers.cs:439
Jypeli
Definition: Automobile.cs:5
Jypeli.Game.Add
void Add(IGameObject o)
Lisää olion peliin. Tavalliset oliot tulevat automaattisesti kerrokselle 0 ja ruutuoliot päällimmäise...
Definition: Layers.cs:146
Jypeli.Game.MaxLayer
int MaxLayer
Suurin mahdollinen kerros.
Definition: Layers.cs:55
Jypeli.Game.GetAllObjects
List< GameObject > GetAllObjects()
Definition: Layers.cs:295
Jypeli.Game.GetObjectsAt
List< GameObject > GetObjectsAt(Vector position, object tag)
Palauttaa listan peliolioista, jotka ovat annetussa paikassa tietyllä säteellä. Jos paikassa ei ole m...
Definition: Layers.cs:410
Jypeli.Layer.CreateStaticLayer
static Layer CreateStaticLayer()
Luo staattisen kerroksen (ei liiku kameran mukana)
Definition: Layer.cs:131
Jypeli.IGameObject
Yhteinen rajapinta kaikille peliolioille.
Definition: IGameObject.cs:11
Jypeli.Game.GetObjectAt
GameObject GetObjectAt(Vector position, object tag, double radius)
Palauttaa peliolion, joka on annetussa paikassa tietyllä säteellä. Vain annetulla tagilla varustetut ...
Definition: Layers.cs:454
Jypeli.GameObject.IsInside
bool IsInside(Vector point)
Onko piste p tämän olion sisäpuolella.
Definition: Dimensions.cs:103
Jypeli.Game.OnObjectAdded
virtual void OnObjectAdded(IGameObject obj)
Definition: Layers.cs:95
Jypeli.Game.GetFirstWidget
Widget GetFirstWidget(Predicate< Widget > condition)
Palauttaa ensimmäisen ruutuolion joka toteuttaa ehdon (null jos mikään ei toteuta).
Definition: Layers.cs:476
Jypeli.Game.ResetLayers
void ResetLayers()
Nollaa oliokerrokset. Huom. tuhoaa kaikki pelioliot!
Definition: Layers.cs:240
Jypeli.Game.Instance
static Game Instance
Käynnissä olevan pelin pääolio.
Definition: Game.cs:90
Jypeli.Game.GetObjectAt
GameObject GetObjectAt(Vector position, double radius)
Palauttaa peliolion, joka on annetussa paikassa tietyllä säteellä. Jos paikassa ei ole mitään pelioli...
Definition: Layers.cs:395
Jypeli.Widget
Käyttöliittymän komponentti.
Definition: Appearance.cs:6
Jypeli.Game.Add
void Add(Layer l)
Lisää oliokerroksen peliin.
Definition: Layers.cs:189
Jypeli.Game.OnObjectRemoved
virtual void OnObjectRemoved(IGameObject obj)
Definition: Layers.cs:106
Jypeli.Game.GetFirstObject
GameObject GetFirstObject(Predicate< GameObject > condition)
Palauttaa ensimmäisen peliolion joka toteuttaa ehdon (null jos mikään ei toteuta).
Definition: Layers.cs:316
Jypeli.Game.Add
virtual void Add(IGameObject o, int layer)
Lisää peliolion peliin, tiettyyn kerrokseen.
Definition: Layers.cs:167
Jypeli.Game.Add
void Add(Light light)
Lisää valon peliin. Nykyisellään valoja voi olla ainoastaan yksi kappale. Toistaiseksi ei tuettu Wind...
Definition: Effects.cs:27
Jypeli.Layer.Remove
void Remove(IGameObject o)
Definition: Layer.cs:184
Jypeli.Layer
Kerros. Vastaa olioiden piirtämisestä.
Definition: Layer.cs:32
Jypeli.Game.Remove
void Remove(IGameObject o)
Poistaa olion pelistä. Jos haluat tuhota olion, kutsu mielummin olion Destroy-metodia.
Definition: Layers.cs:203
Jypeli.Game.RemoveAllLayers
void RemoveAllLayers()
Poistaa kaikki oliokerrokset. Huom. tuhoaa kaikki pelioliot!
Definition: Layers.cs:259
Jypeli.GameObject.Add
void Add(IGameObject childObject)
Lisää annetun peliolion tämän olion lapseksi. Lapsiolio liikkuu tämän olion mukana,...
Definition: ChildObjects.cs:97
Jypeli.Game.GetObjects
List< GameObject > GetObjects(Predicate< GameObject > condition)
Palauttaa listan kaikista peliolioista jotka toteuttavat ehdon. Lista on järjestetty päällimmäisestä ...
Definition: Layers.cs:272
Jypeli.Game.OnRemoveObject
static void OnRemoveObject(IGameObject obj)
Definition: Layers.cs:123
Jypeli.Controls
Definition: Controller.cs:34
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.Game.GetObjectsWithTag
List< GameObject > GetObjectsWithTag(params string[] tags)
Palauttaa listan kaikista peliolioista joilla on tietty tagi. Lista on järjestetty päällimmäisestä al...
Definition: Layers.cs:306
Jypeli.Game.OnLayerAdded
void OnLayerAdded(Layer l)
Definition: Layers.cs:129
Jypeli.IGameObject.Layer
Layer Layer
Definition: IGameObject.cs:12
Jypeli.Game.InitLayers
void InitLayers()
Definition: Layers.cs:78
Jypeli.IGameObject.IsAddedToGame
bool IsAddedToGame
Definition: IGameObject.cs:20
Jypeli.Game.DeactivateObject
void DeactivateObject(ControlContexted obj)
Definition: Controls.cs:201
Jypeli.Game.ActivateObject
void ActivateObject(ControlContexted obj)
Definition: Controls.cs:177
Jypeli.IGameObjectInternal.IsAddedToGame
new bool IsAddedToGame
Definition: IGameObject.cs:79
Jypeli.Layer.GetObjectsAboutToBeAdded
void GetObjectsAboutToBeAdded(List< IGameObject > result)
Definition: Layer.cs:577
Jypeli.Game.ClearGameObjects
void ClearGameObjects()
Tuhoaa ja poistaa pelistä kaikki pelioliot (ml. fysiikkaoliot).
Definition: Layers.cs:225
Jypeli.Game.addMessageDisplay
void addMessageDisplay(bool force=false)
Definition: Widgets.cs:11
Jypeli.Vector
2D-vektori.
Definition: Vector.cs:59
System
Definition: CFFauxAttributes.cs:29
Jypeli.Game.Remove
void Remove(Layer l)
Poistaa oliokerroksen pelistä.
Definition: Layers.cs:216
Jypeli.SynchronousList
Synkroninen lista, eli lista joka päivittyy vasta kun sen Update-metodia kutsutaan....
Definition: SynchronousList.cs:15
Jypeli.GameObject
Pelialueella liikkuva olio. Käytä fysiikkapeleissä PhysicsObject-olioita.
Definition: Appearance.cs:34
Jypeli.Game.MinLayer
int MinLayer
Pienin mahdollinen kerros.
Definition: Layers.cs:47
Jypeli.Game.GetObjectAt
GameObject GetObjectAt(Vector position, object tag)
Palauttaa peliolion, joka on annetussa paikassa. Vain annetulla tagilla varustetut oliot huomioidaan....
Definition: Layers.cs:424
Jypeli.Game.LayerCount
int LayerCount
Kerrosten määrä.
Definition: Layers.cs:63
Jypeli.Game.GetObjectsAt
List< GameObject > GetObjectsAt(Vector position, double radius)
Palauttaa listan peliolioista, jotka ovat annetussa paikassa tietyllä säteellä. Jos paikassa ei ole m...
Definition: Layers.cs:352
Jypeli.Game.Layers
SynchronousList< Layer > Layers
Kerrokset, joilla pelioliot viihtyvät.
Definition: Layers.cs:14
Jypeli.Game
Definition: Content.cs:46
Jypeli.Game.GetWidgetAt
Widget GetWidgetAt(Vector position)
Palauttaa ruutuolion, joka on annetussa paikassa. Jos paikassa ei ole mitään oliota,...
Definition: Layers.cs:488
Jypeli.IGameObjectInternal
Jypelin sisäiset metodit ja propertyt joihin käyttäjän ei tarvitse päästä käsiksi kuuluvat tähän luok...
Definition: IGameObject.cs:75
Jypeli.Game.OnAddObject
static void OnAddObject(IGameObject obj)
Definition: Layers.cs:117
Jypeli.Vector.Y
double Y
Definition: Vector.cs:313
Jypeli.Game.OnLayerRemoved
void OnLayerRemoved(Layer l)
Definition: Layers.cs:135
Jypeli.Layer.Objects
SynchronousList< IGameObject > Objects
Definition: Layer.cs:76