source: 2012/23/RamiP/YAG2DSSBase/YAG2DSS/YAG2DSS/ALTKEngine/StaticAnimHandler.cs @ 2822

Revision 2822, 18.9 KB checked in by ramipasa, 9 years ago (diff)

Tekstuurit

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using Microsoft.Xna.Framework;
5using Microsoft.Xna.Framework.Audio;
6using Microsoft.Xna.Framework.Content;
7using Microsoft.Xna.Framework.GamerServices;
8using Microsoft.Xna.Framework.Graphics;
9using Microsoft.Xna.Framework.Input;
10using Microsoft.Xna.Framework.Media;
11using C = System.Convert;
12
13namespace ALTK
14{
15    /// <summary>
16    /// This is a game component that implements IUpdateable.
17    /// </summary>
18    public class StaticAnimHandler : Microsoft.Xna.Framework.DrawableGameComponent
19    {
20        public static List<StaticAnimationType> StaticAnimTypes = new List<StaticAnimationType>();
21        private List<StaticAnimInstance> AnimInstances = new List<StaticAnimInstance>();
22
23        SpriteBatch spriteBatch;
24
25        public StaticAnimHandler(Game game)
26            : base(game)
27        {
28           
29            // TODO: Construct any child components here
30        }
31
32        public int GetStaticAnimIdFromClassName(string className)
33        {
34            for (int animTypeId = 0; animTypeId < StaticAnimTypes.Count; animTypeId++)
35            {
36                if (className == StaticAnimTypes[animTypeId].ClassName)
37                    return animTypeId;
38            }
39
40            return -1;
41        }
42
43        public void AddStaticAnim(string ClassName, Vector2 location)
44        {
45            int animId = GetStaticAnimIdFromClassName(ClassName);
46            AddStaticAnim(animId, location);
47        }
48
49        public void AddStaticAnim(int animTypeId, Vector2 location)
50        {
51            //StaticAnimInstance animInstance = new StaticAnimInstance(animTypeId, 0,
52            //    new Vector2(((ALTKConstants.WindowWidth / 2.0f) + location.X) - (StaticAnimTypes[animTypeId].Texture.Width / 2.0f),
53            //        ((ALTKConstants.WindowHeight / 2.0f) + location.Y) - (StaticAnimTypes[animTypeId].Texture.Height / 2.0f)));
54
55            //StaticAnimInstance animInstance = new StaticAnimInstance(animTypeId, 0,
56            //   new Vector2(location.X, location.Y));
57
58            StaticAnimInstance animInstance = new StaticAnimInstance(animTypeId, 0,
59               new Vector2((ALTKConstants.WindowWidth / 2.0f) - (StaticAnimTypes[animTypeId].Texture.Width / 2.0f) + location.X,
60                   (ALTKConstants.WindowHeight / 2.0f) - (StaticAnimTypes[animTypeId].Texture.Height / 2.0f) + (location.Y * -1)));
61
62            //StaticAnimInstance animInstance = new StaticAnimInstance(animTypeId, 0,
63            //    new Vector2((ALTKConstants.WindowWidth / 2.0f) + location.X,
64            //    (ALTKConstants.WindowHeight / 2.0f) + (location.Y * -1)));
65
66            AnimInstances.Add(animInstance);
67        }
68
69        /// <summary>
70        /// Allows the game component to perform any initialization it needs to before starting
71        /// to run.  This is where it can query for any required services and load content.
72        /// </summary>
73        public override void Initialize()
74        {
75            // TODO: Add your initialization code here
76
77            base.Initialize();
78
79            spriteBatch = new SpriteBatch(GraphicsDevice);
80            InitStaticAnims();
81        }
82
83        private void InitStaticAnims()
84        {
85            StaticAnimationType genExplosion = new StaticAnimationType("GEN_EXPLOSION");
86            genExplosion.DisappearingRate = 2.5;
87            genExplosion.InitialVisibilityRate = 25.0;
88            genExplosion.TimeEntirelyVisible = 5;
89            genExplosion.Texture = ALTKHandler.Loader.loadTexture("gen_explosion");
90
91            StaticAnimationType stars1 = new StaticAnimationType("STARS_1");
92            stars1.DisappearingRate = 0.5;
93            stars1.InitialVisibilityRate = 0.75;
94            stars1.TimeEntirelyVisible = 0;
95            stars1.TimeWithMinOpacity = 5;
96            stars1.MinimumOpacity = 0.2;
97            stars1.Texture = ALTKHandler.Loader.loadTexture("backgroundStars1");
98
99            StaticAnimationType stars2 = new StaticAnimationType("STARS_2");
100            stars2.DisappearingRate = 0.35;
101            stars2.InitialVisibilityRate = 0.55;
102            stars2.TimeEntirelyVisible = 0;
103            stars2.TimeWithMinOpacity = 5;
104            stars2.MinimumOpacity = 0.4;
105            stars2.Texture = ALTKHandler.Loader.loadTexture("backgroundStars2");
106
107            StaticAnimationType starSmoke = new StaticAnimationType("STARSMOKE");
108            starSmoke.DisappearingRate = 0.40;
109            starSmoke.InitialVisibilityRate = 0.25;
110            starSmoke.TimeEntirelyVisible = 0;
111            starSmoke.TimeWithMinOpacity = 5;
112            starSmoke.MinimumOpacity = 0.25;
113            starSmoke.Texture = ALTKHandler.Loader.loadTexture("background_starsmoke");
114
115            StaticAnimationType starsmoke_blue = new StaticAnimationType("STARSMOKE_BLUE");
116            starsmoke_blue.DisappearingRate = 0.37;
117            starsmoke_blue.InitialVisibilityRate = 0.21;
118            starsmoke_blue.TimeEntirelyVisible = 0;
119            starsmoke_blue.TimeWithMinOpacity = 11;
120            starsmoke_blue.MinimumOpacity = 0.31;
121            starsmoke_blue.Texture = ALTKHandler.Loader.loadTexture("background_starsmoke_blue");
122
123            StaticAnimationType starsmoke_red = new StaticAnimationType("STARSMOKE_RED");
124            starsmoke_red.DisappearingRate = 0.57;
125            starsmoke_red.InitialVisibilityRate = 0.37;
126            starsmoke_red.TimeEntirelyVisible = 0;
127            starsmoke_red.TimeWithMinOpacity = 3;
128            starsmoke_red.MinimumOpacity = 0.17;
129            starsmoke_red.Texture = ALTKHandler.Loader.loadTexture("background_starsmoke_red");
130
131            StaticAnimationType starsmoke_white = new StaticAnimationType("STARSMOKE_WHITE");
132            starsmoke_white.DisappearingRate = 0.2;
133            starsmoke_white.InitialVisibilityRate = 0.125;
134            starsmoke_white.TimeEntirelyVisible = 0;
135            starsmoke_white.TimeWithMinOpacity = 15;
136            starsmoke_white.MinimumOpacity = 0.35;
137            starsmoke_white.Texture = ALTKHandler.Loader.loadTexture("background_starsmoke_white");
138
139            StaticAnimationType galaxy = new StaticAnimationType("GALAXY");
140            galaxy.DisappearingRate = 0.80;
141            galaxy.InitialVisibilityRate = 0.15;
142            galaxy.TimeEntirelyVisible = 0;
143            galaxy.TimeWithMinOpacity = 5;
144            galaxy.MinimumOpacity = 0.25;
145            galaxy.Texture = ALTKHandler.Loader.loadTexture("background_galaxy");
146
147            StaticAnimationType galaxy_blue = new StaticAnimationType("GALAXY_BLUE");
148            galaxy_blue.DisappearingRate = 0.725;
149            galaxy_blue.InitialVisibilityRate = 0.25;
150            galaxy_blue.TimeWithMinOpacity = 13;
151            galaxy_blue.MinimumOpacity = 0.3;
152            galaxy_blue.Texture = ALTKHandler.Loader.loadTexture("background_galaxy_blue");
153
154            StaticAnimationType galaxy_red = new StaticAnimationType("GALAXY_RED");
155            galaxy_red.DisappearingRate = 0.91;
156            galaxy_red.InitialVisibilityRate = 0.31;
157            galaxy_red.TimeWithMinOpacity = 9;
158            galaxy_red.MinimumOpacity = 0.10;
159            galaxy_red.Texture = ALTKHandler.Loader.loadTexture("background_galaxy_red");
160
161            StaticAnimationType galaxy_white = new StaticAnimationType("GALAXY_WHITE");
162            galaxy_white.DisappearingRate = 0.65;
163            galaxy_white.InitialVisibilityRate = 0.165;
164            galaxy_white.TimeWithMinOpacity = 7;
165            galaxy_white.MinimumOpacity = 0.15;
166            galaxy_white.Texture = ALTKHandler.Loader.loadTexture("background_galaxy_white");
167
168            StaticAnimationType engine_smoke = new StaticAnimationType("ENGINE_SMOKE");
169            engine_smoke.DisappearingRate = 24.0;
170            engine_smoke.InitialVisibilityRate = 16.0;
171            engine_smoke.TimeEntirelyVisible = 1;
172            engine_smoke.Texture = ALTKHandler.Loader.loadTexture("engine_smoke");
173
174            StaticAnimationType wormhole_explosion_anim = new StaticAnimationType("WORMHOLE_EXPLOSION");
175            wormhole_explosion_anim.DisappearingRate = 24.0;
176            wormhole_explosion_anim.InitialVisibilityRate = 16.0;
177            wormhole_explosion_anim.TimeEntirelyVisible = 1;
178            wormhole_explosion_anim.Texture = ALTKHandler.Loader.loadTexture("wormhole_explosion_staticanim");
179
180            StaticAnimationType wormhole_appearing = new StaticAnimationType("WORMHOLE_APPEARING");
181            wormhole_appearing.DisappearingRate = 3.0;
182            wormhole_appearing.InitialVisibilityRate = 2.0;
183            wormhole_appearing.TimeEntirelyVisible = 1;
184            wormhole_appearing.Texture = ALTKHandler.Loader.loadTexture("wormhole_appearing");
185
186            StaticAnimTypes.Add(genExplosion);
187            StaticAnimTypes.Add(stars1);
188            StaticAnimTypes.Add(stars2);
189            StaticAnimTypes.Add(starSmoke);
190            StaticAnimTypes.Add(stars1);
191            StaticAnimTypes.Add(stars2);
192            StaticAnimTypes.Add(starSmoke);
193            StaticAnimTypes.Add(starsmoke_blue);
194            StaticAnimTypes.Add(starsmoke_red);
195            StaticAnimTypes.Add(starsmoke_white);
196            StaticAnimTypes.Add(galaxy);
197            StaticAnimTypes.Add(galaxy_blue);
198            StaticAnimTypes.Add(galaxy_red);
199            StaticAnimTypes.Add(galaxy_white);
200            StaticAnimTypes.Add(engine_smoke);
201            StaticAnimTypes.Add(wormhole_explosion_anim);
202            StaticAnimTypes.Add(wormhole_appearing);
203        }
204
205        /// <summary>
206        /// Allows the game component to update itself.
207        /// </summary>
208        /// <param name="gameTime">Provides a snapshot of timing values.</param>
209        public override void Update(GameTime gameTime)
210        {
211           
212
213            // TODO: Add your update code here
214            for (int sAnimId = 0; sAnimId < AnimInstances.Count; sAnimId++)
215            {
216                int uniqueId = AnimInstances[sAnimId].UniqueId;
217
218                // Pysyvät animaatiot
219                if (AnimInstances[sAnimId].getAnimClass().TimeEntirelyVisible == 0)
220                {
221
222                    // Animaatio maksimiläpinäkyvyydessään
223                    if (AnimInstances[sAnimId].Stage == 0)
224                    {
225                        AnimInstances[sAnimId].CurrentVisibility = AnimInstances[sAnimId].getAnimClass().MinimumOpacity;
226
227                        AnimInstances[sAnimId].CurrentTimeVisible++;
228
229                        if (AnimInstances[sAnimId].CurrentTimeVisible > AnimInstances[sAnimId].getAnimClass().TimeWithMinOpacity)
230                        {
231                            AnimInstances[sAnimId].CurrentTimeVisible = 0;
232                            AnimInstances[sAnimId].Stage = 1;
233                        }
234                    }
235                    // Tulossa näkyviin
236                    else if (AnimInstances[sAnimId].Stage == 1)
237                    {
238                        AnimInstances[sAnimId].CurrentVisibility = AnimInstances[sAnimId].CurrentVisibility +
239                            AnimInstances[sAnimId].getAnimClass().InitialVisibilityRate;
240
241                        if (AnimInstances[sAnimId].CurrentVisibility > 255.0)
242                        {
243                            AnimInstances[sAnimId].CurrentVisibility = 255;
244                            AnimInstances[sAnimId].Stage = 2;
245                        }
246                    }
247                    // Täysin näkyvissä
248                    else if (AnimInstances[sAnimId].Stage == 2)
249                    {
250                        AnimInstances[sAnimId].CurrentTimeVisible++;
251
252                        if (AnimInstances[sAnimId].CurrentTimeVisible > AnimInstances[sAnimId].getAnimClass().TimeEntirelyVisible)
253                        {
254                            AnimInstances[sAnimId].CurrentTimeVisible = 0;
255                            AnimInstances[sAnimId].Stage = 3;
256                        }
257                    }
258                    // Poistumassa näkyvistä
259                    else if (AnimInstances[sAnimId].Stage == 3)
260                    {
261                        AnimInstances[sAnimId].CurrentVisibility = AnimInstances[sAnimId].CurrentVisibility -
262                            AnimInstances[sAnimId].getAnimClass().DisappearingRate;
263
264                        if (AnimInstances[sAnimId].CurrentVisibility < AnimInstances[sAnimId].getAnimClass().MinimumOpacity)
265                        {
266                            AnimInstances[sAnimId].Stage = 0;
267                        }
268                    }
269                }
270                // Katoavat animaatiot
271                else
272                {
273                    // Animaatio on vasta tulossa näkyviin
274                    if (AnimInstances[sAnimId].Stage == 0)
275                    {
276                        AnimInstances[sAnimId].CurrentVisibility = AnimInstances[sAnimId].CurrentVisibility +
277                            AnimInstances[sAnimId].getAnimClass().InitialVisibilityRate;
278
279                        if (AnimInstances[sAnimId].CurrentVisibility > 255.0)
280                        {
281                            AnimInstances[sAnimId].CurrentVisibility = 255;
282                            AnimInstances[sAnimId].Stage = 1;
283                        }
284                    }
285                    // Animaatio on täysin näkyvissä
286                    else if (AnimInstances[sAnimId].Stage == 1)
287                    {
288                        AnimInstances[sAnimId].CurrentTimeVisible++;
289
290                        if (AnimInstances[sAnimId].CurrentTimeVisible == AnimInstances[sAnimId].getAnimClass().TimeEntirelyVisible)
291                        {
292                            AnimInstances[sAnimId].Stage = 2;
293                        }
294                    }
295                    // Animaatio on poistumassa näkyvistä
296                    else if (AnimInstances[sAnimId].Stage == 2)
297                    {
298                        AnimInstances[sAnimId].CurrentVisibility = AnimInstances[sAnimId].CurrentVisibility - AnimInstances[sAnimId].getAnimClass().DisappearingRate;
299
300                        if (AnimInstances[sAnimId].CurrentVisibility < 0.0)
301                        {
302
303                            AnimInstances.RemoveAt(sAnimId);
304
305                            continue;
306                        }
307                    }
308                }
309            }
310
311            base.Update(gameTime);
312        }
313
314        public override void Draw(GameTime gameTime)
315        {
316            GraphicsDevice device = spriteBatch.GraphicsDevice;
317            spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.NonPremultiplied);
318
319            for (int sAnimId = 0; sAnimId < AnimInstances.Count; sAnimId++)
320            {
321                StaticAnimInstance animInstance = AnimInstances[sAnimId];
322                Texture2D animTexture = StaticAnimTypes[animInstance.StaticAnimTypeId].Texture;
323
324                spriteBatch.Draw(
325                    animTexture, 
326                    new Rectangle(C.ToInt32(animInstance.Location.X),
327                        C.ToInt32(animInstance.Location.Y),
328                        animTexture.Width,
329                        animTexture.Height),
330                        new Color(255, 255, 255, Convert.ToInt32(animInstance.CurrentVisibility)));
331            }
332
333            spriteBatch.End();
334
335            base.Draw(gameTime);
336        }
337    }
338
339    public class StaticAnimationType
340    {
341        public StaticAnimationType() { }
342
343        public StaticAnimationType(string className)
344        {
345            ClassName = className;
346        }
347
348        Texture2D aTexture;
349        string aAssetPath;
350        string aClassName;
351        double aVisibilityRate;
352        double aDisappearingRate;
353        int aTimeEntirelyVisible;
354        double aMinOpacity = 128.0;
355        int aTimeMinOpacity;
356
357        public Texture2D Texture
358        {
359            get { return aTexture; }
360            set { aTexture = value; }
361        }
362
363        public string ClassName
364        {
365            get { return aClassName; }
366            set { aClassName = value; }
367        }
368
369        public string TexturePath
370        {
371            get { return aAssetPath; }
372            set { aAssetPath = value; }
373        }
374
375        public double InitialVisibilityRate
376        {
377            get { return aVisibilityRate; }
378            set { aVisibilityRate = value; }
379        }
380
381        public double DisappearingRate
382        {
383            get { return aDisappearingRate; }
384            set { aDisappearingRate = value; }
385        }
386
387        /// <summary>
388        /// The time the static animation stays entirely visible (zero transparency). 100 = 1 second.
389        /// </summary>
390        public int TimeEntirelyVisible
391        {
392            get { return aTimeEntirelyVisible; }
393            set { aTimeEntirelyVisible = value; }
394        }
395
396        public double MinimumOpacity
397        {
398            get { return aMinOpacity; }
399            set { aMinOpacity = value; }
400        }
401
402        public int TimeWithMinOpacity
403        {
404            get { return aTimeMinOpacity; }
405            set { aTimeMinOpacity = value; }
406        }
407    }
408
409    public class StaticAnimInstance
410    {
411        public StaticAnimInstance() { }
412
413        public StaticAnimInstance(int animTypeId, int uniqueId, Vector2 location)
414        {
415            StaticAnimTypeId = animTypeId;
416            UniqueId = uniqueId;
417            Location = location;
418        }
419
420        int aStage;
421        double aCurrentVisibility;
422        int aCurrentTimeVisible;
423        int aAnimTypeId;
424        int aUniqueId;
425        Vector2 aLocation;
426
427        /// <summary>
428        /// The current stage of the animation. 0 = appearing, 1 = entirely visible, 2 = disappearing
429        /// </summary>
430        public int Stage
431        {
432            get { return aStage; }
433            set { aStage = value; }
434        }
435
436        public double CurrentVisibility
437        {
438            get { return aCurrentVisibility; }
439            set { aCurrentVisibility = value; }
440        }
441
442        /// <summary>
443        /// The amount of time the static animation has been fully visible. After this is larger than the
444        /// AnimType's TimeEntirelyVisible, the anim will start disappearing.
445        /// </summary>
446        public int CurrentTimeVisible
447        {
448            get { return aCurrentTimeVisible; }
449            set { aCurrentTimeVisible = value; }
450        }
451
452        public int StaticAnimTypeId
453        {
454            get { return aAnimTypeId; }
455            set { aAnimTypeId = value; }
456        }
457
458        public int UniqueId
459        {
460            get { return aUniqueId; }
461            set { aUniqueId = value; }
462        }
463
464        public Vector2 Location
465        {
466            get { return aLocation; }
467            set { aLocation = value; }
468        }
469
470        public StaticAnimationType getAnimClass()
471        {
472            return StaticAnimHandler.StaticAnimTypes[StaticAnimTypeId];
473        }
474    }
475}
Note: See TracBrowser for help on using the repository browser.