Jypeli 10
The simple game programming library
Layers.cs
Siirry tämän tiedoston dokumentaatioon.
1using System;
2using System.Collections.Generic;
3using System.Diagnostics;
4using System.Linq;
5using Jypeli.Controls;
6
7namespace 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 {
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
99 protected virtual void OnObjectAdded( IGameObject obj )
100 {
102 if ( iObj == null ) return;
103 iObj.IsAddedToGame = true;
104 iObj.OnAddedToGame();
105
107 if ( cObj != null ) ActivateObject( cObj );
108 }
109
114 protected virtual void OnObjectRemoved( IGameObject obj )
115 {
117 if ( iObj == null ) return;
118 iObj.IsAddedToGame = false;
119 iObj.OnRemoved();
120
122 if ( cObj != null ) DeactivateObject( cObj );
123 }
124
125 internal static void OnAddObject( IGameObject obj )
126 {
127 Debug.Assert( Instance != null );
128 Instance.OnObjectAdded( obj );
129 }
130
131 internal static void OnRemoveObject( IGameObject obj )
132 {
133 Debug.Assert( Instance != null );
135 }
136
137 private void OnLayerAdded( Layer l )
138 {
139 l.Objects.ItemAdded += this.OnObjectAdded;
140 l.Objects.ItemRemoved += this.OnObjectRemoved;
141 }
142
143 private void OnLayerRemoved( Layer l )
144 {
145 l.Objects.ItemAdded -= this.OnObjectAdded;
146 l.Objects.ItemRemoved -= this.OnObjectRemoved;
147 }
148
154 public void Add( IGameObject o )
155 {
156 if ( o.Layer != null && o.Layer.Objects.WillContain( o ) )
157 {
158 if ( o.Layer == Layers[0] )
159 {
160 throw new NotSupportedException( "Object cannot be added twice" );
161 }
162 else
163 throw new NotSupportedException( "Object cannot be added to multiple layers" );
164 }
165
166 if ( o is Widget ) Add( o, MaxLayer );
167 else Add( o, 0 );
168 }
169
175 public virtual void Add( IGameObject o, int layer )
176 {
177 if ( o == null ) throw new NullReferenceException( "Tried to add a null object to game" );
178 Layers[layer].Add( o );
179 }
180
181 internal static IList<IGameObject> GetObjectsAboutToBeAdded()
182 {
183 List<IGameObject> result = new List<IGameObject>();
184
185 foreach ( Layer layer in Game.Instance.Layers )
186 {
187 layer.GetObjectsAboutToBeAdded( result );
188 }
189
190 return result;
191 }
192
197 public void Add( Layer l )
198 {
199 Layers.Add( l );
200 Layers.UpdateChanges();
201 }
202
211 public void Remove( IGameObject o )
212 {
213 if ( !o.IsAddedToGame )
214 return;
215
216 foreach ( Layer l in Layers )
217 l.Remove( o );
218 }
219
224 public void Remove( Layer l )
225 {
226 Layers.Remove( l );
227 Layers.UpdateChanges();
228 }
229
233 public void ClearGameObjects()
234 {
235 foreach (var layer in Layers)
236 {
237 layer.Clear();
238 }
239
240 // Layer.Clear on synkronoitu operaatio, joten viestinäyttöä ei ole vielä poistettu.
241 // Siksi viestinäytön palauttaminen on lisättävä operaatiojonoon pakotetusti.
242 addMessageDisplay(force: true);
243 }
244
248 public void ResetLayers()
249 {
250 foreach (var layer in Layers)
251 {
252 layer.Clear();
253
254 // Jos muutoksia ei päivitetä, niin taso ei ehdi oikeasti hävittää
255 // olioitaan, koska InitLayers luo uudet tasot ja sen jälkeen
256 // vanhat tasot muuttuvat roskaksi - siten esim. peliolioiden
257 // OnRemoved-metodia ei kutsuta ilman tätä ApplyChanges()-kutsua
258 layer.ApplyChanges();
259 }
260
261 InitLayers();
262 }
263
267 public void RemoveAllLayers()
268 {
270 Layers.Clear();
271 }
272
279 {
280 Vector transformed = Camera.WorldToScreen(g.Position, g.Layer);
281 return transformed.X - g.Width * Camera.ZoomFactor < Screen.Size.X / 2 &&
282 transformed.X + g.Width * Camera.ZoomFactor > -Screen.Size.X / 2 &&
283 transformed.Y - g.Height * Camera.ZoomFactor < Screen.Size.Y / 2 &&
284 transformed.Y + g.Height * Camera.ZoomFactor > -Screen.Size.Y / 2;
285 }
286
287 #region GetObject methods
294 public List<GameObject> GetObjects( Predicate<GameObject> condition )
295 {
296 List<GameObject> objs = new List<GameObject>();
297
298 for ( int i = MaxLayer; i >= MinLayer; i-- )
299 {
300 foreach ( var obj in Layers[i].Objects )
301 {
302 GameObject gobj = obj as GameObject;
303
304 if ( gobj != null && condition( gobj ) )
305 objs.Add( gobj );
306 }
307 }
308
309 return objs;
310 }
311
317 public List<GameObject> GetAllObjects()
318 {
319 return GetObjects(g => true);
320 }
321
328 public List<GameObject> GetObjectsWithTag( params string[] tags )
329 {
330 return GetObjects( o => tags.Contains<string>( o.Tag as string ) );
331 }
332
338 public GameObject GetFirstObject( Predicate<GameObject> condition )
339 {
340 for ( int i = MaxLayer; i >= MinLayer; i-- )
341 {
342 foreach ( var obj in Layers[i].Objects )
343 {
344 GameObject gobj = obj as GameObject;
345
346 if ( gobj != null && condition( gobj ) )
347 return gobj;
348 }
349 }
350
351 return null;
352 }
353
361 public List<GameObject> GetObjectsAt( Vector position )
362 {
363 return GetObjects( obj => obj.IsInside( position ) );
364 }
365
374 public List<GameObject> GetObjectsAt( Vector position, double radius )
375 {
376 Predicate<GameObject> isInsideRadius = delegate( GameObject obj )
377 {
378 if ( IsJypeliWidget<GameObject>( obj ) ) return false;
379
380 Vector positionUp = new Vector( position.X, position.Y + radius );
381 Vector positionDown = new Vector( position.X, position.Y - radius );
382 Vector positionLeft = new Vector( position.X - radius, position.Y );
383 Vector positionRight = new Vector( position.X + radius, position.Y );
384
385 if ( obj.IsInside( position ) ) return true;
386 if ( obj.IsInside( positionUp ) ) return true;
387 if ( obj.IsInside( positionDown ) ) return true;
388 if ( obj.IsInside( positionLeft ) ) return true;
389 if ( obj.IsInside( positionRight ) ) return true;
390
391 return false;
392 };
393
394 return GetObjects( isInsideRadius );
395 }
396
404 public GameObject GetObjectAt( Vector position )
405 {
406 return GetFirstObject( obj => obj.IsInside( position ) && !IsJypeliWidget<GameObject>( obj ) );
407 }
408
417 public GameObject GetObjectAt( Vector position, double radius )
418 {
419 var objs = GetObjectsAt( position, radius );
420 return objs.Count > 0 ? objs[0] : null;
421 }
422
432 public List<GameObject> GetObjectsAt( Vector position, object tag )
433 {
434 return GetObjectsAt( position ).FindAll( obj => obj.Tag == tag );
435 }
436
446 public GameObject GetObjectAt( Vector position, object tag )
447 {
448 return GetObjectsAt( position ).Find( obj => obj.Tag == tag );
449 }
450
461 public List<GameObject> GetObjectsAt( Vector position, object tag, double radius )
462 {
463 return GetObjectsAt( position, radius ).FindAll<GameObject>( obj => obj.Tag == tag );
464 }
465
476 public GameObject GetObjectAt( Vector position, object tag, double radius )
477 {
478 return GetObjectsAt( position, radius ).Find( obj => obj.Tag == tag );
479 }
480
488 public List<GameObject> GetObjectsBetween(Vector pos1, Vector pos2)
489 {
490 return GetObjects(palikka => !(palikka is Widget) && palikka.IsBetween(pos1, pos2));
491 }
492
498 public Widget GetFirstWidget( Predicate<Widget> condition )
499 {
500 return (Widget)GetFirstObject( obj => obj is Widget && condition( (Widget)obj ) );
501 }
502
510 public Widget GetWidgetAt( Vector position )
511 {
512 return (Widget)GetFirstObject( obj => obj is Widget && obj.IsInside( position ) && !IsJypeliWidget<IGameObject>( obj ) );
513 }
514#endregion
515 }
516}
Kamera. Määrittää mikä osa pelitasosta on kerralla näkyvissä.
Definition: Camera.cs:40
double ZoomFactor
Kameran zoomauskerroin. Oletuksena 1.0. Mitä suurempi zoomauskerroin, sitä lähempänä kamera on (esim ...
Definition: Camera.cs:99
Vector WorldToScreen(Vector point)
Muuntaa annetun pisteen maailmankoordinaateista ruutukoordinaatteihin.
Definition: Camera.cs:175
static void OnRemoveObject(IGameObject obj)
Definition: Layers.cs:131
bool IsObjectOnScreen(IGameObject g)
Kertoo onko objekti ruudulla näkyvällä alueella.
Definition: Layers.cs:278
void Add(Layer l)
Lisää oliokerroksen peliin.
Definition: Layers.cs:197
IList< Layer > DynamicLayers
Kerrokset, joilla olevat pelioliot liikkuvat kameran mukana.
Definition: Layers.cs:35
virtual void OnObjectAdded(IGameObject obj)
Kun olio lisätään kerrokselle
Definition: Layers.cs:99
void ClearGameObjects()
Tuhoaa ja poistaa pelistä kaikki pelioliot (ml. fysiikkaoliot).
Definition: Layers.cs:233
void Add(IGameObject o)
Lisää olion peliin. Tavalliset oliot tulevat automaattisesti kerrokselle 0 ja ruutuoliot päällimmäise...
Definition: Layers.cs:154
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:488
int MinLayer
Pienin mahdollinen kerros.
Definition: Layers.cs:47
int MaxLayer
Suurin mahdollinen kerros.
Definition: Layers.cs:55
void RemoveAllLayers()
Poistaa kaikki oliokerrokset. Huom. tuhoaa kaikki pelioliot!
Definition: Layers.cs:267
Widget GetFirstWidget(Predicate< Widget > condition)
Palauttaa ensimmäisen ruutuolion joka toteuttaa ehdon (null jos mikään ei toteuta).
Definition: Layers.cs:498
GameObject GetObjectAt(Vector position, object tag, double radius)
Palauttaa peliolion, joka on annetussa paikassa tietyllä säteellä. Vain annetulla tagilla varustetut ...
Definition: Layers.cs:476
void addMessageDisplay(bool force=false)
Definition: Widgets.cs:11
void ActivateObject(ControlContexted obj)
Definition: Controls.cs:180
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:328
Widget GetWidgetAt(Vector position)
Palauttaa ruutuolion, joka on annetussa paikassa. Jos paikassa ei ole mitään oliota,...
Definition: Layers.cs:510
void OnLayerAdded(Layer l)
Definition: Layers.cs:137
List< GameObject > GetObjects(Predicate< GameObject > condition)
Palauttaa listan kaikista peliolioista jotka toteuttavat ehdon. Lista on järjestetty päällimmäisestä ...
Definition: Layers.cs:294
IList< Layer > StaticLayers
Kerrokset, joilla olevat pelioliot eivät liiku kameran mukana.
Definition: Layers.cs:20
virtual void OnObjectRemoved(IGameObject obj)
Kun olio poistetaan kerrokselta
Definition: Layers.cs:114
virtual void Add(IGameObject o, int layer)
Lisää peliolion peliin, tiettyyn kerrokseen.
Definition: Layers.cs:175
static void OnAddObject(IGameObject obj)
Definition: Layers.cs:125
GameObject GetFirstObject(Predicate< GameObject > condition)
Palauttaa ensimmäisen peliolion joka toteuttaa ehdon (null jos mikään ei toteuta).
Definition: Layers.cs:338
GameObject GetObjectAt(Vector position)
Palauttaa peliolion, joka on annetussa paikassa. Jos paikassa ei ole mitään pelioliota,...
Definition: Layers.cs:404
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:461
void Add(Light light)
Lisää valon peliin. Nykyisellään valoja voi olla ainoastaan yksi kappale. Toistaiseksi ei tuettu Wind...
Definition: Effects.cs:27
void OnLayerRemoved(Layer l)
Definition: Layers.cs:143
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:417
GameObject GetObjectAt(Vector position, object tag)
Palauttaa peliolion, joka on annetussa paikassa. Vain annetulla tagilla varustetut oliot huomioidaan....
Definition: Layers.cs:446
void DeactivateObject(ControlContexted obj)
Definition: Controls.cs:204
SynchronousList< Layer > Layers
Kerrokset, joilla pelioliot viihtyvät.
Definition: Layers.cs:14
List< GameObject > GetObjectsAt(Vector position)
Palauttaa listan peliolioista, jotka ovat annetussa paikassa. Jos paikassa ei ole mitään pelioliota,...
Definition: Layers.cs:361
int ObjectCount
Kuinka monta pelioliota pelissä on
Definition: Layers.cs:71
static Game Instance
Käynnissä olevan pelin pääolio.
Definition: Game.cs:96
static IList< IGameObject > GetObjectsAboutToBeAdded()
Definition: Layers.cs:181
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:374
void InitLayers()
Definition: Layers.cs:78
static ScreenView Screen
Näytön dimensiot, eli koko ja reunat.
Definition: Graphics.cs:90
void Remove(IGameObject o)
Poistaa olion pelistä. Jos haluat tuhota olion, kutsu mielummin olion Destroy-metodia.
Definition: Layers.cs:211
void ResetLayers()
Nollaa oliokerrokset. Huom. tuhoaa kaikki pelioliot!
Definition: Layers.cs:248
void Remove(Layer l)
Poistaa oliokerroksen pelistä.
Definition: Layers.cs:224
List< GameObject > GetAllObjects()
Definition: Layers.cs:317
int LayerCount
Kerrosten määrä.
Definition: Layers.cs:63
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:432
Pelialueella liikkuva olio. Käytä fysiikkapeleissä PhysicsObject-olioita.
Definition: Appearance.cs:34
bool IsInside(Vector point)
Onko piste p tämän olion sisäpuolella.
Definition: Dimensions.cs:155
void Add(IGameObject childObject)
Lisää annetun peliolion tämän olion lapseksi. Lapsiolio liikkuu tämän olion mukana.
Definition: ChildObjects.cs:98
object Tag
Vapaasti asetettava muuttuja.
Kerros. Vastaa olioiden piirtämisestä.
Definition: Layer.cs:32
void Remove(IGameObject o)
Definition: Layer.cs:190
void ApplyChanges()
Instantly applies changes made to the layer's objects.
Definition: Layer.cs:210
void Clear()
Tyhjentää kerroksen olioista
Definition: Layer.cs:198
static Layer CreateStaticLayer()
Luo staattisen kerroksen (ei liiku kameran mukana)
Definition: Layer.cs:141
SynchronousList< IGameObject > Objects
Kerroksen oliot
Definition: Layer.cs:79
void GetObjectsAboutToBeAdded(List< IGameObject > result)
Definition: Layer.cs:576
Vector Size
Näytön koko vektorina.
Definition: View.cs:248
Synkroninen lista, eli lista joka päivittyy vasta kun sen Update-metodia kutsutaan....
Käyttöliittymän komponentti.
Definition: Appearance.cs:6
new double Width
Leveys.
Definition: Dimensional.cs:77
new double Height
Korkeus.
Definition: Dimensional.cs:82
Yhteinen rajapinta kaikille peliolioille.
Definition: IGameObject.cs:11
Jypelin sisäiset metodit ja propertyt joihin käyttäjän ei tarvitse päästä käsiksi kuuluvat tÃ...
Definition: IGameObject.cs:79
new Vector Position
Paikka.
Definition: Positional.cs:32
2D-vektori.
Definition: Vector.cs:67
double Y
Vektorin Y-komponentti
Definition: Vector.cs:339
static readonly Vector Zero
Nollavektori.
Definition: Vector.cs:71
double X
Vektorin X-komponentti.
Definition: Vector.cs:334