source: 2015/23/ohjaajat/ValasPeliEsittely/ValasPeli/ValasPeli/ValasPeli.cs @ 7174

Revision 7173, 22.2 KB checked in by sieerinn, 3 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9/// <summary>
10/// Neljä hämmentynyttä, jalkansa katkaissutta sukeltajaa tutkii
11/// merenpohjaa ja törmää satunnaisiin taivasvalaisiin.
12/// Lopulta kolme tukehtuu tai vajoaa pohjaan.
13/// </summary>
14public class ValasPeli : PhysicsGame
15{
16    const double nopeus = 200;
17    const double hyppyNopeus = 750;
18    int pelaajiaLisatty = 0;
19
20    Image taysi = LoadImage("taysi");
21    Image tyhja = LoadImage("tyhja");
22    Image pohjaMoskaKuva = LoadImage("pohjamoska");
23    Image menuKuva = LoadImage("menu");
24    Image menuPainikeKuva = LoadImage("painike");
25    Image menuPainikeHoverKuva = LoadImage("painikeHover");
26    Image[] lonkerot = LoadImages("lonkeroo", "lonkeroo2");
27
28    //SoundEffect valaanKuolinHuuto = LoadSoundEffect("simo");
29
30    IntMeter voittoMittari = new IntMeter(0);
31    bool won = false;
32
33    Diver[] pelaajat = new Diver[3];
34
35    Image tukehtunutKuva = LoadImage("tukehtunut");
36    Image kuollutValas = LoadImage("valaskuoli");
37    Image[] pelaajanKuvat = LoadImages("s0001", "s0002", "s0003", "s0004", "s0005", "s0006");
38    Image[] pelaajaTukehtunutKuvat = LoadImages("tukehtunut");
39    Image[] valasKuvat = LoadImages("valas0001", "valas0002", "valas0003", "valas0004", "valas0005", "valas0006", "valas0007");
40    Image[] kultaValasKuvat = LoadImages("kultavalas0001", "kultavalas0002", "kultavalas0003", "kultavalas0004", "kultavalas0005", "kultavalas0006", "kultavalas0007");
41    Image[] kuplanKuvat = LoadImages("kupla0001", "kupla0002", "kupla0003", "kupla0004", "kupla0005", "kupla0006", "kupla0007");
42    Image[] pieniKuplaKuvat = LoadImages("pkupla0001", "pkupla0002", "pkupla0003", "pkupla0004", "pkupla0005", "pkupla0006", "pkupla0007");
43    Image[] alkuKuvat = LoadImages("3", "2", "1", "go");
44
45    Image nuoliOhjainKuva = LoadImage("arrows");
46    Image wasdOhjainKuva = LoadImage("wasd");
47    Image pad1OhjainKuva = LoadImage("pad1");
48    Image pad2OhjainKuva = LoadImage("pad2");
49    Image pad3OhjainKuva = LoadImage("pad3");
50    Image pad4OhjainKuva = LoadImage("pad4");
51
52    Image ohjeKuva = LoadImage("ohjeet");
53
54    Dictionary<Color, Image[]> pelaajaKuvaDict = new Dictionary<Color,Image[]>();
55    Dictionary<Color, Image[]> pelaajaTukehtunuDict = new Dictionary<Color, Image[]>();
56
57    Image[] LataaVaritettyKuva(Dictionary<Color, Image[]> dict, Image[] alkupKuvat, Color vari)
58    {
59        if (!dict.ContainsKey(vari))
60        {
61            dict.Add(vari, VaritaKuvat(alkupKuvat, vari));
62        }
63        return dict[vari];
64    }
65
66    public override void Begin()
67    {
68        //IsFullScreen = true;
69        Window.Width = (int)Level.Width;
70        Window.Height = (int)(Screen.Height * 0.9);
71        Alkuvalikko();
72        //AloitaPeli();
73    }
74
75    void Alkuvalikko()
76    {
77        Level.Background.CreateGradient(Color.Blue, Color.SkyBlue);
78
79        Timer kupla = new Timer();
80        kupla.Interval = 0.1;
81        kupla.Timeout += delegate
82        {
83            LisaaKerattava();
84            kupla.Interval = RandomGen.NextDouble(0.2, 1.0);
85        };
86        kupla.Start();
87
88        MultiSelectWindow alkuValikko = new MultiSelectWindow("Sukelluspeli", "Aloita peli", "Lopeta");
89        foreach(var button in alkuValikko.Buttons)
90        {
91            button.Image = menuPainikeKuva;
92            button.ImagePressed = menuPainikeHoverKuva;
93        }
94        alkuValikko.Image = menuKuva;
95        Add(alkuValikko);
96        alkuValikko.AddItemHandler(0, AloitaPeli);
97        alkuValikko.AddItemHandler(1, Exit);
98    }
99
100    /// <summary>
101    /// Aloittaa uuden pelin.
102    /// </summary>
103    void AloitaPeli()
104    {
105        ClearAll();
106
107        SmoothTextures = false;
108
109        LuoKentta();
110        Camera.ZoomFactor = 1.0;
111
112        Label kontrolliOhjeet = new Label();
113        kontrolliOhjeet.Image = ohjeKuva;
114        kontrolliOhjeet.Width = ohjeKuva.Width;
115        kontrolliOhjeet.Height = ohjeKuva.Height;
116        kontrolliOhjeet.LifetimeLeft = TimeSpan.FromSeconds(5);
117        kontrolliOhjeet.Bottom = -Window.Height/2 + ohjeKuva.Height/2;
118        Add(kontrolliOhjeet);
119
120        Label alkuLabel = new Label();
121        alkuLabel.Width = alkuKuvat[0].Width;
122        alkuLabel.Height = alkuKuvat[0].Height;
123        alkuLabel.Image = alkuKuvat[0];
124        Add(alkuLabel);
125
126        Timer alkuAjastin = new Timer();
127        alkuAjastin.Interval = 1.0;
128        alkuAjastin.Timeout += delegate
129        {
130            int index = (int) alkuAjastin.CurrentTime;
131            if (index < alkuKuvat.Length)
132            {
133                alkuLabel.Image = alkuKuvat[index];
134                alkuLabel.Width = alkuLabel.Image.Width;
135                alkuLabel.Height = alkuLabel.Image.Height;
136            }
137            else
138            {
139                alkuLabel.Destroy();
140                alkuAjastin.Stop();
141            }
142        };
143        alkuAjastin.Start();
144
145        // Painovoima tulee vasta hetken päästä, jotta valaita ehtii tulemaan.
146        Timer.SingleShot(5.0, delegate
147        {
148            Gravity = new Vector(0, -200);
149        });
150    }
151
152    /// <summary>
153    /// Luo kentän ja pelaajat.
154    /// </summary>
155    void LuoKentta()
156    {
157        double leveys = Window.Width;
158        pelaajiaLisatty = 0;
159
160        Level.CreateHorizontalBorders(0, false, Color.Black);
161
162        //PhysicsObject pohja = Level.CreateBottomBorder(0, true);
163        //AddCollisionHandler(pohja, "pelaaja", PelaajaTuhoutui);
164        //pohja.Color = Color.BrownGreen;
165
166        PhysicsObject pohja = PhysicsObject.CreateStaticObject(leveys, 600);
167        pohja.Top = Level.Bottom;
168        AddCollisionHandler(pohja, "pelaaja", PelaajaTuhoutui);
169        pohja.Color = Color.BrownGreen;
170        Add(pohja, 3);
171
172        PhysicsObject toppi = Level.CreateTopBorder(1, false);
173        AddCollisionHandler(toppi, "pelaaja", TyonnaPelaajaa);
174
175        Level.Background.CreateGradient(Color.Blue, Color.SkyBlue);
176
177        //pelaajat[0] = LuoPelaaja(new Vector(20, 200), pelaajanKuvat, NappaimistoOhjaimet);
178        //pelaajat[1] = LuoPelaaja(new Vector(-20, 200), punainen, OhjainOhjaimet(ControllerOne));
179        //pelaajat[2] = LuoPelaaja(new Vector(60, 200), vihrea, OhjainOhjaimet(ControllerTwo));
180        //pelaajat[3] = LuoPelaaja(new Vector(-60, 200), sininen, NappaimistoSurullinenKopio);
181
182        pelaajat[0] = LuoPelaaja(new Vector(-70, 200), Color.Yellow, OhjainOhjaimet(ControllerOne), pad1OhjainKuva);
183        pelaajat[1] = LuoPelaaja(new Vector(0, 200), Color.Red, OhjainOhjaimet(ControllerTwo), pad2OhjainKuva);
184        pelaajat[2] = LuoPelaaja(new Vector(70, 200), Color.Green, OhjainOhjaimet(ControllerThree), pad3OhjainKuva);
185        //pelaajat[3] = LuoPelaaja(new Vector(-60, 200), Color.Blue, OhjainOhjaimet(ControllerFour), pad4OhjainKuva);
186
187        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
188        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
189        Keyboard.Listen(Key.R, ButtonState.Pressed, AloitaPeli, "Restart");
190
191        LuoLevaa();
192
193        GameObject pohjamoska = new GameObject(leveys, 200);
194        pohjamoska.Bottom = Level.Bottom;
195        pohjamoska.Image = pohjaMoskaKuva;
196        Add(pohjamoska, 3);
197
198        #region Ajastimet
199        Timer.SingleShot(4.0, delegate
200        {
201            // Valaan luontiajastin.
202            Timer ajastin = new Timer();
203            ajastin.Interval = 0.1;
204            ajastin.Timeout += delegate
205            {
206                LisaaValas();
207                ajastin.Interval = RandomGen.NextDouble(2.0, 4.0);
208            };
209            ajastin.Start();
210
211            // Kivasti kopsittu.
212            Timer kupla = new Timer();
213            kupla.Interval = 2;
214            kupla.Timeout += delegate
215            {
216                LisaaKerattava();
217                kupla.Interval = RandomGen.NextDouble(0.2, 2.0);
218            };
219            kupla.Start();
220
221            won = false;
222            voittoMittari.Value = 0;
223            voittoMittari.MaxValue = pelaajiaLisatty - 1;
224            voittoMittari.UpperLimit += Voitto;
225        });
226        #endregion
227    }
228
229    /// <summary>
230    /// Levänluonti + animaatio
231    /// </summary>
232    private void LuoLevaa()
233    {
234        for (int i = 0; i < 20; i++)
235        {
236            LisaaLonkero();
237        }
238    }
239
240    /// <summary>
241    /// Zoomailee jännästi voittajapelaajaan
242    /// </summary>
243    void Voitto()
244    {
245        if (won)
246        {
247            return;
248        }
249        won = true;
250
251        Label mainosTeksti = new Label("  Kesällä järjestetään viikon kestäviä pelikursseja\n\nTule sinne tekemään peli joka on parempi kuin tämä!");
252        mainosTeksti.TextColor = Color.White;
253        mainosTeksti.Y = 300;
254        mainosTeksti.TextScale *= 1.3;
255        Add(mainosTeksti);
256
257        foreach(Diver sukeltaja in pelaajat)
258        {
259            if(sukeltaja.HasDrowned == false)
260            {
261                MessageDisplay.Add(sukeltaja.Name + " on voittanut kivasti.");
262                sukeltaja.IgnoresPhysicsLogics = true;
263                sukeltaja.IgnoresCollisionResponse = true;
264                sukeltaja.CollisionIgnoreGroup = 3;
265                sukeltaja.StopBreathing();
266                sukeltaja.LifeCounter = null;
267             
268
269                PhysicsObject voittaja = PhysicsObject.CreateStaticObject(sukeltaja.Width, sukeltaja.Height);
270                voittaja.IgnoresCollisionResponse = true;
271                voittaja.Image = sukeltaja.Image;
272                voittaja.Position = sukeltaja.Position;
273                voittaja.Animation = sukeltaja.Animation;
274                //voittaja.Animation.Start();
275                Add(voittaja);
276
277                sukeltaja.Destroy();
278
279                /*
280                Timer voittoAjastin = new Timer();
281                voittoAjastin.Interval = 0.5;
282                voittoAjastin.Timeout += delegate
283                {
284                    if (Camera.ZoomFactor < 3)
285                    {
286                        Camera.Follow(sukeltaja);
287                        Camera.Zoom((voittoAjastin.SecondCounter.Value + 1) * Camera.ZoomFactor);
288                    }
289                    else { voittoAjastin.Stop(); }
290                };
291                voittoAjastin.Start();
292                 */
293
294                Timer parempiVoittoAjastin = new Timer();
295                parempiVoittoAjastin.Interval = 0.05;
296                parempiVoittoAjastin.Timeout += delegate
297                {
298                    if (Camera.ZoomFactor < 2.5)
299                    {
300                        Camera.Follow(voittaja);
301                        Camera.Zoom(1.0 + (parempiVoittoAjastin.SecondCounter.Value * 0.01));
302                    }
303                    else { parempiVoittoAjastin.Stop(); }
304                };
305                parempiVoittoAjastin.Start();
306
307                Timer.SingleShot(5, AloitaPeli);
308            }
309        }
310    }
311
312    void TyonnaPelaajaa(PhysicsObject tormatty, PhysicsObject pelaaja)
313    {
314        pelaaja.Hit(new Vector(0, -3500));
315    }
316
317    void PelaajaTuhoutui(PhysicsObject tormatty, PhysicsObject pelaaja)
318    {
319        Diver sukeltaja = pelaaja as Diver;
320        sukeltaja.Drown();
321        MessageDisplay.Add(sukeltaja.Name + " on hukkunut!");
322        voittoMittari.Value++;
323
324        sukeltaja.LifeCounter = null;
325        sukeltaja.Destroy();
326
327        PhysicsObject tukehtunut = PhysicsObject.CreateStaticObject(sukeltaja.Width, sukeltaja.Height);
328        tukehtunut.IgnoresCollisionResponse = true;
329        tukehtunut.Image = sukeltaja.TukehdusKuvat[0];
330        tukehtunut.Position = sukeltaja.Position;
331        tukehtunut.Velocity = new Vector(0, 50);
332
333        Add(tukehtunut);
334    }
335
336    /// <summary>
337    /// Luodaan jotain kerättävää hurdur.
338    /// </summary>
339    private void LisaaKerattava()
340    {
341        PhysicsObject kerattava = PhysicsObject.CreateStaticObject(kuplanKuvat[0].Width, kuplanKuvat[0].Height); 
342        kerattava.Shape = Shape.Circle;
343        kerattava.Position = RandomGen.NextVector(Level.Left + 50, Level.Bottom, Level.Right - 50, Level.Bottom);
344        kerattava.Velocity = new Vector(0.0, (RandomGen.NextDouble(50, 300)));
345        kerattava.Oscillate(Vector.UnitX, 200, 0.1, RandomGen.NextDouble(0.0, 2.0 * Math.PI));
346        AddCollisionHandler(kerattava, "pelaaja", Hapeta);
347        kerattava.Image = kuplanKuvat[0];
348        kerattava.Animation = new Animation(kuplanKuvat);
349        kerattava.Animation.Start();
350        kerattava.IgnoresCollisionResponse = true;
351        kerattava.CollisionIgnoreGroup = 3;
352        Add(kerattava);
353    }
354
355    /// <summary>
356    /// Antaa pelaajalle lisää happea
357    /// </summary>
358    /// <param name="esine">esine, johon törmäsi</param>
359    /// <param name="pelaaja">pelaaja, joka törmäsi</param>
360    void Hapeta(PhysicsObject esine, PhysicsObject pelaaja)
361    {
362        Diver sukeltaja = pelaaja as Diver; 
363        ((Diver)pelaaja).Oxygen += sukeltaja.MaxOxygen/5;
364        esine.Destroy();
365    }
366
367    /// <summary>
368    /// Luo yksittäisen pelaajan.
369    /// </summary>
370    /// <param name="nappainLisaaja">Aliohjelma, joka lisää pelaajalle ohjaimet</param>
371    /// <returns>luotu pelaaja</returns>
372    Diver LuoPelaaja(Vector paikka, Color vari, Action<Diver> nappainLisaaja, Image ohjainKuva)
373    {
374        Image[] kuvat = LataaVaritettyKuva(pelaajaKuvaDict, pelaajanKuvat, vari);
375        Animation anim = new Animation(kuvat);
376        anim.FPS = 7;
377
378        Diver pelaaja = new Diver(pelaajanKuvat[0].Width, pelaajanKuvat[0].Height);
379        pelaaja.TukehdusKuvat = LataaVaritettyKuva(pelaajaTukehtunuDict, pelaajaTukehtunutKuvat, vari);
380        pelaaja.CollisionIgnoreGroup = 2;
381        pelaaja.Position = paikka;
382        pelaaja.Mass = 4.0;
383        pelaaja.Tag = "pelaaja";
384        pelaaja.Image = kuvat[0];
385        pelaaja.AnimWalk = anim;
386        pelaaja.AnimJump = anim;
387        pelaaja.AnimIdle = anim;
388        Add(pelaaja);
389
390        Label ohjain = new Label(ohjainKuva);
391        ohjain.Width = ohjainKuva.Width;
392        ohjain.Height = ohjainKuva.Height;
393        ohjain.Y = pelaaja.Height;
394        pelaaja.Add(ohjain);
395
396        Timer.SingleShot(7.0, delegate
397        {
398            ohjain.Destroy();
399        });
400
401        AddCollisionHandler(pelaaja, "valaskalanen", PompunSeuraukset);
402
403        pelaaja.LosingOxygen.Timeout += delegate { LuoKupla(pelaaja); };
404
405
406        pelaaja.LifeCounter.LowerLimit += delegate
407        {
408            PelaajaTuhoutui(null, pelaaja);
409        };
410
411        pelaaja.VisibleLife.BarImage = taysi;
412        pelaaja.VisibleLife.Image = tyhja;
413
414        pelaaja.Name = "Pelaaja " + ++pelaajiaLisatty;
415
416        nappainLisaaja(pelaaja);
417        return pelaaja;
418    }
419
420    /// <summary>
421    /// Valaantappo.
422    /// </summary>
423    /// <param name="pelaaja"></param>
424    /// <param name="kalanen"></param>
425    void PompunSeuraukset(PhysicsObject pelaaja, PhysicsObject kalanen)
426    {
427        Valas valas = kalanen as Valas;
428
429        if (valas.SuperValas)
430            return;
431
432        valas.PomppuLaskuri.Value--;
433        valas.Tag = "kalanen";
434        valas.Pompattu.Start();
435
436        if(valas.PomppuLaskuri.Value == valas.PomppuLaskuri.MinValue)
437        {
438            //valaanKuolinHuuto.Play();
439
440            PhysicsObject kuoleva = new PhysicsObject(valas.Width, valas.Height);
441            kuoleva.Shape = Shape.Circle;
442            kuoleva.Image = kuollutValas;
443           /* kuoleva.Animation = new Animation(valasKuvat);
444            kuoleva.Animation.FPS = 5;
445            kuoleva.Animation.Start(); */
446            kuoleva.Position = valas.Position;
447            kuoleva.IgnoresCollisionResponse = true;
448            kuoleva.IgnoresPhysicsLogics = true;
449            kuoleva.Velocity = new Vector(0, 40);
450            kuoleva.AngularVelocity = RandomGen.NextDouble(-0.2, 0.2);
451            Add(kuoleva);
452
453            Timer raadonSyoja = new Timer();
454            raadonSyoja.Interval = 30;
455            raadonSyoja.Timeout += delegate { kuoleva.Destroy(); raadonSyoja.Stop(); };
456            raadonSyoja.Start();
457
458            valas.Destroy();
459        }
460    }
461
462    /// <summary>
463    /// Kasilta syömään, huoneen palautus 10.
464    /// </summary>
465    /// <param name="pelaaja">Siivoa huoneesi</param>
466    void LuoKupla(Diver pelaaja)
467    {
468        if (pelaaja.HasDrowned == false)
469        {
470            PhysicsObject kupla = PhysicsObject.CreateStaticObject(kuplanKuvat[0].Width * 0.3, kuplanKuvat[0].Height * 0.3);
471            kupla.Shape = Shape.Circle;
472            kupla.Position = pelaaja.Position + new Vector(0, (pelaaja.Height * 0.5));
473            kupla.Velocity = new Vector(0.0, (RandomGen.NextDouble(50, 300)));
474            kupla.Oscillate(Vector.UnitX, 50, 0.1, RandomGen.NextDouble(0.0, 2.0 * Math.PI));
475            kupla.Image = pieniKuplaKuvat[0];
476            kupla.Animation = new Animation(pieniKuplaKuvat);
477            kupla.Animation.Start();
478            kupla.IgnoresCollisionResponse = true;
479            kupla.CollisionIgnoreGroup = 3;
480            Add(kupla);
481        }
482
483    }
484
485    /// <summary>
486    /// Lisää yksittäisen taivasvalaan pelikentälle
487    /// </summary>
488    void LisaaValas()
489    {
490        int todennakoisyys = RandomGen.NextInt(100);
491        bool super = todennakoisyys < 4;
492
493        Valas valas = new Valas(valasKuvat[0].Width, valasKuvat[0].Height, super);
494        valas.Shape = Shape.Circle;
495        valas.Image = valasKuvat[0];
496        valas.Animation = new Animation(valasKuvat);
497        valas.Animation.FPS = 5;
498        valas.Animation.Start();
499        valas.Position = RandomGen.NextVector(Level.Right, Level.Bottom + 100, Level.Right, Level.Top - 100);
500        valas.Velocity = new Vector(RandomGen.NextDouble(-300, -20), 0.0);
501        valas.Oscillate(Vector.UnitY, 100, 0.1, RandomGen.NextDouble(0.0, 2.0 * Math.PI));
502        valas.CollisionIgnoreGroup = 3;
503        valas.Tag = "valaskalanen";
504        Add(valas);
505
506        valas.Pompattu.Interval = 0.4;
507        valas.Pompattu.Timeout += delegate { valas.Tag = "valaskalanen"; valas.Pompattu.Stop(); };
508
509        if (super) //SUPERVALAS
510        {
511            valas.Animation = new Animation(kultaValasKuvat);
512            valas.Animation.FPS = 5;
513            valas.Animation.Start();
514            valas.Position -= new Vector(0, valas.Height / 2);  //näin valas ei tapa meitä aina
515            valas.Size *= 3;
516        }
517    }
518
519    void LisaaLonkero()
520    {
521        GameObject lonkero = new GameObject(40, 70);
522        lonkero.Position = new Vector(RandomGen.NextDouble(Level.Left, Level.Right), Level.Bottom + RandomGen.NextDouble(50,90));
523        lonkero.Image = lonkerot[0];
524        lonkero.Animation = new Animation(lonkerot);
525        lonkero.Animation.FPS = RandomGen.NextInt(1,4);
526        lonkero.Animation.Start();
527        Add(lonkero);
528    }
529
530    /// <summary>
531    /// Lisää vaihtoehtoiset näppäimet yhdelle pelaajista
532    /// </summary>
533    /// <param name="pelaaja"></param>
534    void NappaimistoSurullinenKopio(Diver pelaaja)
535    {
536        Keyboard.Listen(Key.A, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja, Direction.Left);
537        Keyboard.Listen(Key.D, ButtonState.Down, Liikuta, "Liikkuu oikealle", pelaaja, Direction.Right);
538        Keyboard.Listen(Key.W, ButtonState.Down, Hyppaa, "Pelaaja hyppää", pelaaja, hyppyNopeus);
539        Keyboard.Listen(Key.S, ButtonState.Down, Sukella, "Pelaaja sukeltaa", pelaaja, new Vector(0, -nopeus));
540    }
541
542    void Sukella(Diver hahmo, Vector impulssi)
543    {
544        hahmo.Push(impulssi *2);
545    }
546
547    void NappaimistoOhjaimet(Diver pelaaja)
548    {
549        Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja, Direction.Left);
550        Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikkuu oikealle", pelaaja, Direction.Right);
551        Keyboard.Listen(Key.Up, ButtonState.Down, Hyppaa, "Pelaaja hyppää", pelaaja, hyppyNopeus);
552        Keyboard.Listen(Key.Down, ButtonState.Down, Sukella, "Pelaaja sukeltaa", pelaaja, new Vector(0, -nopeus));
553    }
554
555    Action<Diver> OhjainOhjaimet(GamePad ohjain)
556    {
557        return delegate(Diver pelaaja)
558        {
559            ohjain.Listen(Button.DPadLeft, ButtonState.Down, Liikuta, "Pelaaja liikkuu vasemmalle", pelaaja, Direction.Left);
560            ohjain.Listen(Button.DPadRight, ButtonState.Down, Liikuta, "Pelaaja liikkuu oikealle", pelaaja, Direction.Right);
561            ohjain.Listen(Button.A, ButtonState.Down, Hyppaa, "Pelaaja hyppää", pelaaja, hyppyNopeus);
562            ohjain.Listen(Button.DPadDown, ButtonState.Down, Sukella, "Pelaaja sukeltaa", pelaaja, new Vector(0, -nopeus));
563
564            ohjain.ListenAnalog(AnalogControl.LeftStick, 0.1, LiikutaTatilla, null, pelaaja);
565        };
566    }
567
568    void Liikuta(Diver hahmo, Direction suunta)
569    {
570        hahmo.Walk(suunta);
571    }
572
573    void LiikutaTatilla(AnalogState tatti, Diver hahmo)
574    {
575        if (tatti.StateVector.Magnitude > 0.15)
576            hahmo.Walk(tatti.StateVector.X > 0? Direction.Right : Direction.Left);
577
578        if (tatti.StateVector.Y < 0)
579            Sukella(hahmo, new Vector(0, -nopeus));
580    }
581
582    void Hyppaa(Diver hahmo, double nopeus)
583    {
584        if (hahmo.Top < Level.Top - hahmo.Height/2)
585            hahmo.Jump(nopeus);
586    }
587
588    Image VaritaKuva(Image kuva, Color vari)
589    {
590        Image uusi = new Image(kuva.Width, kuva.Height, Color.Transparent);
591        for (int y = 0; y < kuva.Height; y++)
592        {
593            for (int x = 0; x < kuva.Width; x++)
594            {
595                double suhde = 0.0;
596                if (Math.Abs(kuva[y, x].GreenComponent - 255) < 40)
597                {
598                    suhde = 1.0;
599                }
600                if (kuva[y, x].AlphaComponent == 0)
601                {
602                    suhde = 0.0;
603                }
604                uusi[y, x] = Color.Lerp(kuva[y, x], vari, suhde);
605            }
606        }
607        return uusi;
608    }
609
610    Image[] VaritaKuvat(Image[] kuvat, Color vari)
611    {
612        Image[] uudet = new Image[kuvat.Length];
613        for (int i = 0; i < kuvat.Length; i++)
614        {
615            uudet[i] = VaritaKuva(kuvat[i], vari);
616        }
617        return uudet;
618    }
619}
Note: See TracBrowser for help on using the repository browser.