Jypeli  5
The simple game programming library
GameObject.cs
Siirry tämän tiedoston dokumentaatioon.
1 #region MIT License
2 /*
3  * Copyright (c) 2009 University of Jyväskylä, Department of Mathematical
4  * Information Technology.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  */
24 #endregion
25 
26 /*
27  * Authors: Tero Jäntti, Tomi Karppinen, Janne Nikkanen.
28  */
29 
30 using System;
31 using System.Collections.Generic;
32 using System.ComponentModel;
33 using Jypeli.Controls;
34 using Jypeli.GameObjects;
35 
36 
37 namespace Jypeli
38 {
43 #if !XBOX && !WINDOWS_PHONE
44  [Serializable]
45 #endif
46  [Save]
47  public partial class GameObject : GameObjects.GameObjectBase, IGameObjectInternal
48  {
49  public List<Listener> AssociatedListeners { get; private set; }
50  Timer fadeTimer;
51 
52  #region Destroyable
53 
57  public override void Destroy()
58  {
59  this.MaximumLifetime = TimeSpan.Zero;
60 
61  DestroyChildren();
62 
63  if ( AssociatedListeners != null )
64  {
65  foreach ( Listener listener in AssociatedListeners )
66  {
67  listener.Destroy();
68  }
69  }
70 
71  base.Destroy();
72  }
73 
74  #endregion
75 
81  public GameObject( double width, double height )
82  : this( width, height, Shape.Rectangle )
83  {
84  }
85 
92  public GameObject( double width, double height, Shape shape )
93  : base()
94  {
95  InitDimensions( width, height, shape );
96  InitAppearance();
97  InitListeners();
98  InitLayout( width, height );
99  }
100 
106  public GameObject( Animation animation )
107  : base()
108  {
109  InitDimensions( animation.Width, animation.Height, Shape.Rectangle );
110  InitAppearance( animation );
111  InitListeners();
112  InitLayout( animation.Width, animation.Height );
113  }
114 
118  public GameObject( ILayout layout )
119  : base()
120  {
121  Vector defaultSize = new Vector( 100, 100 );
122  InitDimensions( defaultSize.X, defaultSize.Y, Shape.Rectangle );
123  InitAppearance();
124  InitListeners();
125  InitLayout( defaultSize.X, defaultSize.Y, layout );
126  }
127 
128  private void InitListeners()
129  {
130  this.AssociatedListeners = new List<Listener>();
131  }
132 
139  [EditorBrowsable( EditorBrowsableState.Never )]
140  public override void Update( Time time )
141  {
142  base.Update( time );
143  UpdateChildren( time );
144  if ( _layoutNeedsRefreshing )
145  {
146  RefreshLayout();
147  _layoutNeedsRefreshing = false;
148  }
149  if ( oscillators != null )
150  oscillators.Update( time );
151  }
152 
158  public bool SeesObject( GameObject obj )
159  {
160  return Game.Instance.GetFirstObject(obstacle => obstacle != this && obstacle != obj && !(obstacle is Widget) && obstacle.IsBlocking(this.Position, obj.Position)) == null;
161  }
162 
169  public bool SeesObject( GameObject obj, Predicate<GameObject> isObstacle )
170  {
171  return Game.Instance.GetFirstObject( obstacle => obstacle != this && obstacle != obj && isObstacle( obstacle ) && obstacle.IsBlocking( this.Position, obj.Position ) ) == null;
172  }
173 
180  public bool SeesObject( GameObject obj, object obstacleTag )
181  {
182  return SeesObject( obj, o => o.Tag == obstacleTag );
183  }
184 
190  public bool SeesTarget( Vector targetPosition )
191  {
192  return Game.Instance.GetFirstObject( obstacle => obstacle != this && !( obstacle is Widget ) && obstacle.IsBlocking( this.Position, targetPosition ) ) == null;
193  }
194 
201  public bool SeesTarget( Vector targetPosition, Predicate<GameObject> isObstacle )
202  {
203  return Game.Instance.GetFirstObject( obstacle => obstacle != this && isObstacle( obstacle ) && obstacle.IsBlocking( this.Position, targetPosition ) ) == null;
204  }
205 
212  public bool SeesTarget( Vector targetPosition, object obstacleTag )
213  {
214  return SeesTarget( targetPosition, o => o.Tag == obstacleTag );
215  }
216 
224  public bool IsBlocking(Vector pos1, Vector pos2)
225  {
226  Vector normal = (pos2 - pos1).Normalize();
227  double ep = this.AbsolutePosition.ScalarProjection(normal);
228  double p1p = pos1.ScalarProjection(normal);
229  double p2p = pos2.ScalarProjection(normal);
230 
231  if (ep < p1p || ep > p2p)
232  return false;
233 
234  double pn = pos1.ScalarProjection(normal.RightNormal);
235  double en = this.AbsolutePosition.ScalarProjection(normal.RightNormal);
236  return Math.Abs(en - pn) <= 0.5 * Math.Sqrt(this.Width * this.Width + this.Height * this.Height);
237  }
238 
244  public void FadeColorTo(Color targetColor, double seconds)
245  {
246  if (fadeTimer != null && fadeTimer.Enabled)
247  {
248  fadeTimer.Stop();
249  }
250 
251  double timeLeft = seconds;
252  double dt = GetPrecision(seconds);
253 
254  int counter = 1;
255  Color original = this.Color;
256  int rd = targetColor.RedComponent - this.Color.RedComponent;
257  int gd = targetColor.GreenComponent - this.Color.GreenComponent;
258  int bd = targetColor.BlueComponent - this.Color.BlueComponent;
259  int ad = targetColor.AlphaComponent - this.Color.AlphaComponent;
260 
261  fadeTimer = new Timer();
262  fadeTimer.Interval = dt;
263  fadeTimer.Timeout += delegate
264  {
265  byte r = (byte)( original.RedComponent + rd * counter * dt / seconds );
266  byte g = (byte)( original.GreenComponent + gd * counter * dt / seconds );
267  byte b = (byte)( original.BlueComponent + bd * counter * dt / seconds );
268  byte a = (byte)( original.AlphaComponent + ad * counter * dt / seconds );
269  this.Color = new Color( r, g, b, a );
270  counter++;
271  };
272  fadeTimer.Start( (int)Math.Ceiling( seconds / dt ) );
273  }
274 
275  private double GetPrecision(double seconds)
276  {
277  double dt = 0.01;
278  while (dt > seconds) dt /= 10;
279  return dt;
280  }
281  }
282 }
byte BlueComponent
Sininen värikomponentti välillä 0-255
Definition: Color.cs:31
Color Color
Väri, jonka värisenä olio piirretään, jos tekstuuria ei ole määritelty.
Kuvio.
Definition: Shapes.cs:48
GameObject GetFirstObject(Predicate< GameObject > condition)
Palauttaa ensimmäisen peliolion joka toteuttaa ehdon (null jos mikään ei toteuta).
Definition: Game.cs:823
GameObject(ILayout layout)
Alustaa widgetin.
Definition: GameObject.cs:118
byte GreenComponent
Vihreä värikomponentti välillä 0-255
Definition: Color.cs:25
GameObject(double width, double height)
Alustaa uuden peliolion.
Definition: GameObject.cs:81
Rajapinta asettelijalle. Asettelija asettelee widgetin lapsioliot siten, että ne mahtuvat widgetin si...
Definition: ILayout.cs:83
bool SeesTarget(Vector targetPosition, Predicate< GameObject > isObstacle)
Näkeekö olio paikkaan.
Definition: GameObject.cs:201
List< Listener > AssociatedListeners
Definition: __GameObject.cs:69
TimeSpan MaximumLifetime
Olion suurin mahdollinen elinaika. Kun Lifetime on suurempi kuin tämä, olio kuolee.
bool SeesTarget(Vector targetPosition, object obstacleTag)
Näkeekö olio paikkaan.
Definition: GameObject.cs:212
Suorakulmio.
Definition: Shapes.cs:315
void InitLayout(double width, double height)
Definition: Layout.cs:120
void Update(Time time)
Lisää ja poistaa jonossa olevat elementit sekä kutsuu niiden Update-metodia.
static readonly Rectangle Rectangle
Suorakulmio.
Definition: Shapes.cs:72
byte RedComponent
Punainen värikomponentti välillä 0-255
Definition: Color.cs:19
static Game Instance
Definition: Game.cs:149
Käyttöliittymän komponentti.
Definition: Appearance.cs:9
Sisältää tiedon ajasta, joka on kulunut pelin alusta ja viime päivityksestä.
Definition: Time.cs:13
GameObject(Animation animation)
Alustaa uuden peliolion. Kappaleen koko ja ulkonäkö ladataan parametrina annetusta kuvasta...
Definition: GameObject.cs:106
double ScalarProjection(Vector unitVector)
Definition: Vector.cs:169
double Y
Definition: Vector.cs:275
Peliluokka reaaliaikaisille peleille.
Definition: DebugScreen.cs:10
bool SeesObject(GameObject obj)
Näkeekö olio toisen.
Definition: GameObject.cs:158
override void Update(Time time)
Peliolion päivitys. Tätä kutsutaan, kun IsUpdated-ominaisuuden arvoksi on asetettu true ja olio on li...
Definition: GameObject.cs:140
Kaikille peliolioille yhteinen kantaluokka
void FadeColorTo(Color targetColor, double seconds)
Muuttaa olion väriä toiseen hitaasti liukumalla.
Definition: GameObject.cs:244
double X
Definition: Vector.cs:274
bool SeesObject(GameObject obj, Predicate< GameObject > isObstacle)
Näkeekö olio toisen.
Definition: GameObject.cs:169
Ajastin, joka voidaan asettaa laukaisemaan tapahtumia tietyin väliajoin.
Definition: Timer.cs:39
byte AlphaComponent
Läpinäkymättömyys välillä 0-255
Definition: Color.cs:37
Väri.
Definition: Color.cs:13
bool IsBlocking(Vector pos1, Vector pos2)
Onko olio kahden paikan välissä.
Definition: GameObject.cs:224
override void Destroy()
Tuhoaa olion. Tuhottu olio poistuu pelistä.
Definition: GameObject.cs:57
Sarja kuvia, jotka vaihtuvat halutulla nopeudella. Yksi animaatio koostuu yhdestä tai useammasta kuva...
Definition: Animation.cs:56
GameObject(double width, double height, Shape shape)
Alustaa uuden peliolion.
Definition: GameObject.cs:92
bool SeesTarget(Vector targetPosition)
Näkeekö olio paikkaan.
Definition: GameObject.cs:190
double Width
Olion leveys (X-suunnassa, leveimmässä kohdassa).
double Width
Animaation leveys. Nolla, jos animaatiossa ei ole yhtään ruutua.
Definition: Animation.cs:151
2D-vektori.
Definition: Vector.cs:56
bool SeesObject(GameObject obj, object obstacleTag)
Näkeekö olio toisen.
Definition: GameObject.cs:180
double Height
Animaation korkeus. Nolla, jos animaatiossa ei ole yhtään ruutua.
Definition: Animation.cs:159
Pelialueella liikkuva olio. Käytä fysiikkapeleissä PhysicsObject-olioita.
Definition: __GameObject.cs:54
Vector AbsolutePosition
Olion absoluuttinen paikka pelimaailmassa. Jos olio ei ole minkään toisen peliolion lapsiolio...
Vector RightNormal
Oikea normaali.
Definition: Vector.cs:90
void RefreshLayout()
Päivittää lapsiolioiden paikat ja koot, jos widgetille on asetettu asettelija. Tätä metodia EI yleens...
Definition: Layout.cs:141
double Height
Olion korkeus (Y-suunnassa, korkeimmassa kohdassa).