Jypeli  5
The simple game programming library
GameObjectBase.cs
Siirry tämän tiedoston dokumentaatioon.
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.ComponentModel;
6 
7 namespace Jypeli.GameObjects
8 {
12  public abstract class GameObjectBase : Tagged, Destroyable
13  {
14  private Layer _layer = null;
15  private Brain _brain = Brain.None;
16  private TimeSpan _maxLifetime = TimeSpan.MaxValue;
17  private bool _rotateImage = true;
19  public List<Object> Data;
20 
21 
25  public Game Game
26  {
27  get { return Game.Instance; }
28  }
29 
33  public Layer Layer
34  {
35  get
36  {
37  if ( Parent != null ) return Parent.Layer;
38  return _layer;
39  }
40  set
41  {
42  _layer = value;
43  }
44  }
45 
49  public bool RotateImage
50  {
51  get { return _rotateImage; }
52  set { _rotateImage = value; }
53  }
54 
59  public IGameObject Parent { get; set; }
60 
75  public bool IsUpdated { get; set; }
76 
91  public object Tag { get; set; }
92 
97  public virtual Brain Brain
98  {
99  get
100  {
101  return _brain;
102  }
103  set
104  {
105  _brain.Owner = null;
106  _brain = ( ( value != null ) ? value : Brain.None );
107  _brain.Owner = (IGameObject)this;
108  _brain.AddToGameEvent();
109  if ( value != null )
110  IsUpdated = true;
111  }
112  }
113 
117  public event Action AddedToGame;
118 
122  public void OnAddedToGame()
123  {
124  if ( AddedToGame != null )
125  AddedToGame();
126  Brain.AddToGameEvent();
127  }
128 
132  public event Action Removed;
133 
137  public void OnRemoved()
138  {
139  if ( Removed != null )
140  Removed();
141  }
142 
146  public bool IsDestroyed { get; private set; }
147 
151  public event Action Destroyed;
152 
153  protected void OnDestroyed()
154  {
155  if ( Destroyed != null )
156  Destroyed();
157  }
158 
162  public virtual void Destroy()
163  {
164  if ( IsDestroyed )
165  return;
166 
167  IsDestroyed = true;
168  OnDestroyed();
169  }
170 
175  [Save] public abstract Vector Size { get; set; }
176 
181  [Save] public virtual Vector Position { get; set; }
182 
187  [Save] public abstract Angle Angle { get; set; }
188 
192  public TimeSpan CreationTime { get; protected set; }
193 
197  public TimeSpan Lifetime
198  {
199  get { return Game.Time.SinceStartOfGame - CreationTime; }
200  }
201 
206  public TimeSpan MaximumLifetime
207  {
208  get { return _maxLifetime; }
209  set
210  {
211  _maxLifetime = value;
212  IsUpdated = true;
213  }
214  }
215 
219  [Save]
220  public TimeSpan LifetimeLeft
221  {
222  get { return MaximumLifetime - Lifetime; }
223  set
224  {
225  try
226  {
227  MaximumLifetime = Lifetime + value;
228  }
229  catch ( OverflowException )
230  {
231  MaximumLifetime = TimeSpan.MaxValue;
232  }
233  }
234  }
235 
239  public double Width
240  {
241  get { return Size.X; }
242  set { Size = new Vector( value, Size.Y ); }
243  }
244 
248  public double Height
249  {
250  get { return Size.Y; }
251  set { Size = new Vector( Size.X, value ); }
252  }
253 
259  public Vector AbsolutePosition
260  {
261  get
262  {
263  if ( Parent != null )
264  return Parent.AbsolutePosition + Parent.UnitX * Position.X + Parent.UnitY * Position.Y;
265 
266  return Position;
267  }
268  set
269  {
270  if ( Parent != null )
271  Position = value - Parent.AbsolutePosition;
272  else
273  Position = value;
274  }
275  }
276 
282  public Angle AbsoluteAngle
283  {
284  get
285  {
286  if ( Parent != null )
287  return Parent.AbsoluteAngle + this.Angle;
288  return Angle;
289  }
290  set
291  {
292  if ( Parent != null )
293  Angle = value - Parent.AbsoluteAngle;
294  else
295  Angle = value;
296  }
297  }
298 
302  public double Left
303  {
304  get { return Position.X - 0.5 * ( Size.Y * Math.Abs( Angle.Sin ) + Size.X * Math.Abs( Angle.Cos ) ); }
305  set { Position = new Vector( value + Size.X / 2, Position.Y ); }
306  }
307 
311  public double Right
312  {
313  get { return Position.X + 0.5 * ( Size.Y * Math.Abs( Angle.Sin ) + Size.X * Math.Abs( Angle.Cos ) ); }
314  set { Position = new Vector( value - Size.X / 2, Position.Y ); }
315  }
316 
320  public double Top
321  {
322  get { return Position.Y + 0.5 * ( Size.X * Math.Abs( Angle.Sin ) + Size.Y * Math.Abs( Angle.Cos ) ); }
323  set { Position = new Vector( Position.X, value - Size.Y / 2 ); }
324  }
325 
329  public double Bottom
330  {
331  get { return Position.Y - 0.5 * ( Size.X * Math.Abs( Angle.Sin ) + Size.Y * Math.Abs( Angle.Cos ) ); }
332  set { Position = new Vector( Position.X, value + Size.Y / 2 ); }
333  }
334 
338  public double AbsLeft
339  {
340  get { return AbsolutePosition.X - 0.5 * ( Size.Y * Math.Abs( Angle.Sin ) + Size.X * Math.Abs( Angle.Cos ) ); }
341  }
342 
346  public double AbsRight
347  {
348  get { return AbsolutePosition.X + 0.5 * ( Size.Y * Math.Abs( Angle.Sin ) + Size.X * Math.Abs( Angle.Cos ) ); }
349  }
350 
354  public double AbsTop
355  {
356  get { return AbsolutePosition.Y + 0.5 * ( Size.X * Math.Abs( Angle.Sin ) + Size.Y * Math.Abs( Angle.Cos ) ); }
357  }
358 
362  public double AbsBottom
363  {
364  get { return AbsolutePosition.Y - 0.5 * ( Size.X * Math.Abs( Angle.Sin ) + Size.Y * Math.Abs( Angle.Cos ) ); }
365  }
366 
370  public double X
371  {
372  get
373  {
374  return Position.X;
375  }
376  set
377  {
378  Position = new Vector( value, Position.Y );
379  }
380  }
381 
385  public double Y
386  {
387  get
388  {
389  return Position.Y;
390  }
391  set
392  {
393  Position = new Vector( Position.X, value );
394  }
395  }
396 
402  public Vector UnitX
403  {
404  get { return Vector.FromAngle( Angle ); }
405  }
406 
412  public Vector UnitY
413  {
414  get { return UnitX.LeftNormal; }
415  }
416 
421  public Vector AbsoluteUnitX
422  {
423  get { return Vector.FromAngle( AbsoluteAngle ); }
424  }
425 
430  public Vector AbsoluteUnitY
431  {
432  get { return AbsoluteUnitX.LeftNormal; }
433  }
434 
438  public abstract Animation Animation { get; set; }
439 
443  public Image Image
444  {
445  get
446  {
447  if ( Animation != null )
448  return Animation.CurrentFrame;
449  return null;
450  }
451  set
452  {
453  Animation = value;
454  }
455  }
456 
457  protected GameObjectBase()
458  {
459  this.CreationTime = Game.Time.SinceStartOfGame;
460  this.Tag = "";
461  }
462 
477  public abstract void MoveTo( Vector location, double speed, Action doWhenArrived );
478 
488  public void MoveTo( Vector location, double speed )
489  {
490  MoveTo( location, speed, null );
491  }
492 
499  [EditorBrowsable( EditorBrowsableState.Never )]
500  public virtual void Update( Time time )
501  {
502  if ( IsDestroyed )
503  return;
504 
505  if ( Lifetime > MaximumLifetime )
506  {
507  Destroy();
508  return;
509  }
510 
511  Brain.DoUpdate( time );
512  }
513  }
514 }
static readonly Brain None
Tyhjät aivot, eivät sisällä mitään toiminnallisuutta.
Definition: Brain.cs:45
Action Removed
Tapahtuu, kun olio poistetaan pelistä (tuhotaan tai ei).
static readonly Vector UnitX
Vaakasuuntainen yksikkövektori (pituus 1, suunta oikealle).
Definition: Vector.cs:66
static Vector FromAngle(Angle angle)
Luo vektorin kulman perusteella yksikköpituudella.
Definition: Vector.cs:118
virtual void Destroy()
Tuhoaa olion.
Rajapinta olioille, joilla on Tag-ominaisuus.
Definition: Tagged.cs:6
Suuntakulma (rajoitettu -180 ja 180 asteen välille) asteina ja radiaaneina. Tietoja kulmasta: http://...
Definition: Angle.cs:40
TimeSpan SinceStartOfGame
Aika joka on kulunut pelin alusta.
Definition: Time.cs:32
Image CurrentFrame
Tällä hetkellä näkyvä ruutu animaatiosta.
Definition: Animation.cs:137
void MoveTo(Vector location, double speed)
Yrittää siirtyä annettuun paikkaan annetulla nopeudella.
static Game Instance
Definition: Game.cs:149
void OnRemoved()
Kutsutaan kun olio poistetaan pelistä.
Aivoluokka peliolioille. Voidaan käyttää tekoälyn ja tilannekohtaisten toimintamallien luomiseen peli...
Definition: Brain.cs:40
Piste kokonaislukuruudukossa.
Definition: IntPoint.cs:11
Sisältää tiedon ajasta, joka on kulunut pelin alusta ja viime päivityksestä.
Definition: Time.cs:13
Kuva.
Definition: Image.cs:24
void OnAddedToGame()
Kutsutaan kun olio lisätään peliin.
Peliluokka reaaliaikaisille peleille.
Definition: DebugScreen.cs:10
Action Destroyed
Tapahtuu, kun olio tuhotaan.
Vector LeftNormal
Vasen normaali.
Definition: Vector.cs:82
virtual void Update(Time time)
Peliolion päivitys. Tätä kutsutaan, kun IsUpdated-ominaisuuden arvoksi on asetettu true ja olio on li...
Kaikille peliolioille yhteinen kantaluokka
Kerros. Vastaa olioiden piirtämisestä.
Definition: Layer.cs:36
double X
Definition: Vector.cs:274
double Sin
Kulman sini.
Definition: Angle.cs:112
Action AddedToGame
Tapahtuu, kun olio lisätään peliin.
Yhteinen rajapinta kaikille peliolioille.
Definition: IGameObject.cs:14
Sarja kuvia, jotka vaihtuvat halutulla nopeudella. Yksi animaatio koostuu yhdestä tai useammasta kuva...
Definition: Animation.cs:56
static Time Time
Peliaika. Sisältää tiedon siitä, kuinka kauan peliä on pelattu (Time.SinceStartOfGame) ja kuinka kaua...
Definition: Game.cs:309
double Cos
Kulman kosini.
Definition: Angle.cs:120
2D-vektori.
Definition: Vector.cs:56
IGameObject Owner
Aivojen haltija.
Definition: Brain.cs:69
void DoUpdate(Time time)
Definition: Brain.cs:86
Rajapinta olioille, jotka ovat tuhottavissa.
Definition: Destroyable.cs:8