Jypeli 10
The simple game programming library
GameObjectBase.cs
Siirry tämän tiedoston dokumentaatioon.
1using Microsoft.Xna.Framework;
2using System;
3using System.ComponentModel;
4
6{
10 public abstract class GameObjectBase : Tagged, Destroyable
11 {
12 private Layer _layer = null;
14 private TimeSpan _maxLifetime = TimeSpan.MaxValue;
15 private bool _rotateImage = true;
16
20 public Game Game
21 {
22 get { return Game.Instance; }
23 }
24
28 public Layer Layer
29 {
30 get
31 {
32 if ( Parent != null ) return Parent.Layer;
33 return _layer;
34 }
35 set
36 {
37 _layer = value;
38 }
39 }
40
44 public bool RotateImage
45 {
46 get { return _rotateImage; }
47 set { _rotateImage = value; }
48 }
49
54 public IGameObject Parent { get; set; }
55
70 public bool IsUpdated { get; set; }
71
86 public object Tag { get; set; }
87
92 public virtual Brain Brain
93 {
94 get
95 {
96 return _brain;
97 }
98 set
99 {
100 _brain.Owner = null;
101 _brain = ( ( value != null ) ? value : Brain.None );
102 _brain.Owner = (IGameObject)this;
104 if ( value != null )
105 IsUpdated = true;
106 }
107 }
108
112 public event Action AddedToGame;
113
117 public void OnAddedToGame()
118 {
119 AddedToGame?.Invoke();
121 }
122
126 public event Action Removed;
127
131 public void OnRemoved()
132 {
133 if ( Removed != null )
134 Removed();
135 }
136
140 public bool IsDestroyed { get; private set; }
141
145 public event Action Destroyed;
146
150 protected void OnDestroyed()
151 {
152 if ( Destroyed != null )
153 Destroyed();
154 }
155
159 public virtual void Destroy()
160 {
161 if ( IsDestroyed )
162 return;
163
164 IsDestroyed = true;
165 OnDestroyed();
166 }
167
172 [Save] public abstract Vector Size { get; set; }
173
177 [Save] public virtual Vector Position { get; set; }
178
183 [Save] public abstract Angle Angle { get; set; }
184
188 public TimeSpan CreationTime { get; protected set; }
189
193 public TimeSpan Lifetime
194 {
195 get { return Game.Time.SinceStartOfGame - CreationTime; }
196 }
197
202 public TimeSpan MaximumLifetime
203 {
204 get { return _maxLifetime; }
205 set
206 {
207 _maxLifetime = value;
208 IsUpdated = true;
209 }
210 }
211
215 [Save]
216 public TimeSpan LifetimeLeft
217 {
218 get { return MaximumLifetime - Lifetime; }
219 set
220 {
221 try
222 {
223 MaximumLifetime = Lifetime + value;
224 }
225 catch ( OverflowException )
226 {
227 MaximumLifetime = TimeSpan.MaxValue;
228 }
229 }
230 }
231
235 public double Width
236 {
237 get { return Size.X; }
238 set { Size = new Vector( value, Size.Y ); }
239 }
240
244 public double Height
245 {
246 get { return Size.Y; }
247 set { Size = new Vector( Size.X, value ); }
248 }
249
250 internal Vector InitialRelativePosition { get; set; }
251 internal Angle InitialRelativeAngle { get; set; }
252
257 {
258 get
259 {
260 if (Parent != null)
261 {
263 Angle angle = diff.Angle;
264 return Vector.FromLengthAndAngle(diff.Magnitude, angle - Parent.Angle);
265 }
266 return Position;
267 }
268 set
269 {
270 if (Parent != null)
271 Position = value.Transform(Matrix.CreateRotationZ((float)Parent.Angle.Radians) * Matrix.CreateTranslation(Parent.Position));
272 else
273 Position = value;
274 }
275 }
276
281 {
282 get
283 {
284 if (Parent != null)
285 {
286 GameObject mainParent = ((GameObject)this).GetMainParent();
287 Vector diff = Position - mainParent.Position;
288 Angle angle = diff.Angle;
289 return Vector.FromLengthAndAngle(diff.Magnitude, angle - mainParent.Angle);
290 }
291 return RelativePosition;
292 }
293 set
294 {
295 GameObject mainParent = ((GameObject)this).GetMainParent();
296 if (Parent != null)
297 Position = value.Transform(Matrix.CreateRotationZ((float)mainParent.Angle.Radians) * Matrix.CreateTranslation(mainParent.Position));
298 else
299 Position = value;
300 }
301 }
302
309 {
310 get
311 {
312 if ( Parent != null )
313 return this.Angle - Parent.Angle;
314 return Angle;
315 }
316 set
317 {
318 if (Parent != null)
319 Angle = Parent.Angle + value;
320 else Angle = value;
321 }
322 }
323
330 {
331 get
332 {
333 if (Parent != null)
334 {
335 GameObject mainParent = ((GameObject)this).GetMainParent();
336 return this.Angle - mainParent.Angle;
337 }
338 return RelativeAngle;
339 }
340 set
341 {
342 if (Parent != null)
343 {
344 GameObject mainParent = ((GameObject)this).GetMainParent();
345 Angle = mainParent.Angle + value;
346 }
347 else
348 Angle = value;
349 }
350 }
351
357 {
358 get => Position;
359 set => Position = value;
360 }
361
367 {
368 get => Angle;
369 set => Angle = value;
370 }
371
375 public double Left
376 {
377 get { return Position.X - 0.5 * ( Size.Y * Math.Abs( Angle.Sin ) + Size.X * Math.Abs( Angle.Cos ) ); }
378 set { Position = new Vector( value + Size.X / 2, Position.Y ); }
379 }
380
384 public double Right
385 {
386 get { return Position.X + 0.5 * ( Size.Y * Math.Abs( Angle.Sin ) + Size.X * Math.Abs( Angle.Cos ) ); }
387 set { Position = new Vector( value - Size.X / 2, Position.Y ); }
388 }
389
393 public double Top
394 {
395 get { return Position.Y + 0.5 * ( Size.X * Math.Abs( Angle.Sin ) + Size.Y * Math.Abs( Angle.Cos ) ); }
396 set { Position = new Vector( Position.X, value - Size.Y / 2 ); }
397 }
398
402 public double Bottom
403 {
404 get { return Position.Y - 0.5 * ( Size.X * Math.Abs( Angle.Sin ) + Size.Y * Math.Abs( Angle.Cos ) ); }
405 set { Position = new Vector( Position.X, value + Size.Y / 2 ); }
406 }
407
411 public double RelativeLeft
412 {
413 get { return RelativePosition.X - (0.5 * (Size.Y * Math.Abs(RelativeAngle.Sin) + Size.X * Math.Abs(RelativeAngle.Cos))); }
414 set { RelativePosition = new Vector(value + (Size.X / 2), RelativePosition.Y); }
415 }
416
420 public double RelativeRight
421 {
422 get { return RelativePosition.X + (0.5 * (Size.Y * Math.Abs(RelativeAngle.Sin) + Size.X * Math.Abs(RelativeAngle.Cos))); }
423 set { RelativePosition = new Vector(value - (Size.X / 2), RelativePosition.Y); }
424 }
425
429 public double RelativeTop
430 {
431 get { return RelativePosition.Y + 0.5 * (Size.X * Math.Abs(RelativeAngle.Sin) + Size.Y * Math.Abs(RelativeAngle.Cos)); }
432 set { RelativePosition = new Vector(RelativePosition.X, value - Size.Y / 2); }
433 }
434
438 public double RelativeBottom
439 {
440 get { return RelativePosition.Y - (0.5 * (Size.X * Math.Abs(RelativeAngle.Sin) + Size.Y * Math.Abs(RelativeAngle.Cos))); }
441 set { RelativePosition = new Vector(RelativePosition.X, value + (Size.Y / 2)); }
442 }
443
447 public double X
448 {
449 get
450 {
451 return Position.X; // TODO: Nämä voisi joskus muuttaa tähän nätimpään nuolisyntaksiin.
452 }
453 set
454 {
455 Position = new Vector( value, Position.Y );
456 }
457 }
458
462 public double Y
463 {
464 get
465 {
466 return Position.Y;
467 }
468 set
469 {
470 Position = new Vector( Position.X, value );
471 }
472 }
473
478 public double AbsoluteX
479 {
480 get => Position.X;
481 set => Position = new Vector(value, Position.Y);
482 }
483
488 public double AbsoluteY
489 {
490 get => Position.Y;
491 set => Position = new Vector(Position.X, value);
492 }
493
498 {
499 get { return Vector.FromAngle( Angle ); }
500 }
501
506 {
507 get { return UnitX.LeftNormal; }
508 }
509
514 {
515 get { return Vector.FromAngle( RelativeAngle ); }
516 }
517
522 {
523 get { return RelativeUnitX.LeftNormal; }
524 }
525
529 public abstract Animation Animation { get; set; }
530
535 {
536 get
537 {
538 if ( Animation != null )
539 return Animation.CurrentFrame;
540 return null;
541 }
542 set
543 {
544 Animation = value;
545 }
546 }
547
551 protected GameObjectBase()
552 {
554 this.Tag = "";
555 }
556
571 public abstract void MoveTo( Vector location, double speed, Action doWhenArrived );
572
582 public void MoveTo( Vector location, double speed )
583 {
584 MoveTo( location, speed, null );
585 }
586
593 [EditorBrowsable( EditorBrowsableState.Never )]
594 public virtual void Update( Time time )
595 {
596 if ( IsDestroyed )
597 return;
598
600 {
601 Destroy();
602 return;
603 }
604
605 Brain.DoUpdate( time );
606 }
607 }
608}
Sarja kuvia, jotka vaihtuvat halutulla nopeudella. Yksi animaatio koostuu yhdestä tai useammasta kuva...
Definition: Animation.cs:62
Image CurrentFrame
Tällä hetkellä näkyvä ruutu animaatiosta.
Definition: Animation.cs:139
Aivoluokka peliolioille. Voidaan käyttää tekoälyn ja tilannekohtaisten toimintamallien luomiseen peli...
Definition: Brain.cs:41
void DoUpdate(Time time)
Definition: Brain.cs:86
static readonly Brain None
Tyhjät aivot, eivät sisällä mitään toiminnallisuutta.
Definition: Brain.cs:45
void AddToGameEvent()
Definition: Brain.cs:81
IGameObject Owner
Aivojen haltija.
Definition: Brain.cs:69
static Time Time
Peliaika. Sisältää tiedon siitä, kuinka kauan peliä on pelattu (Time.SinceStartOfGame) ja kuinka kaua...
Definition: Time.cs:25
static Game Instance
Käynnissä olevan pelin pääolio.
Definition: Game.cs:96
Pelialueella liikkuva olio. Käytä fysiikkapeleissä PhysicsObject-olioita.
Definition: Appearance.cs:34
override Vector?? Position
Definition: Dimensions.cs:72
override Angle?? Angle
Definition: Dimensions.cs:102
GameObject GetMainParent()
Antaa olion korkeimman tason isäntäolion. Eli vanhemman vanhemman...
Kaikille peliolioille yhteinen kantaluokka
Angle RelativeAngle
Olion kulma suhteessa vanhempaan. Jos olio ei ole minkään toisen peliolion lapsiolio,...
Angle RelativeAngleToMainParent
Olion kulma suhteessa vanhimpaan vanhempaan. Jos olio ei ole minkään toisen peliolion lapsiolio,...
Vector RelativeUnitX
Olion koordinaatiston suhteellinen X-yksikkökantavektori.
double X
Olion paikan X-koordinaatti.
double Top
Olion yläreunan y-koordinaatti.
Vector RelativePositionToMainParent
Sijainti suhteessa vanhimpaan vanhempaan
IGameObject Parent
Olio, jonka lapsiolio tämä olio on. Jos null, olio ei ole minkään olion lapsiolio.
double Height
Olion korkeus (Y-suunnassa, korkeimmassa kohdassa).
Vector RelativePosition
Olion paikka suhteessa sen isäntäolioon.
double RelativeBottom
Olion alareunan suhteellinen y-koordinaatti.
double Bottom
Olion alareunan y-koordinaatti.
Vector UnitY
Olion koordinaatiston Y-yksikkökantavektori.
void OnDestroyed()
Kun olio tuhotaan
bool RotateImage
Pyöritetäänkö kuvaa olion kulman mukana.
GameObjectBase()
Kaikille peliobjekteille yhteinen kantaluokka
TimeSpan Lifetime
Olion elinaika. Lasketaan siitä lähtien, kun olio luodaan.
void OnRemoved()
Kutsutaan kun olio poistetaan pelistä.
Action AddedToGame
Tapahtuu, kun olio lisätään peliin.
double AbsoluteY
Olion paikan absoluttinen Y-koordinaatti. Tämä on sama kuin X
void MoveTo(Vector location, double speed)
Yrittää siirtyä annettuun paikkaan annetulla nopeudella.
Vector UnitX
Olion koordinaatiston X-yksikkökantavektori.
double Left
Olion vasemman reunan x-koordinaatti.
double RelativeTop
Olion yläreunan suhteellinen y-koordinaatti.
Vector AbsolutePosition
Olion absoluuttinen paikka maailmassa. Tämä on sama kuin Position
TimeSpan CreationTime
Olion luomisaika.
virtual void Destroy()
Tuhoaa olion.
abstract void MoveTo(Vector location, double speed, Action doWhenArrived)
Yrittää siirtyä annettuun paikkaan annetulla nopeudella. Laukaisee annetun aliohjelman,...
double Y
Olion paikan Y-koordinaatti.
Vector RelativeUnitY
Olion koordinaatiston suhteellinen Y-yksikkökantavektori.
Angle AbsoluteAngle
Olion absoluuttinen kulma maailmassa. Tämä on sama kuin Angle
object Tag
Vapaasti asetettava muuttuja.
abstract Vector Size
Olion koko pelimaailmassa. Kertoo olion äärirajat, ei muotoa.
abstract Angle Angle
Olion kulma tai rintamasuunta. Nolla = osoittaa oikealle.
double RelativeLeft
Olion vasemman reunan suhteellinen x-koordinaatti.
TimeSpan LifetimeLeft
Olion jäljellä oleva elinaika.
TimeSpan MaximumLifetime
Olion suurin mahdollinen elinaika. Kun Lifetime on suurempi kuin tämä, olio kuolee.
double RelativeRight
Olion oikean reunan suhteellinen x-koordinaatti.
double AbsoluteX
Olion paikan absoluttinen X-koordinaatti. Tämä on sama kuin X
virtual void Update(Time time)
Peliolion päivitys. Tätä kutsutaan, kun IsUpdated-ominaisuuden arvoksi on asetettu true ja olio on li...
bool IsDestroyed
Onko olio tuhottu.
double Width
Olion leveys (X-suunnassa, leveimmässä kohdassa).
double Right
Olion oikean reunan x-koordinaatti.
virtual Vector Position
Olion paikka. Jos olio on jonkun toisen peliolion lapsi, ks. myös (RelativePosition).
void OnAddedToGame()
Kutsutaan kun olio lisätään peliin.
Action Removed
Tapahtuu, kun olio poistetaan pelistä (tuhotaan tai ei).
Action Destroyed
Tapahtuu, kun olio tuhotaan.
bool IsUpdated
Tarvitseeko olio päivittämistä. Kun perit oman luokkasi tästä luokasta, aseta tämä arvoon true,...
Kuva.
Definition: Image.cs:30
Kerros. Vastaa olioiden piirtämisestä.
Definition: Layer.cs:32
Rajapinta olioille, jotka ovat tuhottavissa.
Definition: Destroyable.cs:9
Yhteinen rajapinta kaikille peliolioille.
Definition: IGameObject.cs:11
new Vector Position
Paikka.
Definition: Positional.cs:32
Rajapinta olioille, joilla on Tag-ominaisuus.
Definition: Tagged.cs:7
Microsoft.Xna.Framework.Matrix Matrix
Definition: Mouse.cs:36
Suuntakulma (rajoitettu -180 ja 180 asteen välille) asteina ja radiaaneina. Tietoja kulmasta: http://...
Definition: Angle.cs:40
double Sin
Kulman sini.
Definition: Angle.cs:111
double Cos
Kulman kosini.
Definition: Angle.cs:119
double Radians
Palauttaa tai asettaa kulman radiaaneina.
Definition: Angle.cs:85
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 LeftNormal
Vasen normaali.
Definition: Vector.cs:97
double Y
Vektorin Y-komponentti
Definition: Vector.cs:339
Vector Transform(Matrix matrix)
Kertoo vektorin matriisilla.
Definition: Vector.cs:227
static Vector FromAngle(Angle angle)
Luo vektorin kulman perusteella yksikköpituudella.
Definition: Vector.cs:133
double X
Vektorin X-komponentti.
Definition: Vector.cs:334
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