source: 2013/30/MiskaK/MW2(My Warfare 2)/Paranneltu Jypeli/GameObjects/GameObject/GameObjectBase.cs @ 4507

Revision 4507, 13.2 KB checked in by anlakane, 6 years ago (diff)

Talletus.

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using System.ComponentModel;
6
7namespace Jypeli.GameObjects
8{
9    /// <summary>
10    /// Kaikille peliolioille yhteinen kantaluokka
11    /// </summary>
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;
18
19        /// <summary>
20        /// Peli.
21        /// </summary>
22        public Game Game
23        {
24            get { return Game.Instance; }
25        }
26
27        /// <summary>
28        /// Kerros, jolle peliolio on lisätty.
29        /// </summary>
30        public Layer Layer
31        {
32            get
33            {
34                if ( Parent != null ) return Parent.Layer;
35                return _layer;
36            }
37            set
38            {
39                _layer = value;
40            }
41        }
42
43        /// <summary>
44        /// Pyöritetäänkö kuvaa olion kulman mukana.
45        /// </summary>
46        public bool RotateImage
47        {
48            get { return _rotateImage; }
49            set { _rotateImage = value; }
50        }
51
52        /// <summary>
53        /// Olio, jonka lapsiolio tämä olio on. Jos <c>null</c>, olio ei
54        /// ole minkään olion lapsiolio.
55        /// </summary>
56        public IGameObject Parent { get; set; }
57
58        /// <summary>
59        /// Tarvitseeko olio päivittämistä. Kun perit oman luokkasi
60        /// tästä luokasta, aseta tämä arvoon <c>true</c>, kun luokan olio
61        /// tarvitsee päivittämistä.
62        /// </summary>
63        /// <remarks>
64        /// Jos tämä asetetaan arvoon <code>true</code>, olion <c>Update</c>-metodia
65        /// kutsutaan säännöllisesti (noin 25 kertaa sekunnissa) sen jälkeen, kun olio
66        /// on lisätty peliin.
67        ///
68        /// Tämä ei ole oletuksena <c>true</c>, jotta vältetään pelin hidastuminen
69        /// turhien päivityskutsujen takia. Jos esimerkiksi kenttä koostuu tuhansista
70        /// seinäpalikoista, näiden kaikkien päivittäminen koko ajan olisi turhaa.
71        /// </remarks>
72        public bool IsUpdated { get; set; }
73
74        /// <summary>
75        /// Vapaasti asetettava muuttuja.
76        /// </summary>
77        /// <example>
78        /// Tagia voi käyttää vaikkapa olion keräämien pisteiden tallettamiseen:
79        /// <code>
80        /// hahmo.Tag = 5;
81        /// </code>
82        /// Kun luet pisteitä, täytyy arvo muuntaa oikean tyyppiseksi kertomalla tyypin
83        /// nimi suluissa:
84        /// <code>
85        /// int pisteitä = (int)hahmo.Tag;
86        /// </code>
87        /// </example>
88        public object Tag { get; set; }
89
90        /// <summary>
91        /// Olion paikka kenttäruudukossa. Voi olla null.
92        /// </summary>
93        public IntPoint PositionInLevelArray { get; set; }
94
95        /// <summary>
96        /// Olion aivot.
97        /// Ks. <c>Brain</c>
98        /// </summary>
99        public virtual Brain Brain
100        {
101            get
102            {
103                return _brain;
104            }
105            set
106            {
107                _brain.Owner = null;
108                _brain = ( ( value != null ) ? value : Brain.None );
109                _brain.Owner = (IGameObject)this;
110                _brain.AddToGameEvent();
111                if ( value != null )
112                    IsUpdated = true;
113            }
114        }
115
116        /// <summary>
117        /// Tapahtuu, kun olio lisätään peliin.
118        /// </summary>
119        public event Action AddedToGame;
120
121        /// <summary>
122        /// Kutsutaan kun olio lisätään peliin.
123        /// </summary>
124        public void OnAddedToGame()
125        {
126            if ( AddedToGame != null )
127                AddedToGame();
128            Brain.AddToGameEvent();
129        }
130
131        /// <summary>
132        /// Tapahtuu, kun olio poistetaan pelistä (tuhotaan tai ei).
133        /// </summary>
134        public event Action Removed;
135
136        /// <summary>
137        /// Kutsutaan kun olio poistetaan pelistä.
138        /// </summary>
139        public void OnRemoved()
140        {
141            if ( Removed != null )
142                Removed();
143        }
144
145        /// <summary>
146        /// Onko olio tuhottu.
147        /// </summary>
148        public bool IsDestroyed { get; private set; }
149
150        /// <summary>
151        /// Tapahtuu, kun olio tuhotaan.
152        /// </summary>
153        public event Action Destroyed;
154
155        protected void OnDestroyed()
156        {
157            if ( Destroyed != null )
158                Destroyed();
159        }
160
161        /// <summary>
162        /// Tuhoaa olion.
163        /// </summary>
164        public virtual void Destroy()
165        {
166            if ( IsDestroyed )
167                return;
168
169            IsDestroyed = true;
170            OnDestroyed();
171        }
172
173        /// <summary>
174        /// Olion koko pelimaailmassa.
175        /// Kertoo olion äärirajat, ei muotoa.
176        /// </summary>
177        [Save] public abstract Vector Size { get; set; }
178
179        /// <summary>
180        /// Olion paikka. Jos olio on jonkun toisen peliolion lapsi, paikka on suhteessa
181        /// tämän vanhempaan (<c>Parent</c>). Muuten paikka on paikka pelimaailmassa.
182        /// </summary>
183        [Save] public virtual Vector Position { get; set; }
184
185        /// <summary>
186        /// Olion kulma tai rintamasuunta.
187        /// Nolla = osoittaa oikealle.
188        /// </summary>     
189        [Save] public abstract Angle Angle { get; set; }
190
191        /// <summary>
192        /// Olion luomisaika.
193        /// </summary>
194        public TimeSpan CreationTime { get; protected set; }
195
196        /// <summary>
197        /// Olion elinaika. Lasketaan siitä lähtien, kun olio luodaan.
198        /// </summary>
199        public TimeSpan Lifetime
200        {
201            get { return Game.Time.SinceStartOfGame - CreationTime; }
202        }
203
204        /// <summary>
205        /// Olion suurin mahdollinen elinaika.
206        /// Kun <c>Lifetime</c> on suurempi kuin tämä, olio kuolee.
207        /// </summary>
208        public TimeSpan MaximumLifetime
209        {
210            get { return _maxLifetime; }
211            set
212            {
213                _maxLifetime = value;
214                IsUpdated = true;
215            }
216        }
217
218        /// <summary>
219        /// Olion jäljellä oleva elinaika.
220        /// </summary>
221        [Save]
222        public TimeSpan LifetimeLeft
223        {
224            get { return MaximumLifetime - Lifetime; }
225            set
226            {
227                try
228                {
229                    MaximumLifetime = Lifetime + value;
230                }
231                catch ( OverflowException )
232                {
233                    MaximumLifetime = TimeSpan.MaxValue;
234                }
235            }
236        }
237
238        /// <summary>
239        /// Olion leveys (X-suunnassa, leveimmässä kohdassa).
240        /// </summary>
241        public double Width
242        {
243            get { return Size.X; }
244            set { Size = new Vector( value, Size.Y ); }
245        }
246
247        /// <summary>
248        /// Olion korkeus (Y-suunnassa, korkeimmassa kohdassa).
249        /// </summary>
250        public double Height
251        {
252            get { return Size.Y; }
253            set { Size = new Vector( Size.X, value ); }
254        }
255
256        /// <summary>
257        /// Olion absoluuttinen paikka pelimaailmassa.
258        /// Jos olio ei ole minkään toisen peliolion lapsiolio,
259        /// tämä on sama kuin <c>Position</c>.
260        /// </summary>
261        public Vector AbsolutePosition
262        {
263            get
264            {
265                if ( Parent != null )
266                    return Parent.AbsolutePosition + this.Position;
267                return Position;
268            }
269            set
270            {
271                if ( Parent != null )
272                    Position = value - Parent.AbsolutePosition;
273                else
274                    Position = value;
275            }
276        }
277
278        /// <summary>
279        /// Olion absoluuttinen kulma pelimaailmassa.
280        /// Jos olio ei ole minkään toisen peliolion lapsiolio,
281        /// tämä on sama kuin <c>Angle</c>.
282        /// </summary>
283        public Angle AbsoluteAngle
284        {
285            get
286            {
287                if ( Parent != null )
288                    return Parent.AbsoluteAngle + this.Angle;
289                return Angle;
290            }
291            set
292            {
293                if ( Parent != null )
294                    Angle = value - Parent.AbsoluteAngle;
295                else
296                    Angle = value;
297            }
298        }
299
300        /// <summary>
301        /// Olion vasemman reunan x-koordinaatti.
302        /// </summary>
303        public double Left
304        {
305            get { return Position.X - Size.X / 2; }
306            set { Position = new Vector( value + Size.X / 2, Position.Y ); }
307        }
308
309        /// <summary>
310        /// Olion oikean reunan x-koordinaatti.
311        /// </summary>
312        public double Right
313        {
314            get { return Position.X + Size.X / 2; }
315            set { Position = new Vector( value - Size.X / 2, Position.Y ); }
316        }
317
318        /// <summary>
319        /// Olion yläreunan y-koordinaatti.
320        /// </summary>
321        public double Top
322        {
323            get { return Position.Y + Size.Y / 2; }
324            set { Position = new Vector( Position.X, value - Size.Y / 2 ); }
325        }
326
327        /// <summary>
328        /// Olion alareunan y-koordinaatti.
329        /// </summary>
330        public double Bottom
331        {
332            get { return Position.Y - Size.Y / 2; }
333            set { Position = new Vector( Position.X, value + Size.Y / 2 ); }
334        }
335
336        /// <summary>
337        /// Olion paikan X-koordinaatti.
338        /// </summary>
339        public double X
340        {
341            get
342            {
343                return Position.X;
344            }
345            set
346            {
347                Position = new Vector( value, Position.Y );
348            }
349        }
350
351        /// <summary>
352        /// Olion paikan Y-koordinaatti.
353        /// </summary>
354        public double Y
355        {
356            get
357            {
358                return Position.Y;
359            }
360            set
361            {
362                Position = new Vector( Position.X, value );
363            }
364        }
365
366        /// <summary>
367        /// Animaatio. Voi olla <c>null</c>, jolloin piirretään vain väri.
368        /// </summary>
369        public abstract Animation Animation { get; set; }
370
371        /// <summary>
372        /// Olion kuva. Voi olla <c>null</c>, jolloin piirretään vain väri.
373        /// </summary>
374        public Image Image
375        {
376            get
377            {
378                if ( Animation != null )
379                    return Animation.CurrentFrame;
380                return null;
381            }
382            set
383            {
384                Animation = value;
385            }
386        }
387
388        protected GameObjectBase()
389        {
390            this.CreationTime = Game.Time.SinceStartOfGame;
391            this.Tag = "";
392        }
393
394        /// <summary>
395        /// Yrittää siirtyä annettuun paikkaan annetulla nopeudella.
396        /// Laukaisee annetun aliohjelman, kun paikkaan on päästy.
397        /// </summary>
398        /// <param name="location">Paikka johon siirrytään</param>
399        /// <param name="speed">
400        /// Nopeus (paikkayksikköä sekunnissa) jolla liikutaan.
401        /// Nopeus on maksiminopeus. Jos välissä on hitaampaa maastoa tai
402        /// esteitä, liikkumisnopeus voi olla alle sen.
403        /// </param>
404        /// <param name="doWhenArrived">
405        /// Aliohjelma, joka ajetaan kun paikkaan on päästy.
406        /// Voi olla null, jos ei haluta mitään aliohjelmaa.
407        /// </param>
408        public abstract void MoveTo( Vector location, double speed, Action doWhenArrived );
409
410        /// <summary>
411        /// Yrittää siirtyä annettuun paikkaan annetulla nopeudella.
412        /// </summary>
413        /// <param name="location">Paikka johon siirrytään</param>
414        /// <param name="speed">
415        /// Nopeus (paikkayksikköä sekunnissa) jolla liikutaan.
416        /// Nopeus on maksiminopeus. Jos välissä on hitaampaa maastoa tai
417        /// esteitä, liikkumisnopeus voi olla alle sen.
418        /// </param>
419        public void MoveTo( Vector location, double speed )
420        {
421            MoveTo( location, speed, null );
422        }
423
424        /// <summary>
425        /// Peliolion päivitys. Tätä kutsutaan, kun <c>IsUpdated</c>-ominaisuuden
426        /// arvoksi on asetettu <c>true</c> ja olio on lisätty peliin.
427        /// <see cref="IsUpdated"/>
428        /// </summary>
429        /// <param name="time">Peliaika.</param>
430        [EditorBrowsable( EditorBrowsableState.Never )]
431        public virtual void Update( Time time )
432        {
433            if ( IsDestroyed )
434                return;
435
436            if ( Lifetime > MaximumLifetime )
437            {
438                Destroy();
439                return;
440            }
441
442            Brain.DoUpdate( time );
443        }
444    }
445}
Note: See TracBrowser for help on using the repository browser.