source: 2012/09-22/SanteriH/Kynari/Kynari/Kynari/Kynari.cs @ 3955

Revision 3955, 38.2 KB checked in by sieerinn, 8 years ago (diff)
Line 
1using System;
2
3using Jypeli;
4using Jypeli.Widgets;
5using Jypeli.Assets;
6using Jypeli.Controls;
7using Physics2DDotNet.Ignorers;
8
9public class Pelaaja : PlatformCharacter
10{
11    public bool voikoPoimiaAseen { get; set; }
12    public Explosion ViimeisinRajahdys { get; set; }
13    public DoubleMeter HPLaskuri { get; set; }
14    public Pelaaja(double width, double height, Shape shape)
15        : base(width, height, shape)
16    {
17        voikoPoimiaAseen = true;
18    }
19}
20
21// Yksinkertainen tasohyppely.
22public class Kynari : PhysicsGame
23{
24    #region Muuttujat
25
26    const double LIIKEVOIMA = 400;
27    const double HYPPYVOIMA = 850;
28    const double RUUDUNLEVEYS = 30;
29    const double RUUDUNKORKEUS = 30;
30    string Aseet = "Kaikki aseet";
31    string PowerUpit = "Päällä";
32    string SailytaAse = "Kyllä";
33    int PISTEMAARA_JOLLA_VOITTAA_PELIN = 3;
34    int kentta = 1;
35
36    Pelaaja pelaaja1 = new Pelaaja(40, 40, Shape.Circle);
37    Pelaaja pelaaja2 = new Pelaaja(40, 40, Shape.Circle);
38    //DoubleMeter hpLaskuri1 = new DoubleMeter(100);
39    //DoubleMeter hpLaskuri2 = new DoubleMeter(100);
40
41    Image kranaatinheittimenkuva = LoadImage("grenadelauncher");
42    Image kranaatinkuva = LoadImage("grenade");
43    Image magnumkuva = LoadImage("magnum");
44    Image norsu = LoadImage("norsu");
45    Image haulikonkuva = LoadImage("shotgun");
46    Image pistoolinkuva = LoadImage("pistol");
47    Image kivaarinkuva = LoadImage("assaultrifle");
48    Image raketinheittimenkuva = LoadImage("rocketlauncher");
49    Image raketinkuva = LoadImage("rocket");
50    Image sniperinkuva = LoadImage("sniper");
51    Image powerupinkuva = LoadImage("upgrade");
52    bool saaAmpua = false;
53    //bool peliohi = false;
54
55    SoundEffect hyppyAani = LoadSoundEffect("hyppays");
56
57    ProgressBar hpNaytto;
58    ProgressBar hpNaytto2;
59
60    IntMeter pelaajan1Pisteet;
61    IntMeter pelaajan2Pisteet;
62
63    #endregion
64
65    #region Alustukset
66    public override void Begin()
67    {
68        pelaajan1Pisteet = new IntMeter(0);
69        pelaajan2Pisteet = new IntMeter(0);
70
71        DrawPerimeter = false; // ei haluta piirtää kentän reunoja
72        LuoAlkuValikko();
73    }
74
75    void AloitaUusiPeli()
76    {
77
78        MessageDisplay.Clear();
79        // ladataan kenttä
80        //seuraavaKentta();
81        LuoKentta();
82        lisaaNappaimet();
83        LisaaLaskurit();
84        LisaaHPNaytot();
85        naytaTiedot();
86        //peliohi = false;
87        saaAmpua = false;
88        Timer.SingleShot(0.1, delegate
89        {
90            saaAmpua = true;
91        });
92    }
93    #endregion
94
95
96    #region KentanLataus
97
98    void LuoKentta()
99    {
100        ClearAll();
101        TileMap ruudut = TileMap.FromLevelAsset("kentta"+kentta);
102        ruudut.SetTileMethod('x', LuoReuna);
103        ruudut.SetTileMethod('t', LuoTaso);
104        ruudut.SetTileMethod('l', LuoLyhytTaso);
105        ruudut.SetTileMethod('p', LuoPitkaTaso);
106        ruudut.SetTileMethod('k', LuoKeskipitkaTaso);
107        ruudut.SetTileMethod('j', LuoLyhytPystyTaso);
108        ruudut.SetTileMethod('z', LuoLattia);
109        ruudut.SetTileMethod('c', LuoSeina);
110        if (Aseet == "Paljon aseita" || Aseet == "Kaikki aseet") { ruudut.SetTileMethod('A', LuoAse, new Vector(39, 13), "Kivääri", kivaarinkuva); }
111        if (Aseet == "Kaikki aseet") { ruudut.SetTileMethod('G', LuoAse, new Vector(42, 15), "Kranaatinheitin", kranaatinheittimenkuva); }
112        if (Aseet == "Paljon aseita" || Aseet == "Kaikki aseet") { ruudut.SetTileMethod('S', LuoAse, new Vector(42, 10), "Haulikko", haulikonkuva); }
113        if (Aseet != "Ei aseita") { ruudut.SetTileMethod('M', LuoAse, new Vector(17, 12), "Magnum", magnumkuva); }
114        if (Aseet == "Vähän aseita") { ruudut.SetTileMethod('A', LuoAse, new Vector(17, 12), "Magnum", magnumkuva); }
115        if (Aseet == "Vähän aseita") { ruudut.SetTileMethod('S', LuoAse, new Vector(17, 12), "Magnum", magnumkuva); }
116        if (Aseet == "Kaikki aseet") { ruudut.SetTileMethod('R', LuoAse, new Vector(48, 15), "Raketinheitin", raketinheittimenkuva); }
117        if (Aseet == "Kaikki aseet") { ruudut.SetTileMethod('U', LuoAse, new Vector(42, 11), "Sniper", sniperinkuva); }
118        if (PowerUpit == "Päällä") { ruudut.SetTileMethod('+', LuoPowerUp, new Vector(16, 20), "Power Up", powerupinkuva); }
119        ruudut.SetTileMethod('1', delegate(Vector paikka, double leveys, double korkeus) { pelaaja1 = LuoPelaaja(paikka, leveys, korkeus, pelaaja1); });
120        ruudut.SetTileMethod('2', delegate(Vector paikka, double leveys, double korkeus) { pelaaja2 = LuoPelaaja(paikka, leveys, korkeus, pelaaja2); });
121        ruudut.Execute(RUUDUNLEVEYS, RUUDUNKORKEUS);
122        Level.Background.CreateGradient(Color.White, Color.Gray);
123        Gravity = new Vector(0, -1500);
124
125        Timer timer = new Timer();
126        timer.Interval = 0.1;
127        timer.Timeout += delegate { TarkistaReunat(Level.Right - 1.5 * RUUDUNLEVEYS, Level.Top - 1.5 * RUUDUNKORKEUS); };
128        timer.Start();
129    }
130
131    void LuoReuna(Vector paikka, double leveys, double korkeus)
132    {
133        PhysicsObject reuna = new PhysicsObject(leveys, korkeus);
134        reuna.Position = paikka;
135        reuna.Color = Color.Gray;
136        reuna.Tag = "reuna";
137        reuna.MakeStatic();
138        Add(reuna);
139    }
140
141    void LuoKeskipitkaTaso(Vector paikka, double leveys, double korkeus)
142    {
143        PhysicsObject taso = new PhysicsObject(leveys * 4, korkeus);
144        taso.Position = paikka + new Vector(leveys * 1.5, 0);
145        taso.Color = Color.Gray;
146        taso.Tag = "taso";
147        taso.MakeStatic();
148        Add(taso);
149    }
150
151    void LuoLyhytPystyTaso(Vector paikka, double leveys, double korkeus)
152    {
153        PhysicsObject taso = new PhysicsObject(leveys, korkeus * 2);
154        taso.Position = paikka + new Vector(0, -korkeus * 0.5);
155        taso.Color = Color.Gray;
156        taso.Tag = "taso";
157        taso.MakeStatic();
158        Add(taso);
159    }
160
161    void LuoLattia(Vector paikka, double leveys, double korkeus)
162    {
163        PhysicsObject reuna = new PhysicsObject(leveys * 58, korkeus);
164        reuna.Position = paikka + new Vector(leveys * 28.5, 0);
165        reuna.Color = Color.Gray;
166        reuna.Tag = "reuna";
167        reuna.MakeStatic();
168        Add(reuna);
169    }
170
171    void LuoSeina(Vector paikka, double leveys, double korkeus)
172    {
173        PhysicsObject reuna = new PhysicsObject(leveys, korkeus * 32);
174        reuna.Position = paikka + new Vector(0, -korkeus * 15.5);
175        reuna.Color = Color.Gray;
176        reuna.Tag = "reuna";
177        reuna.MakeStatic();
178        Add(reuna);
179    }
180
181    void LuoLyhytTaso(Vector paikka, double leveys, double korkeus)
182    {
183        PhysicsObject taso = new PhysicsObject(leveys * 3, korkeus);
184        taso.Position = paikka + new Vector(leveys * 1, 0);
185        taso.Color = Color.Gray;
186        taso.Tag = "taso";
187        taso.MakeStatic();
188        Add(taso);
189    }
190
191    void LuoPitkaTaso(Vector paikka, double leveys, double korkeus)
192    {
193        PhysicsObject taso = new PhysicsObject(leveys * 5, korkeus);
194        taso.Position = paikka + new Vector(leveys * 2, 0);
195        taso.Color = Color.Gray;
196        taso.Tag = "taso";
197        taso.MakeStatic();
198        Add(taso);
199    }
200
201    void LuoTaso(Vector paikka, double leveys, double korkeus)
202    {
203        PhysicsObject taso = new PhysicsObject(leveys, korkeus);
204        taso.Position = paikka;
205        taso.Color = Color.Gray;
206        taso.Tag = "taso";
207        taso.MakeStatic();
208        Add(taso);
209    }
210
211
212    void TarkistaReunat(double leveys, double korkeus)
213    {
214        if (pelaaja1.Position.X < -leveys) pelaaja1.Position = new Vector(-leveys, pelaaja1.Position.Y);
215        if (pelaaja1.Position.X > leveys) pelaaja1.Position = new Vector(leveys, pelaaja1.Position.Y);
216        if (pelaaja1.Position.Y < -korkeus) pelaaja1.Position = new Vector(pelaaja1.Position.X, -korkeus);
217        if (pelaaja1.Position.Y > korkeus) pelaaja1.Position = new Vector(pelaaja1.Position.Y, korkeus);
218        if (pelaaja2.Position.X < -leveys) pelaaja2.Position = new Vector(-leveys, pelaaja2.Position.Y);
219        if (pelaaja2.Position.X > leveys) pelaaja2.Position = new Vector(leveys, pelaaja2.Position.Y);
220        if (pelaaja2.Position.Y < -korkeus) pelaaja2.Position = new Vector(pelaaja2.Position.X, -korkeus);
221        if (pelaaja2.Position.Y > korkeus) pelaaja2.Position = new Vector(pelaaja2.Position.Y, korkeus);
222    }
223
224    void LuoAlkuValikko()
225    {
226        ClearAll();
227        NollaaLaskurit();
228        MultiSelectWindow alkuValikko = new MultiSelectWindow("Kynäri",
229        "Aloita peli", "Asetukset", "Lopeta");
230        Add(alkuValikko);
231        alkuValikko.AddItemHandler(0, LuoKenttaValikko);
232        alkuValikko.AddItemHandler(1, LuoAsetukset);
233        alkuValikko.AddItemHandler(2, Exit);
234        alkuValikko.DefaultCancel = 1;
235        alkuValikko.Color = Color.Gray;
236        Level.BackgroundColor = Color.Gray;
237    }
238
239    void LuoAsetukset()
240    {
241        ClearAll();
242        MultiSelectWindow asetukset = new MultiSelectWindow("Asetukset", "Voittoon tarvittava pistemäärä: "+ PISTEMAARA_JOLLA_VOITTAA_PELIN,
243        "Kentällä olevat aseet: "+ Aseet, "Power Upit: "+ PowerUpit, "Säilytä aseet erien välissä: "+ SailytaAse,"Takaisin");
244        asetukset.AddItemHandler(0, AsetaPistemaara);
245        asetukset.AddItemHandler(1, AsetaAseet);
246        asetukset.AddItemHandler(2, AsetaPowerUpit);
247        asetukset.AddItemHandler(3, AsetaSailytaAse);
248        asetukset.AddItemHandler(4, LuoAlkuValikko);
249        asetukset.Color = Color.Gray;
250        asetukset.DefaultCancel = 4;
251        Add(asetukset);
252    }
253
254    void AsetaSailytaAse()
255    {
256        if (SailytaAse == "Ei")
257        {
258            SailytaAse = "Kyllä";
259            LuoAsetukset();
260            return;
261        }
262        if (SailytaAse == "Kyllä")
263        {
264            SailytaAse = "Ei";
265            LuoAsetukset();
266            return;
267        }
268        else
269        {
270            SailytaAse = "Kyllä";
271        }
272    }
273
274    void AsetaPistemaara()
275    {
276        if (PISTEMAARA_JOLLA_VOITTAA_PELIN == 1)
277        {
278            PISTEMAARA_JOLLA_VOITTAA_PELIN = 3;
279            LuoAsetukset();
280            return;
281        }
282        if (PISTEMAARA_JOLLA_VOITTAA_PELIN == 3) 
283        {
284            PISTEMAARA_JOLLA_VOITTAA_PELIN = 5;
285            LuoAsetukset();
286            return;
287        }
288        if (PISTEMAARA_JOLLA_VOITTAA_PELIN == 5)
289        {
290            PISTEMAARA_JOLLA_VOITTAA_PELIN = 7;
291            LuoAsetukset();
292            return;
293        }
294        if (PISTEMAARA_JOLLA_VOITTAA_PELIN == 7)
295        {
296            PISTEMAARA_JOLLA_VOITTAA_PELIN = 10;
297            LuoAsetukset();
298            return;
299        }
300        if (PISTEMAARA_JOLLA_VOITTAA_PELIN == 10)
301        {
302            PISTEMAARA_JOLLA_VOITTAA_PELIN = 1;
303            LuoAsetukset();
304            return;
305        }
306        else
307        {
308            PISTEMAARA_JOLLA_VOITTAA_PELIN = 3;
309            LuoAsetukset();
310        }
311       
312    }
313
314    void AsetaAseet()
315    {
316        if (Aseet == "Ei aseita")
317        {
318            Aseet = "Vähän aseita";
319            LuoAsetukset();
320            return;
321        }
322        if (Aseet == "Vähän aseita")
323        {
324            Aseet = "Paljon aseita";
325            LuoAsetukset();
326            return;
327        }
328        if (Aseet == "Paljon aseita")
329        {
330            Aseet = "Kaikki aseet";
331            LuoAsetukset();
332            return;
333        }
334        if (Aseet == "Kaikki aseet")
335        {
336            Aseet = "Ei aseita";
337            LuoAsetukset();
338            return;
339        }
340        else
341        {
342            Aseet = "Kaikki aseet";
343            LuoAsetukset();
344        }
345    }
346
347    void AsetaPowerUpit()
348    {
349        if (PowerUpit == "Pois")
350        {
351            PowerUpit = "Päällä";
352            LuoAsetukset();
353            return;
354        }
355        if (PowerUpit == "Päällä")
356        {
357            PowerUpit = "Pois";
358            LuoAsetukset();
359            return;
360        }
361        else
362        {
363            PowerUpit = "Päällä";
364            LuoAsetukset();
365        }
366    }
367
368    void LuoKenttaValikko()
369    {
370        ClearAll();
371        MultiSelectWindow kenttaValikko = new MultiSelectWindow("Kenttävalikko", "Kenttä 1",
372        "Kenttä 2", "Takaisin");
373        kenttaValikko.AddItemHandler(0, LuoKentta1);
374        kenttaValikko.AddItemHandler(1, LuoKentta2);
375        kenttaValikko.AddItemHandler(2, LuoAlkuValikko);
376        kenttaValikko.Color = Color.Gray;
377        kenttaValikko.DefaultCancel = 2;
378        Add(kenttaValikko);
379    }
380
381    void LuoKentta1()
382    {
383        kentta = 1;
384        uusiPeli();
385    }
386
387    void LuoKentta2()
388    {
389        kentta = 2;
390        uusiPeli();
391    }
392
393    void luoTasot()
394    {
395        PhysicsObject alusta = new PhysicsObject(Level.Width, 300);
396        alusta.Color = Color.Gray;
397        alusta.X = 0;
398        alusta.Y = Level.Bottom - alusta.Height / 2;
399        Add(alusta);
400
401        lisaaPieniTaso(-200, -350);
402        lisaaPieniTaso(0, -400);
403        lisaaPieniTaso(100, -300);
404        lisaaPieniTaso(400, -350);
405        lisaaPieniTaso(450, -200);
406        lisaaPieniTaso(-500, -400);
407        lisaaPieniTaso(-550, -200);
408        lisaaPieniTaso(-400, -300);
409        lisaaPieniTaso(-150, -150);
410        lisaaPieniTaso(-870, -350);
411        lisaaPieniTaso(-700, -400);
412
413        lisaaPieniTaso(600, -300);
414        lisaaPieniTaso(850, -300);
415        lisaaPieniTaso(750, -400);
416        lisaaPieniTaso(200, -200);
417        lisaaPieniTaso(-200, -150);
418
419        lisaaPystyTaso(600, -450);
420        lisaaPystyTaso(-600, -500);
421        lisaaPystyTaso(0, -450);
422
423        lisaaReuna(-1375, 0);
424        lisaaReuna(1375, 0);
425    }
426
427    void LisaaHPNaytot()
428    {
429        // luodaan elämänäyttö
430        hpNaytto = new ProgressBar(250, 30);
431        //hpNaytto.Angle = Angle.FromDegrees(90);
432        hpNaytto.BarColor = Color.LightGreen;
433        hpNaytto.Color = Color.Red;
434        hpNaytto.BindTo(pelaaja1.HPLaskuri);
435        hpNaytto.Position = new Vector(Screen.LeftSafe + 300, Screen.TopSafe - 170);
436        Add(hpNaytto);
437
438        hpNaytto2 = new ProgressBar(250, 30);
439        //hpNaytto2.Angle = Angle.FromDegrees(90);
440        hpNaytto2.BarColor = Color.LightGreen;
441        hpNaytto2.Color = Color.Red;
442        hpNaytto2.BindTo(pelaaja2.HPLaskuri);
443        hpNaytto2.Position = new Vector(Screen.RightSafe - 300, Screen.TopSafe - 170);
444        Add(hpNaytto2);
445    }
446
447    void LisaaLaskurit()
448    {
449        LuoPisteLaskuri(Screen.Left + 100.0, Screen.Top - 175.0, pelaajan1Pisteet);
450        LuoPisteLaskuri(Screen.Right - 100.0, Screen.Top - 175.0, pelaajan2Pisteet);
451        pelaajan1Pisteet.MaxValue = PISTEMAARA_JOLLA_VOITTAA_PELIN;
452        pelaajan2Pisteet.MaxValue = PISTEMAARA_JOLLA_VOITTAA_PELIN;
453        pelaajan1Pisteet.UpperLimit += delegate() { PelaajaVoittaa(pelaaja1, "Pelaaja 1", pelaaja2, pelaajan2Pisteet); };
454        pelaajan2Pisteet.UpperLimit += delegate() { PelaajaVoittaa(pelaaja2, "Pelaaja 2", pelaaja1, pelaajan1Pisteet); };
455    }
456
457    void NollaaLaskurit()
458    {
459        pelaajan1Pisteet.Reset();
460        pelaajan2Pisteet.Reset();
461    }
462
463    IntMeter LuoPisteLaskuri(double x, double y, IntMeter laskuri)
464    {
465        Label naytto = new Label();
466        naytto.BindTo(laskuri);
467        naytto.X = x;
468        naytto.Y = y;
469        Add(naytto);
470        return laskuri;
471    }
472
473    void PelaajaVoittaa(Pelaaja voittaja, String voittajanNimi, Pelaaja haviaja, IntMeter haviajanPisteet)
474    {
475        MessageDisplay.Clear();
476        if (voittaja.IsDestroying && haviajanPisteet.Value == haviajanPisteet.MaxValue)
477        {
478            MessageDisplay.Add("Tasapeli!");
479        }
480        else
481        {
482            MessageDisplay.Add(voittajanNimi + " voittaa!");
483        }
484
485    }
486
487    //Vanha
488    void Pelaaja1Voitti()
489    {
490
491        MessageDisplay.Clear();
492        if (pelaaja1.IsDestroying && pelaajan2Pisteet.Value == pelaajan2Pisteet.MaxValue)
493        {
494            MessageDisplay.Add("Tasapeli!");
495        }
496        else
497        {
498            MessageDisplay.Add("Pelaaja 1 voittaa!");
499        }
500        MessageDisplay.X = 0;
501    }
502
503    //Vanha
504    void Pelaaja2Voitti()
505    {
506        MessageDisplay.Clear();
507        if (pelaaja2.IsDestroying && pelaajan1Pisteet.Value == pelaajan1Pisteet.MaxValue)
508        {
509            MessageDisplay.Add("Tasapeli!");
510        }
511        else
512        {
513            MessageDisplay.Add("Pelaaja 2 voittaa!");
514        }
515        MessageDisplay.X = 0;
516
517    }
518
519    void lisaaPieniTaso(double x, double y)
520    {
521        PhysicsObject taso = PhysicsObject.CreateStaticObject(100, 30, Shape.Rectangle);
522        taso.Color = Color.Gray;
523        taso.X = x;
524        taso.Y = y;
525        Add(taso);
526    }
527
528    void lisaaReuna(double x, double y)
529    {
530        PhysicsObject taso = PhysicsObject.CreateStaticObject(1000, 1000, Shape.Rectangle);
531        taso.Color = Color.Gray;
532        taso.X = x;
533        taso.Y = y;
534        Add(taso);
535    }
536
537    void lisaaPystyTaso(double x, double y)
538    {
539        PhysicsObject taso = PhysicsObject.CreateStaticObject(30, 100, Shape.Rectangle);
540        taso.Color = Color.Gray;
541        taso.X = x;
542        taso.Y = y;
543        Add(taso);
544    }
545
546    Pelaaja LuoPelaaja(Vector paikka, double leveys, double korkeus, Pelaaja pelaaja)
547    {
548        string ase = "Pistooli";
549        if (pelaaja.Weapon != null && SailytaAse == "Kyllä") { ase = pelaaja.Weapon.Tag.ToString(); }
550        pelaaja = new Pelaaja(40, 40, Shape.Circle);
551        pelaaja.Image = norsu;
552        pelaaja.Position = paikka;
553        pelaaja.Tag = "pelaaja";
554
555        pelaaja.HPLaskuri = new DoubleMeter(100, 0, 100);
556        pelaaja.HPLaskuri.MaxValue = 100;
557        pelaaja.HPLaskuri.Value = 100;
558        pelaaja.HPLaskuri.LowerLimit += delegate()
559        {
560            PelaajaKuoli(pelaaja);
561        };
562        Add(pelaaja);
563
564        LuoAsePelaajalle(ase, pelaaja);
565        return pelaaja;
566    }
567
568    void PelaajaKuoli(Pelaaja pelaaja)
569    {
570        if (pelaaja.IsDestroying)
571        {
572            return;
573        }
574
575        pelaaja.Destroy();
576        PudotaAseenHahmo(pelaaja);
577        MessageDisplay.Clear();
578        MessageDisplay.X = 0;
579
580        if (pelaaja == pelaaja1)
581        {
582            pelaajan2Pisteet.Value += 1;
583
584            if (!(pelaajan1Pisteet.Value == pelaajan1Pisteet.MaxValue || pelaajan2Pisteet.Value == pelaajan2Pisteet.MaxValue))
585            {
586                if (pelaaja2.IsDestroying && pelaajan1Pisteet.Value != pelaajan1Pisteet.MaxValue)
587                {
588                    MessageDisplay.Clear();
589                    MessageDisplay.Add("Erä tasan!");
590                }
591                else if (pelaajan1Pisteet.Value != pelaajan1Pisteet.MaxValue)
592                {
593                    MessageDisplay.Add("Pelaaja 2 voitti erän!");
594                }
595
596                Timer.SingleShot(3.0, AloitaUusiPeli);
597            }
598            else if (pelaajan2Pisteet.Value == pelaajan2Pisteet.MaxValue)
599            {
600                Pelaaja2Voitti();
601                ClearTimers();
602                Timer.SingleShot(3.0, LuoAlkuValikko);
603            }
604        }
605
606        if (pelaaja == pelaaja2)
607        {
608            pelaajan1Pisteet.Value += 1;
609
610            if (!(pelaajan2Pisteet.Value == pelaajan2Pisteet.MaxValue || pelaajan1Pisteet.Value == pelaajan1Pisteet.MaxValue))
611            {
612                if (pelaaja1.IsDestroying && pelaajan2Pisteet.Value != pelaajan2Pisteet.MaxValue)
613                {
614                    MessageDisplay.Clear();
615                    MessageDisplay.Add("Erä tasan!");
616                }
617                else if (pelaajan1Pisteet.Value != pelaajan2Pisteet.MaxValue)
618                {
619                    MessageDisplay.Add("Pelaaja 1 voitti erän!");
620                }
621
622                Timer.SingleShot(3.0, AloitaUusiPeli);
623            }
624            else if (pelaajan1Pisteet.Value == pelaajan1Pisteet.MaxValue)
625            {
626                Pelaaja1Voitti();
627                ClearTimers();
628                Timer.SingleShot(3.0, LuoAlkuValikko);
629            }
630        }
631
632    }
633    void keraaPowerUp(PhysicsObject powerup, Pelaaja pelaaja)
634    {
635        powerup.Destroy();
636        PaivitaAse(pelaaja.Weapon.Tag.ToString(), pelaaja);
637        naytaTiedot();
638    }
639
640    void keraaAse(PhysicsObject ase, Pelaaja pelaaja)
641    {
642        if (!pelaaja.voikoPoimiaAseen) return;
643        ase.Destroy();
644        PudotaAseenHahmo(pelaaja); // tiputtaa asetta vastaavan fysiikkaolion maahan kerättäväksi uudestaan
645        LuoAsePelaajalle(ase.Tag.ToString(), pelaaja);
646        naytaTiedot();
647    }
648
649
650    private void PudotaAseenHahmo(Pelaaja pelaaja)
651    {
652        if (pelaaja.Weapon == null) return;
653
654        pelaaja.voikoPoimiaAseen = false;
655        Timer.SingleShot(0.1, delegate { pelaaja.voikoPoimiaAseen = true; });
656        String aseenTagi = pelaaja.Weapon.Tag.ToString();
657        Vector koko = pelaaja.Weapon.Size;
658        Vector paikka = pelaaja.Position;
659
660        PhysicsObject tiputettuAse = new PhysicsObject(koko.X, koko.Y);
661        tiputettuAse.Position = paikka;
662        tiputettuAse.Tag = aseenTagi;
663        tiputettuAse.CollisionIgnoreGroup = 1;
664        pelaaja.CollisionIgnoreGroup = 1;
665        Timer.SingleShot(1.0, delegate
666        {
667            tiputettuAse.CollisionIgnoreGroup = 0;
668            pelaaja.CollisionIgnoreGroup = 0;
669        });
670        Add(tiputettuAse);
671        tiputettuAse.Image = pelaaja.Weapon.Image;
672        AddCollisionHandler<PhysicsObject, Pelaaja>(tiputettuAse, "pelaaja", keraaAse);
673
674        pelaaja.Weapon = null;
675    }
676
677    void KranaattiOsui(PhysicsObject ammus, PhysicsObject kohde)
678    {
679        if (ammus.IsDestroying) return;
680        if (!(kohde is Pelaaja)) return;
681        RajaytaKranaatti(ammus);
682
683        Pelaaja pelaaja = (Pelaaja)kohde;
684        ammus.Destroy();
685        pelaaja.HPLaskuri.Value -= 25;
686    }
687
688    void RajaytaKranaatti(PhysicsObject ammus)
689    {
690        if (ammus.IsDestroying || ammus.IsDestroyed) return;
691        Explosion rajahdys = new Explosion(100);
692        rajahdys.Position = ammus.Position;
693        rajahdys.ShockwaveReachesObject += delegate(IPhysicsObject p, Vector shokki) { PaineaaltoOsuu(p, shokki, rajahdys, 50.0); };
694        Add(rajahdys);
695        rajahdys.Force = 25;
696        rajahdys.Speed = 1000;
697        ammus.Destroy();
698    }
699
700    void RakettiOsui(PhysicsObject ammus, PhysicsObject kohde)
701    {
702        if (ammus.IsDestroying) return;
703        if (kohde.Tag.ToString() != "")
704        {
705            Explosion rajahdys = new Explosion(75);
706            rajahdys.Position = ammus.Position;
707            rajahdys.ShockwaveReachesObject += delegate(IPhysicsObject p, Vector shokki) { PaineaaltoOsuu(p, shokki, rajahdys, 40.0); };
708            Add(rajahdys);
709            rajahdys.Force = 25;
710            rajahdys.Speed = 1000;
711
712            ammus.Destroy(); // ei voi taata tapahtuuko tämä "heti". Siksi tarvitaan alkuun tarkistus, että onko ammus tuhoutumassa.
713            if (!(kohde is Pelaaja)) return;
714            Pelaaja pelaaja = (Pelaaja)kohde;
715            pelaaja.HPLaskuri.Value -= 20;
716        }
717    }
718
719    void PaineaaltoOsuu(IPhysicsObject kohde, Vector shokki, Explosion e, double damagenMaara)
720    {
721        if (!(kohde is Pelaaja)) return;
722        Pelaaja p = (Pelaaja)kohde;
723        if (p.ViimeisinRajahdys == e) return;
724        p.ViimeisinRajahdys = e;
725        p.HPLaskuri.Value -= damagenMaara;
726    }
727
728    bool AmmusVoiOsua(PhysicsObject ammus, PhysicsObject kohde)
729    {
730        if (ammus.IsDestroying) return false;
731        if (kohde.Tag.ToString() != "ammus" && kohde.Tag.ToString() != "") ammus.Destroy();
732        if (kohde is Pelaaja)
733        {
734            return true;
735        }
736        else
737        {
738            return false;
739        }
740    }
741
742    void PistooliOsui(PhysicsObject ammus, PhysicsObject kohde)
743    {
744        //if (ammus.IsDestroying) return;
745        //if (kohde.Tag.ToString() != "ammus" && kohde.Tag.ToString() != "") ammus.Destroy();
746        //if (!(kohde is Pelaaja)) return;
747        if (AmmusVoiOsua(ammus, kohde))
748        {
749            Pelaaja p = (Pelaaja)kohde;
750            p.HPLaskuri.Value -= 15;
751        }
752    }
753
754    void KivaariOsui(PhysicsObject ammus, PhysicsObject kohde)
755    {
756        //if (ammus.IsDestroying) return;
757        //if ((string)kohde.Tag != "ammus") ammus.Destroy();
758        //if (!(kohde is Pelaaja)) return;
759        if (AmmusVoiOsua(ammus, kohde))
760        {
761            Pelaaja p = (Pelaaja)kohde;
762            p.HPLaskuri.Value -= 10;
763        }
764    }
765
766    void SniperOsui(PhysicsObject ammus, PhysicsObject kohde)
767    {
768        //if (ammus.IsDestroying) return;
769        //if ((string)kohde.Tag != "ammus") ammus.Destroy();
770        //if (!(kohde is Pelaaja)) return;
771        if (AmmusVoiOsua(ammus, kohde))
772        {
773            Pelaaja p = (Pelaaja)kohde;
774            p.HPLaskuri.Value -= 80;
775        }
776    }
777
778    void MagnumOsui(PhysicsObject ammus, PhysicsObject kohde)
779    {
780        //if (ammus.IsDestroying) return;
781        //if ((string)kohde.Tag != "ammus") ammus.Destroy();
782        //if (!(kohde is Pelaaja)) return;
783        if (AmmusVoiOsua(ammus, kohde))
784        {
785            Pelaaja p = (Pelaaja)kohde;
786            p.HPLaskuri.Value -= 35;
787        }
788    }
789
790    void HaulikkoOsui(PhysicsObject ammus, PhysicsObject kohde)
791    {
792        //if (ammus.IsDestroying) return;
793        //if ((string)kohde.Tag != "ammus") ammus.Destroy();
794        //if (!(kohde is Pelaaja)) return;
795        if (AmmusVoiOsua(ammus, kohde))
796        {
797            Pelaaja p = (Pelaaja)kohde;
798            p.HPLaskuri.Value -= 13;
799        }
800    }
801
802    void LuoPowerUp(Vector paikka, double leveys, double korkeus, Vector koko, String tagi, Image kuva)
803    {
804        PhysicsObject powerup = new PhysicsObject(koko.X, koko.Y);
805        powerup.Position = paikka;
806        powerup.Tag = tagi;
807        powerup.Image = kuva;
808        Add(powerup);
809        AddCollisionHandler<PhysicsObject, Pelaaja>(powerup, "pelaaja", keraaPowerUp);
810    }
811
812    void LuoAse(Vector paikka, double leveys, double korkeus, Vector koko, String tagi, Image kuva)
813    {
814        PhysicsObject ase = new PhysicsObject(koko.X, koko.Y);
815        ase.Position = paikka;
816        ase.Tag = tagi;
817        ase.Image = kuva;
818        Add(ase);
819        AddCollisionHandler<PhysicsObject, Pelaaja>(ase, "pelaaja", keraaAse);
820    }
821
822
823    /// <summary>
824    ///
825    /// </summary>
826    /// <param name="aseenTag">Fysiikkaolio, jonka perusteella laitetaan pelaajalle ase</param>
827    /// <param name="pelaaja">Pelaaja jolle ase luodaan</param>
828    /// <returns></returns>
829    private void LuoAsePelaajalle(string aseenTag, Pelaaja pelaaja)
830    {
831        if (aseenTag == null) return;
832
833        // Varsinainen ase
834        Weapon ase = null;
835
836        if (aseenTag == "Kivääri")
837        {
838            ase = new AssaultRifle(39, 13);
839            ase.FireRate = 7;
840            ase.ProjectileCollision = KivaariOsui;
841            ase.MaxAmmoLifetime = TimeSpan.FromSeconds(10);
842            ase.Tag = "Kivääri";
843            ase.Image = kivaarinkuva;
844        }
845        if (aseenTag == "Magnum")
846        {
847            ase = new AssaultRifle(17, 12);
848            ase.FireRate = 1.2;
849            ase.ProjectileCollision = MagnumOsui;
850            ase.MaxAmmoLifetime = TimeSpan.FromSeconds(10);
851            ase.Tag = "Magnum";
852            ase.Image = magnumkuva;
853
854            // Paikka suhteessa pelaajaan
855            ase.X = 10;
856            ase.Y = 10;
857        }
858
859        if (aseenTag == "Haulikko")
860        {
861            ase = new AssaultRifle(42, 10);
862            ase.FireRate = 0.75;
863            ase.ProjectileCollision = HaulikkoOsui;
864            ase.MaxAmmoLifetime = TimeSpan.FromSeconds(0.4);
865            ase.Tag = "Haulikko";
866            ase.Image = haulikonkuva;
867        }
868
869        if (aseenTag == "Sniper")
870        {
871            ase = new AssaultRifle(42, 11);
872            ase.FireRate = 0.4;
873            ase.ProjectileCollision = SniperOsui;
874            ase.Power.Value = 400;
875            ase.Power.DefaultValue = 400;
876            ase.MaxAmmoLifetime = TimeSpan.FromSeconds(10);
877            ase.Tag = "Sniper";
878            ase.Image = sniperinkuva;
879        }
880
881        if (aseenTag == "Kranaatinheitin")
882        {
883            ase = new Cannon(42, 15);
884            ase.FireRate = 0.5;
885            ase.ProjectileCollision = delegate(PhysicsObject ammus, PhysicsObject kohde) { KranaattiOsui(ammus, kohde); };
886            ase.MaxAmmoLifetime = TimeSpan.FromSeconds(3);
887            ase.Tag = "Kranaatinheitin";
888            ase.Image = kranaatinheittimenkuva;
889        }
890        if (aseenTag == "Raketinheitin")
891        {
892            ase = new AssaultRifle(48, 15);
893            ase.FireRate = 0.5;
894            ase.ProjectileCollision = delegate(PhysicsObject ammus, PhysicsObject kohde) { RakettiOsui(ammus, kohde); };
895            ase.Power.Value = 125;
896            ase.Power.DefaultValue = 125;
897            ase.MaxAmmoLifetime = TimeSpan.FromSeconds(10);
898            ase.Tag = "Raketinheitin";
899            ase.Image = raketinheittimenkuva;
900        }
901
902        if (aseenTag == "Pistooli")
903        {
904            ase = new AssaultRifle(16, 11);
905            ase.FireRate = 2;
906            ase.ProjectileCollision = PistooliOsui;
907            ase.MaxAmmoLifetime = TimeSpan.FromSeconds(10);
908            ase.Tag = "Pistooli";
909            ase.Image = pistoolinkuva;
910            ase.X = 10;
911            ase.Y = 10;
912        }
913
914        pelaaja.Weapon = ase;
915    }
916
917    void PaivitaAse(string aseenTag, Pelaaja pelaaja)
918    {
919        if (aseenTag == null) return;
920
921        // Varsinainen ase
922        Weapon ase = null;
923
924        if (aseenTag == "Kivääri")
925        {
926            ase = new AssaultRifle(39, 13);
927            ase.FireRate = 7;
928            ase.ProjectileCollision = KivaariOsui;
929            ase.MaxAmmoLifetime = TimeSpan.FromSeconds(10);
930            ase.Tag = "Kivääri Lv. 2";
931            ase.Image = kivaarinkuva;
932        }
933        if (aseenTag == "Magnum")
934        {
935            ase = new AssaultRifle(17, 12);
936            ase.FireRate = 1.2;
937            ase.ProjectileCollision = MagnumOsui;
938            ase.MaxAmmoLifetime = TimeSpan.FromSeconds(10);
939            ase.Tag = "Magnum Lv. 2";
940            ase.Image = magnumkuva;
941
942            // Paikka suhteessa pelaajaan
943            ase.X = 10;
944            ase.Y = 10;
945        }
946
947        if (aseenTag == "Haulikko")
948        {
949            ase = new AssaultRifle(42, 10);
950            ase.FireRate = 0.75;
951            ase.ProjectileCollision = HaulikkoOsui;
952            ase.MaxAmmoLifetime = TimeSpan.FromSeconds(0.4);
953            ase.Tag = "Haulikko Lv. 2";
954            ase.Image = haulikonkuva;
955        }
956
957        if (aseenTag == "Sniper")
958        {
959            ase = new AssaultRifle(42, 11);
960            ase.FireRate = 0.4;
961            ase.ProjectileCollision = SniperOsui;
962            ase.Power.Value = 400;
963            ase.Power.DefaultValue = 400;
964            ase.MaxAmmoLifetime = TimeSpan.FromSeconds(10);
965            ase.Tag = "Sniper Lv. 2";
966            ase.Image = sniperinkuva;
967        }
968
969        if (aseenTag == "Kranaatinheitin")
970        {
971            ase = new Cannon(42, 15);
972            ase.FireRate = 0.5;
973            ase.ProjectileCollision = delegate(PhysicsObject ammus, PhysicsObject kohde) { KranaattiOsui(ammus, kohde); };
974            ase.MaxAmmoLifetime = TimeSpan.FromSeconds(3);
975            ase.Tag = "Kranaatinheitin Lv. 2";
976            ase.Image = kranaatinheittimenkuva;
977        }
978        if (aseenTag == "Raketinheitin")
979        {
980            ase = new AssaultRifle(48, 15);
981            ase.FireRate = 0.5;
982            ase.ProjectileCollision = delegate(PhysicsObject ammus, PhysicsObject kohde) { RakettiOsui(ammus, kohde); };
983            ase.Power.Value = 125;
984            ase.Power.DefaultValue = 125;
985            ase.MaxAmmoLifetime = TimeSpan.FromSeconds(10);
986            ase.Tag = "Raketinheitin Lv. 2";
987            ase.Image = raketinheittimenkuva;
988        }
989
990        if (aseenTag == "Pistooli")
991        {
992            ase = new AssaultRifle(16, 11);
993            ase.FireRate = 2;
994            ase.ProjectileCollision = PistooliOsui;
995            ase.MaxAmmoLifetime = TimeSpan.FromSeconds(10);
996            ase.Tag = "Pistooli Lv. 2";
997            ase.Image = pistoolinkuva;
998            ase.X = 10;
999            ase.Y = 10;
1000        }
1001
1002        pelaaja.Weapon = ase;
1003    }
1004
1005    #endregion
1006
1007
1008    #region Nappaimet
1009    // Lisää peliin kaikki näppäimet
1010    void lisaaNappaimet()
1011    {
1012        ClearControls();
1013        //Yleiset näppäimet
1014        Keyboard.Listen(Key.F1, ButtonState.Pressed, uusiPeli, "Aloittaa uuden pelin");
1015
1016        // Pelaajan näppäimet
1017        Keyboard.Listen(Key.A, ButtonState.Down, liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector(-LIIKEVOIMA, 0));
1018        Keyboard.Listen(Key.D, ButtonState.Down, liikuta, "Liikkuu oikealle", pelaaja1, new Vector(LIIKEVOIMA, 0));
1019        Keyboard.Listen(Key.W, ButtonState.Pressed, hyppaa, "Hyppää", pelaaja1, HYPPYVOIMA);
1020        Keyboard.Listen(Key.Space, ButtonState.Down, Ammu, "Ammu", pelaaja1);
1021
1022        Keyboard.Listen(Key.Left, ButtonState.Down, liikuta, "Liikkuu vasemmalle", pelaaja2, new Vector(-LIIKEVOIMA, 0));
1023        Keyboard.Listen(Key.Right, ButtonState.Down, liikuta, "Liikkuu oikealle", pelaaja2, new Vector(LIIKEVOIMA, 0));
1024        Keyboard.Listen(Key.Up, ButtonState.Pressed, hyppaa, "Hyppää", pelaaja2, HYPPYVOIMA);
1025        Keyboard.Listen(Key.RightControl, ButtonState.Down, Ammu, "Ammu", pelaaja2);
1026
1027        Keyboard.Listen(Key.Escape, ButtonState.Pressed, PeliPauselle, "Pysäyttää pelin");
1028
1029        lisaaGamePadNappaimet(ControllerOne, pelaaja1);
1030        lisaaGamePadNappaimet(ControllerTwo, pelaaja2);
1031    }
1032
1033    void lisaaGamePadNappaimet(GamePad pelaajaNro, PlatformCharacter pelaaja)
1034    {
1035        //Yleiset näppäimet
1036        pelaajaNro.Listen(Button.Start, ButtonState.Pressed, PeliPauselle, "Pysäyttää pelin");
1037
1038        //pelaajaNro.ListenAnalog(AnalogControl.LeftStick, 0.1, liikuta, "Pelaaja liikkuu vasemmalle", pelaaja, new Vector(-LIIKEVOIMA, 0));
1039        //pelaajaNro.ListenAnalog(AnalogControl.LeftStick, 0.1, liikuta, "Pelaaja liikkuu vasemmalle", pelaaja, new Vector(-LIIKEVOIMA, 0));
1040        pelaajaNro.Listen(Button.DPadLeft, ButtonState.Down, liikuta, "Pelaaja liikkuu vasemmalle", pelaaja, new Vector(-LIIKEVOIMA, 0));
1041        pelaajaNro.Listen(Button.DPadRight, ButtonState.Down, liikuta, "Pelaaja liikkuu oikealle", pelaaja, new Vector(LIIKEVOIMA, 0));
1042        pelaajaNro.Listen(Button.A, ButtonState.Pressed, hyppaa, "Pelaaja hyppää", pelaaja, HYPPYVOIMA);
1043        pelaajaNro.Listen(Button.RightTrigger, ButtonState.Down, Ammu, "Ammu", pelaaja);
1044    }
1045
1046    void PeliPauselle()
1047    {
1048        Pause();
1049        MultiSelectWindow PauseValikko = new MultiSelectWindow("Kynäri",
1050        "Jatka peliä", "Aloita peli alusta", "Päävalikko", "Lopeta");
1051        Add(PauseValikko);
1052        PauseValikko.AddItemHandler(0, Pause);
1053        PauseValikko.AddItemHandler(1, delegate { uusiPeli(); Pause(); });
1054        PauseValikko.AddItemHandler(2, delegate { LuoAlkuValikko(); Pause(); });
1055        PauseValikko.AddItemHandler(3, Exit);
1056        PauseValikko.DefaultCancel = 0;
1057        PauseValikko.Color = Color.Gray;
1058    }
1059
1060    // Näppäimiin liitetyt toiminnot alkavat tästä -->
1061    void liikuta(PlatformCharacter hahmo, Vector voima)
1062    {
1063        hahmo.Walk(voima.X);
1064    }
1065
1066    void naytaTiedot()
1067    {
1068        MessageDisplay.Clear();
1069        MessageDisplay.X = 0;
1070        if (pelaaja1.Weapon != null)
1071        {
1072            MessageDisplay.Add("Pelaaja 1: " + pelaaja1.Weapon.Tag);
1073        }
1074        if (pelaaja2.Weapon != null)
1075        {
1076            MessageDisplay.Add("Pelaaja 2: " + pelaaja2.Weapon.Tag);
1077        }
1078    }
1079
1080    void Ammu(PlatformCharacter hahmo)
1081    {
1082        if (hahmo.IsDestroyed || !saaAmpua) return;
1083        PhysicsObject ammus = hahmo.Weapon.Shoot();
1084        if (ammus == null) return;
1085
1086        ammus.Tag = "ammus";
1087        ammus.IgnoresCollisionResponse = true;
1088        ammus.IgnoresExplosions = true;
1089
1090        if (hahmo.Weapon.Tag.ToString() == "Kranaatinheitin")
1091        {
1092            ammus.Shape = Shape.Circle;
1093            ammus.Image = kranaatinkuva;
1094            ammus.Restitution = 1;
1095            ammus.Mass = 0.2;
1096            ammus.KineticFriction = 0.2;
1097            ammus.StaticFriction = 0.2;
1098            ammus.Position = hahmo.Position;
1099            ammus.Size += new Vector(1, 1);
1100            Timer.SingleShot(2.0, delegate { RajaytaKranaatti(ammus); });
1101            ammus.IgnoresCollisionResponse = false;
1102            Timer.SingleShot(0.2, delegate { ammus.CollisionIgnorer = null; });
1103        }
1104
1105        if ((string)hahmo.Weapon.Tag == "Raketinheitin")
1106        {
1107            ammus.Image = raketinkuva;
1108            ammus.Size += new Vector(3, 1);
1109            ammus.IgnoresCollisionResponse = false;
1110            Timer.SingleShot(0.1, delegate { ammus.CollisionIgnorer = null; });
1111        }
1112        if ((string)hahmo.Weapon.Tag == "Haulikko")
1113        {
1114            for (int i = 0; i < 5; i++)
1115            {
1116                PhysicsObject ammus2 = new PhysicsObject(ammus.Image);
1117                ammus2.IgnoresGravity = true;
1118                ammus2.Size = ammus.Size;
1119                ammus2.Position = ammus.Position;
1120                ammus2.Velocity = ammus.Velocity;
1121                ammus2.MaximumLifetime = TimeSpan.FromSeconds(0.4);
1122                ammus2.Hit(new Vector(RandomGen.NextDouble(-100, 100), RandomGen.NextDouble(-300, 300)));
1123                ammus2.CollisionIgnorer = ammus.CollisionIgnorer;
1124                ammus2.Tag = "ammus";
1125                ammus2.IgnoresCollisionResponse = true;
1126                ammus2.IgnoresExplosions = true;
1127                AddCollisionHandler(ammus2, HaulikkoOsui);
1128                Add(ammus2);
1129            }
1130        }
1131        Add(ammus);
1132    }
1133
1134    void hyppaa(PlatformCharacter hahmo, double voima)
1135    {
1136        if (hahmo.Jump(voima)) hyppyAani.Play();
1137    }
1138
1139    void uusiPeli()
1140    {
1141        NollaaLaskurit();
1142        pelaaja1.Weapon = null;
1143        pelaaja2.Weapon = null;
1144        AloitaUusiPeli();
1145    }
1146    #endregion
1147
1148
1149}
Note: See TracBrowser for help on using the repository browser.