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

Revision 3942, 30.9 KB checked in by jotapoti, 7 years ago (diff)

23.2.2013 peliohjelmointikerhossa tehdyt muutokset, mm. kentän lataus tekstitiedostosta

Line 
1using System;
2
3using Jypeli;
4using Jypeli.Widgets;
5using Jypeli.Assets;
6using Jypeli.Controls;
7
8public class Pelaaja : PlatformCharacter
9{
10    public bool voikoPoimiaAseen { get; set; }
11    public Pelaaja(double width, double height, Shape shape)
12        : base(width, height, shape)
13    {
14        voikoPoimiaAseen = true;
15    }
16}
17
18// Yksinkertainen tasohyppely.
19public class Kynari : PhysicsGame
20{
21    #region Muuttujat
22
23    const double LIIKEVOIMA = 400;
24    const double HYPPYVOIMA = 850;
25    const double RUUDUNLEVEYS = 30;
26    const double RUUDUNKORKEUS = 30;
27    const int PISTEMAARA_JOLLA_VOITTAA_PELIN = 3;
28
29    Pelaaja pelaaja1 = new Pelaaja(40, 40, Shape.Circle);
30    Pelaaja pelaaja2 = new Pelaaja(40, 40, Shape.Circle);
31    DoubleMeter hpLaskuri1 = new DoubleMeter(100);
32    DoubleMeter hpLaskuri2 = new DoubleMeter(100);
33
34    Image kranaatinheittimenkuva = LoadImage("grenade");
35    Image magnumkuva = LoadImage("magnum");
36    Image norsu = LoadImage("norsu");
37    Image haulikonkuva = LoadImage("shotgun");
38    Image pistoolinkuva = LoadImage("pistol");
39    Image kivaarinkuva = LoadImage("assaultrifle");
40    Image raketinheittimenkuva = LoadImage("rocketlauncher");
41    bool saaAmpua = false;
42    //bool peliohi = false;
43
44    SoundEffect hyppyAani = LoadSoundEffect("hyppays");
45
46    ProgressBar hpNaytto;
47    ProgressBar hpNaytto2;
48
49    IntMeter pelaajan1Pisteet;
50    IntMeter pelaajan2Pisteet;
51
52    #endregion
53
54    #region Alustukset
55    public override void Begin()
56    {
57        pelaajan1Pisteet = new IntMeter(0);
58        pelaajan2Pisteet = new IntMeter(0);
59
60        DrawPerimeter = false; // ei haluta piirtää kentän reunoja
61        LuoAlkuValikko();
62    }
63
64    void aloitaUusiPeli()
65    {
66
67        MessageDisplay.Clear();
68        // ladataan kenttä
69        //seuraavaKentta();
70        LuoKentta(1);
71        lisaaNappaimet();
72        LisaaLaskurit();
73        LisaaHPNaytot();
74        naytaTiedot();
75        //peliohi = false;
76        saaAmpua = false;
77        Timer.SingleShot(0.1, delegate
78        {
79            saaAmpua = true;
80        });
81    }
82    #endregion
83
84
85    #region KentanLataus
86
87    void LuoKentta(int kenttaNro)
88    {
89        ClearAll();
90        TileMap ruudut = TileMap.FromLevelAsset("kentta1");
91        ruudut.SetTileMethod('x', LuoReuna);
92        ruudut.SetTileMethod('t', LuoTaso);
93        ruudut.SetTileMethod('A', LuoAse, new Vector(39, 13), "Kivääri", kivaarinkuva);
94        ruudut.SetTileMethod('G', LuoAse, new Vector(37, 19), "Kranaatinheitin", kranaatinheittimenkuva);
95        ruudut.SetTileMethod('S', LuoAse, new Vector(39, 13), "Haulikko", haulikonkuva);
96        ruudut.SetTileMethod('M', LuoAse, new Vector(17, 12), "Magnum", magnumkuva);
97        ruudut.SetTileMethod('R', LuoAse, new Vector(48, 15), "Raketinheitin", raketinheittimenkuva);
98        ruudut.SetTileMethod('1', delegate(Vector paikka, double leveys, double korkeus) { pelaaja1 = LuoPelaaja(paikka, leveys, korkeus, pelaaja1, hpLaskuri1); });
99        ruudut.SetTileMethod('2', delegate(Vector paikka, double leveys, double korkeus) { pelaaja2 = LuoPelaaja(paikka, leveys, korkeus, pelaaja2, hpLaskuri2); });
100        ruudut.Execute(RUUDUNLEVEYS, RUUDUNKORKEUS);
101        Level.Background.CreateGradient(Color.White, Color.Gray);
102        Gravity = new Vector(0, -1500);
103
104        Timer timer = new Timer();
105        timer.Interval = 0.1;
106        timer.Timeout += delegate { TarkistaReunat(Level.Right - 1.5 * RUUDUNLEVEYS, Level.Top - 1.5 * RUUDUNKORKEUS); };
107        timer.Start();
108    }
109
110    void LuoReuna(Vector paikka, double leveys, double korkeus)
111    {
112        PhysicsObject reuna = new PhysicsObject(leveys, korkeus);
113        reuna.Position = paikka;
114        reuna.Color = Color.Gray;
115        reuna.MakeStatic();
116        Add(reuna);
117    }
118
119    void LuoTaso(Vector paikka, double leveys, double korkeus)
120    {
121        PhysicsObject taso = new PhysicsObject(leveys, korkeus);
122        taso.Position = paikka;
123        taso.Color = Color.Gray;
124        taso.MakeStatic();
125        Add(taso);
126    }
127
128
129   void TarkistaReunat(double leveys, double korkeus)
130    {
131        if (pelaaja1.Position.X < -leveys) pelaaja1.Position = new Vector(-leveys, pelaaja1.Position.Y);
132        if (pelaaja1.Position.X > leveys) pelaaja1.Position = new Vector(leveys, pelaaja1.Position.Y);
133        if (pelaaja1.Position.Y < -korkeus) pelaaja1.Position = new Vector(pelaaja1.Position.X, -korkeus);
134        if (pelaaja1.Position.Y > korkeus) pelaaja1.Position = new Vector(pelaaja1.Position.Y, korkeus);
135        if (pelaaja2.Position.X < -leveys) pelaaja2.Position = new Vector(-leveys, pelaaja2.Position.Y);
136        if (pelaaja2.Position.X > leveys) pelaaja2.Position = new Vector(leveys, pelaaja2.Position.Y);
137        if (pelaaja2.Position.Y < -korkeus) pelaaja2.Position = new Vector(pelaaja2.Position.X, -korkeus);
138        if (pelaaja2.Position.Y > korkeus) pelaaja2.Position = new Vector(pelaaja2.Position.Y, korkeus);
139    }
140
141    void LuoAlkuValikko()
142    {
143        ClearAll();
144        NollaaLaskurit();
145        MultiSelectWindow alkuValikko = new MultiSelectWindow("Kynäri",
146        "Aloita peli", "Lopeta");
147        Add(alkuValikko);
148        alkuValikko.AddItemHandler(0, aloitaUusiPeli);
149        alkuValikko.AddItemHandler(1, Exit);
150        alkuValikko.DefaultCancel = 1;
151        alkuValikko.Color = Color.Gray;
152        Level.BackgroundColor = Color.Gray;
153    }
154
155    void luoTasot()
156    {
157        PhysicsObject alusta = new PhysicsObject(Level.Width, 300);
158        alusta.Color = Color.Gray;
159        alusta.X = 0;
160        alusta.Y = Level.Bottom - alusta.Height / 2;
161        Add(alusta);
162
163        lisaaPieniTaso(-200, -350);
164        lisaaPieniTaso(0, -400);
165        lisaaPieniTaso(100, -300);
166        lisaaPieniTaso(400, -350);
167        lisaaPieniTaso(450, -200);
168        lisaaPieniTaso(-500, -400);
169        lisaaPieniTaso(-550, -200);
170        lisaaPieniTaso(-400, -300);
171        lisaaPieniTaso(-150, -150);
172        lisaaPieniTaso(-870, -350);
173        lisaaPieniTaso(-700, -400);
174
175        lisaaPieniTaso(600, -300);
176        lisaaPieniTaso(850, -300);
177        lisaaPieniTaso(750, -400);
178        lisaaPieniTaso(200, -200);
179        lisaaPieniTaso(-200, -150);
180
181        lisaaPystyTaso(600, -450);
182        lisaaPystyTaso(-600, -500);
183        lisaaPystyTaso(0, -450);
184
185        lisaaReuna(-1375, 0);
186        lisaaReuna(1375, 0);
187    }
188
189    void LisaaHPNaytot()
190    {
191        // luodaan elämänäyttö
192        hpNaytto = new ProgressBar(250, 30);
193        //hpNaytto.Angle = Angle.FromDegrees(90);
194        hpNaytto.BarColor = Color.LightGreen;
195        hpNaytto.Color = Color.Red;
196        hpNaytto.BindTo(hpLaskuri1);
197        hpNaytto.Position = new Vector(Screen.LeftSafe + 300, Screen.TopSafe - 170);
198        Add(hpNaytto);
199
200        hpNaytto2 = new ProgressBar(250, 30);
201        //hpNaytto2.Angle = Angle.FromDegrees(90);
202        hpNaytto2.BarColor = Color.LightGreen;
203        hpNaytto2.Color = Color.Red;
204        hpNaytto2.BindTo(hpLaskuri2);
205        hpNaytto2.Position = new Vector(Screen.RightSafe - 300, Screen.TopSafe - 170);
206        Add(hpNaytto2);
207    }
208
209    void LisaaLaskurit()
210    {
211        LuoPisteLaskuri(Screen.Left + 100.0, Screen.Top - 175.0, pelaajan1Pisteet);
212        LuoPisteLaskuri(Screen.Right - 100.0, Screen.Top - 175.0, pelaajan2Pisteet);
213        pelaajan1Pisteet.MaxValue = PISTEMAARA_JOLLA_VOITTAA_PELIN;
214        pelaajan2Pisteet.MaxValue = PISTEMAARA_JOLLA_VOITTAA_PELIN;
215        pelaajan1Pisteet.UpperLimit += delegate() { PelaajaVoittaa(pelaaja1, "Pelaaja 1", pelaaja2, pelaajan2Pisteet); };
216        pelaajan2Pisteet.UpperLimit += delegate() { PelaajaVoittaa(pelaaja2, "Pelaaja 2", pelaaja1, pelaajan1Pisteet); };
217    }
218
219    void NollaaLaskurit()
220    {
221        pelaajan1Pisteet.Reset();
222        pelaajan2Pisteet.Reset();
223    }
224
225    IntMeter LuoPisteLaskuri(double x, double y, IntMeter laskuri)
226    {
227        Label naytto = new Label();
228        naytto.BindTo(laskuri);
229        naytto.X = x;
230        naytto.Y = y;
231        Add(naytto);
232        return laskuri;
233    }
234
235    void PelaajaVoittaa(Pelaaja voittaja, String voittajanNimi, Pelaaja haviaja, IntMeter haviajanPisteet)
236    {
237        MessageDisplay.Clear();
238        if (voittaja.IsDestroying && haviajanPisteet.Value == haviajanPisteet.MaxValue)
239        {
240            MessageDisplay.Add("Tasapeli!");
241        }
242        else
243        {
244            MessageDisplay.Add(voittajanNimi + " voittaa!");
245        }
246       
247    }
248
249    //Vanha
250    void Pelaaja1Voitti()
251    {
252
253        MessageDisplay.Clear();
254        if (pelaaja1.IsDestroying && pelaajan2Pisteet.Value == pelaajan2Pisteet.MaxValue)
255        {
256            MessageDisplay.Add("Tasapeli!");
257        }
258        else
259        {
260            MessageDisplay.Add("Pelaaja 1 voittaa!");
261        }
262        MessageDisplay.X = 0;
263    }
264
265    //Vanha
266    void Pelaaja2Voitti()
267    {
268        MessageDisplay.Clear();
269        if (pelaaja2.IsDestroying && pelaajan1Pisteet.Value == pelaajan1Pisteet.MaxValue)
270        {
271            MessageDisplay.Add("Tasapeli!");
272        }
273        else
274        {
275            MessageDisplay.Add("Pelaaja 2 voittaa!");
276        }
277        MessageDisplay.X = 0;
278
279    }
280
281    void lisaaPieniTaso(double x, double y)
282    {
283        PhysicsObject taso = PhysicsObject.CreateStaticObject(100, 30, Shape.Rectangle);
284        taso.Color = Color.Gray;
285        taso.X = x;
286        taso.Y = y;
287        Add(taso);
288    }
289
290    void lisaaReuna(double x, double y)
291    {
292        PhysicsObject taso = PhysicsObject.CreateStaticObject(1000, 1000, Shape.Rectangle);
293        taso.Color = Color.Gray;
294        taso.X = x;
295        taso.Y = y;
296        Add(taso);
297    }
298
299    void lisaaPystyTaso(double x, double y)
300    {
301        PhysicsObject taso = PhysicsObject.CreateStaticObject(30, 100, Shape.Rectangle);
302        taso.Color = Color.Gray;
303        taso.X = x;
304        taso.Y = y;
305        Add(taso);
306    }
307
308    Pelaaja LuoPelaaja(Vector paikka, double leveys, double korkeus, Pelaaja pelaaja, DoubleMeter hpLaskuri)
309    {
310        pelaaja = new Pelaaja(40, 40, Shape.Circle);
311        pelaaja.Image = norsu;
312        pelaaja.Position = paikka;
313        pelaaja.Tag = "pelaaja";
314
315        hpLaskuri.MaxValue = 100;
316        hpLaskuri.Value = 100;
317        hpLaskuri.LowerLimit += delegate() { 
318            PelaajaKuoli(pelaaja); 
319        };
320        Add(pelaaja);
321
322        Bullet luoti = new Bullet(1);
323        PhysicsObject pistol = new PhysicsObject(16, 11);
324        pistol.Image = pistoolinkuva;
325        pistol.Tag = "Pistooli";
326
327        LuoAsePelaajalle(pistol, pelaaja);
328        return pelaaja;
329    }
330
331    void PelaajaKuoli(Pelaaja pelaaja)
332    {
333        if (pelaaja.IsDestroying)
334        {
335            return;
336        }
337
338        pelaaja.Destroy();
339        PudotaAseenHahmo(pelaaja);
340        MessageDisplay.Clear();
341        MessageDisplay.X = 0;
342
343        if (pelaaja == pelaaja1)
344        {
345            pelaajan2Pisteet.Value += 1;
346
347            if (!(pelaajan1Pisteet.Value == pelaajan1Pisteet.MaxValue || pelaajan2Pisteet.Value == pelaajan2Pisteet.MaxValue))
348            {
349                if (pelaaja2.IsDestroying && pelaajan1Pisteet.Value != pelaajan1Pisteet.MaxValue)
350                {
351                    MessageDisplay.Clear();
352                    MessageDisplay.Add("Erä tasan!");
353                }
354                else if (pelaajan1Pisteet.Value != pelaajan1Pisteet.MaxValue)
355                {
356                    MessageDisplay.Add("Pelaaja 2 voitti erän!");
357                }
358
359                Timer.SingleShot(3.0, aloitaUusiPeli);
360            }
361            else if (pelaajan2Pisteet.Value == pelaajan2Pisteet.MaxValue)
362            {
363                Pelaaja2Voitti();
364                ClearTimers();
365                Timer.SingleShot(3.0, LuoAlkuValikko);
366            }
367        }
368
369        if (pelaaja == pelaaja2)
370        {
371            pelaajan1Pisteet.Value += 1;
372
373            if (!(pelaajan2Pisteet.Value == pelaajan2Pisteet.MaxValue || pelaajan1Pisteet.Value == pelaajan1Pisteet.MaxValue))
374            {
375                if (pelaaja1.IsDestroying && pelaajan2Pisteet.Value != pelaajan2Pisteet.MaxValue)
376                {
377                    MessageDisplay.Clear();
378                    MessageDisplay.Add("Erä tasan!");
379                }
380                else if (pelaajan1Pisteet.Value != pelaajan2Pisteet.MaxValue)
381                {
382                    MessageDisplay.Add("Pelaaja 1 voitti erän!");
383                }
384
385                Timer.SingleShot(3.0, aloitaUusiPeli);
386            }
387            else if (pelaajan1Pisteet.Value == pelaajan1Pisteet.MaxValue)
388            {
389                Pelaaja1Voitti();
390                ClearTimers();
391                Timer.SingleShot(3.0, LuoAlkuValikko);
392            }
393        }
394
395    }
396
397    // Vanha
398    void lisaaPelaajat()
399    {
400        pelaaja1 = new Pelaaja(40, 40, Shape.Circle);
401        pelaaja1.Image = norsu;
402        pelaaja1.X = -700;
403        pelaaja1.Y = Level.Bottom + 50;
404        pelaaja1.Tag = "pelaaja";
405
406        pelaaja2 = new Pelaaja(40, 40, Shape.Circle);
407        pelaaja2.Image = norsu;
408        pelaaja2.X = 700;
409        pelaaja2.Y = Level.Bottom + 50;
410        pelaaja2.Tag = "pelaaja";
411
412        hpLaskuri1.MaxValue = 100;
413        hpLaskuri1.Value = 100;
414        hpLaskuri1.LowerLimit += delegate() { PelaajaKuoli(pelaaja1); };
415
416        hpLaskuri2.MaxValue = 100;
417        hpLaskuri2.Value = 100;
418        hpLaskuri2.LowerLimit += delegate() { PelaajaKuoli(pelaaja2); };
419
420        Add(pelaaja1);
421        Add(pelaaja2);
422    }
423
424    // Vanha
425    void pelaaja1Kuoli()
426    {
427        if (pelaaja1.IsDestroying)
428        {
429            return;
430        }
431
432        pelaaja1.Destroy();
433        PudotaAseenHahmo(pelaaja1);
434        MessageDisplay.Clear();
435        MessageDisplay.X = 0;
436        pelaajan2Pisteet.Value += 1;
437
438        if (!(pelaajan1Pisteet.Value == pelaajan1Pisteet.MaxValue || pelaajan2Pisteet.Value == pelaajan2Pisteet.MaxValue))
439        {
440            if (pelaaja2.IsDestroying && pelaajan1Pisteet.Value != pelaajan1Pisteet.MaxValue)
441            {
442                MessageDisplay.Clear();
443                MessageDisplay.Add("Erä tasan!");
444            }
445            else if (pelaajan1Pisteet.Value != pelaajan1Pisteet.MaxValue)
446            {
447                MessageDisplay.Add("Pelaaja 2 voitti erän!");
448            }
449
450            Timer.SingleShot(3.0, aloitaUusiPeli);
451        }
452        else if (pelaajan2Pisteet.Value == pelaajan2Pisteet.MaxValue)
453        {
454            Pelaaja2Voitti();
455            ClearTimers();
456            Timer.SingleShot(3.0, LuoAlkuValikko);
457        }
458    }
459
460    // Vanha
461    void pelaaja2Kuoli()
462    {
463        if (pelaaja2.IsDestroying)
464        {
465            return;
466        }
467        pelaaja2.Destroy();
468        PudotaAseenHahmo(pelaaja2);
469        //MessageDisplay.Clear();
470        MessageDisplay.X = 0;
471        pelaajan1Pisteet.Value += 1;
472
473        if (!(pelaajan2Pisteet.Value == pelaajan2Pisteet.MaxValue || pelaajan1Pisteet.Value == pelaajan1Pisteet.MaxValue))
474        {
475            if (pelaaja1.IsDestroying && pelaajan2Pisteet.Value != pelaajan2Pisteet.MaxValue)
476            {
477                MessageDisplay.Clear();
478                MessageDisplay.Add("Erä tasan!");
479            }
480            else if (pelaajan1Pisteet.Value != pelaajan2Pisteet.MaxValue)
481            {
482                MessageDisplay.Add("Pelaaja 1 voitti erän!");
483            }
484
485            Timer.SingleShot(3.0, aloitaUusiPeli);
486        }
487        else if (pelaajan1Pisteet.Value == pelaajan1Pisteet.MaxValue)
488        {
489            Pelaaja1Voitti();
490            ClearTimers();
491            Timer.SingleShot(3.0, LuoAlkuValikko);
492        }
493    }
494
495    void keraaAse(PhysicsObject ase, Pelaaja pelaaja)
496    {
497        if (!pelaaja.voikoPoimiaAseen) return;
498        ase.Destroy();
499        if (pelaaja == pelaaja1)
500        {
501            PudotaAseenHahmo(pelaaja1); // tiputtaa asetta vastaavan fysiikkaolion maahan kerättäväksi uudestaan
502            LuoAsePelaajalle(ase, pelaaja1);
503        }
504
505        if (pelaaja == pelaaja2)
506        {
507            PudotaAseenHahmo(pelaaja2); // tiputtaa vanhan aseen maahan
508            LuoAsePelaajalle(ase, pelaaja2);
509        }
510        naytaTiedot();
511    }
512
513
514    private void PudotaAseenHahmo(Pelaaja pelaaja)
515    {
516        if (pelaaja.Weapon == null) return;
517
518        pelaaja.voikoPoimiaAseen = false;
519        Timer.SingleShot(0.5, delegate { pelaaja.voikoPoimiaAseen = true; });
520        String aseenTagi = pelaaja.Weapon.Tag.ToString();
521        Vector koko = pelaaja.Weapon.Size;
522        Vector paikka = pelaaja.Position;
523
524        PhysicsObject tiputettuAse = new PhysicsObject(koko.X, koko.Y);
525        tiputettuAse.Position = paikka;
526        tiputettuAse.Tag = aseenTagi;
527        tiputettuAse.CollisionIgnoreGroup = 1;
528        pelaaja.CollisionIgnoreGroup = 1;
529        Timer.SingleShot(1.0, delegate
530        {
531            tiputettuAse.CollisionIgnoreGroup = 0;
532            pelaaja.CollisionIgnoreGroup = 0;
533        });
534        Add(tiputettuAse);
535        tiputettuAse.Image = pelaaja.Weapon.Image;
536        AddCollisionHandler<PhysicsObject, Pelaaja>(tiputettuAse, "pelaaja", keraaAse);
537
538        pelaaja.Weapon = null;
539    }
540
541    void KranaattiOsui(PhysicsObject ammus, PhysicsObject kohde)
542    {
543        if (kohde.Tag.ToString() == "pelaaja")
544        {
545            ammus.Destroy();
546        }
547    }
548
549    void RakettiOsui(PhysicsObject ammus, PhysicsObject kohde)
550    {
551        ammus.Destroy();
552    }
553
554    void PaineaaltoOsuu(IPhysicsObject kohde, Vector shokki)
555    {
556        if (kohde == pelaaja1) { hpLaskuri1.Value -= 75; }
557        if (kohde == pelaaja2) { hpLaskuri2.Value -= 75; }
558    }
559
560    void RaketinPaineaaltoOsuu(IPhysicsObject kohde, Vector shokki)
561    {
562        if (kohde == pelaaja1) { hpLaskuri1.Value -= 40; }
563        if (kohde == pelaaja2) { hpLaskuri2.Value -= 40; }
564    }
565
566    void AmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
567    {
568        if ((string)kohde.Tag != "ammus")
569        {
570            ammus.Destroy();
571        }
572
573        if (kohde.Tag.ToString() == "pelaaja")
574        {
575            if (kohde == pelaaja1) { hpLaskuri1.Value -= 15; }
576            if (kohde == pelaaja2) { hpLaskuri2.Value -= 15; }
577        }
578    }
579    void KivaariOsui(PhysicsObject ammus, PhysicsObject kohde)
580    {
581        if ((string)kohde.Tag != "ammus")
582        {
583            ammus.Destroy();
584        }
585        if (kohde.Tag.ToString() == "pelaaja")
586        {
587            if (kohde == pelaaja1) { hpLaskuri1.Value -= 10; }
588            if (kohde == pelaaja2) { hpLaskuri2.Value -= 10; }
589        }
590    }
591    void MagnumOsui(PhysicsObject ammus, PhysicsObject kohde)
592    {
593        if ((string)kohde.Tag != "ammus")
594        {
595            ammus.Destroy();
596        }
597        if (kohde.Tag.ToString() == "pelaaja")
598        {
599            if (kohde == pelaaja1) { hpLaskuri1.Value -= 35; }
600            if (kohde == pelaaja2) { hpLaskuri2.Value -= 35; }
601        }
602    }
603    void HaulikkoOsui(PhysicsObject ammus, PhysicsObject kohde)
604    {
605        if ((string)kohde.Tag != "ammus")
606        {
607            ammus.Destroy();
608        }
609
610        if (kohde.Tag.ToString() == "pelaaja")
611        {
612            if (kohde == pelaaja1) { hpLaskuri1.Value -= 13; }
613            if (kohde == pelaaja2) { hpLaskuri2.Value -= 13; }
614        }
615    }
616
617    void LuoAse(Vector paikka, double leveys, double korkeus, Vector koko, String tagi, Image kuva)
618    {
619        PhysicsObject ase = new PhysicsObject(koko.X, koko.Y);
620        ase.Position = paikka;
621        ase.Tag = tagi;
622        ase.Image = kuva;
623        Add(ase);
624        AddCollisionHandler<PhysicsObject, Pelaaja>(ase, "pelaaja", keraaAse);
625    }
626
627
628    /// <summary>
629    ///
630    /// </summary>
631    /// <param name="aseenHahmo">Fysiikkaolio, jonka perusteella laitetaan pelaajalle ase</param>
632    /// <param name="pelaaja">Pelaaja jolle ase luodaan</param>
633    /// <returns></returns>
634    private void LuoAsePelaajalle(PhysicsObject aseenHahmo, Pelaaja pelaaja)
635    {
636        if (aseenHahmo == null) return;
637
638        // Varsinainen ase
639        Weapon ase = null;
640
641        if (aseenHahmo.Tag.ToString() == "Kivääri")
642        {
643            ase = new AssaultRifle(39, 13);
644            ase.FireRate = 7;
645            ase.ProjectileCollision = KivaariOsui;
646            ase.MaxAmmoLifetime = TimeSpan.FromSeconds(10);
647            ase.Tag = "Kivääri";
648            ase.Image = kivaarinkuva;
649        }
650        if (aseenHahmo.Tag.ToString() == "Magnum")
651        {
652            ase = new AssaultRifle(17, 12);
653            ase.FireRate = 1.2;
654            ase.ProjectileCollision = MagnumOsui;
655            ase.MaxAmmoLifetime = TimeSpan.FromSeconds(10);
656            ase.Tag = "Magnum";
657            ase.Image = magnumkuva;
658
659            // Paikka suhteessa pelaajaan
660            ase.X = 10;
661            ase.Y = 10;
662        }
663
664        if (aseenHahmo.Tag.ToString() == "Haulikko")
665        {
666            ase = new AssaultRifle(39, 13);
667            ase.FireRate = 0.75;
668            ase.ProjectileCollision = HaulikkoOsui;
669            ase.MaxAmmoLifetime = TimeSpan.FromSeconds(0.4);
670            ase.Tag = "Haulikko";
671            ase.Image = haulikonkuva;
672        }
673
674        if (aseenHahmo.Tag.ToString() == "Kranaatinheitin")
675        {
676            ase = new Cannon(37, 19);
677            ase.FireRate = 0.5;
678            ase.ProjectileCollision = KranaattiOsui;
679            ase.MaxAmmoLifetime = TimeSpan.FromSeconds(2);
680            ase.Tag = "Kranaatinheitin";
681            ase.Image = kranaatinheittimenkuva;
682        }
683        if (aseenHahmo.Tag.ToString() == "Raketinheitin")
684        {
685            ase = new PlasmaCannon(48, 15);
686            ase.FireRate = 0.5;
687            ase.ProjectileCollision = RakettiOsui;
688            ase.Power.DefaultValue = 3000;
689            ase.MaxAmmoLifetime = TimeSpan.FromSeconds(10);
690            ase.Tag = "Raketinheitin";
691            ase.Image = raketinheittimenkuva;
692        }
693
694        if (aseenHahmo.Tag.ToString() == "Pistooli")
695        {
696            ase = new AssaultRifle(16, 11);
697            ase.FireRate = 2;
698            ase.ProjectileCollision = AmmusOsui;
699            ase.MaxAmmoLifetime = TimeSpan.FromSeconds(10);
700            ase.Tag = "Pistooli";
701            ase.Image = pistoolinkuva;
702            ase.X = 10;
703            ase.Y = 10;
704        }
705
706        pelaaja.Weapon = ase;
707    }
708
709    // Vanha
710    void lisaaKerattavaAse()
711    {
712        //Täällä lisätään ase kenttään
713        /*Bullet luoti = new Bullet(1);
714        Bullet luoti2 = new Bullet(1);
715        Bullet hauli = new Bullet(1);
716
717        Grenade kranaatti = new Grenade(1);
718        kranaatti.Explosion = new Explosion(20);
719        */
720        // kranaatti.ExplodeCondition = OnkoPelaaja; TODO: räjähtää kun osuu pelaajaan!
721
722        PhysicsObject kivaari = new PhysicsObject(39, 13);
723        kivaari.X = 200;
724        kivaari.Y = -150;
725        kivaari.Tag = "Kivääri";
726        kivaari.Image = kivaarinkuva;
727        Add(kivaari);
728
729        PhysicsObject magnum = new PhysicsObject(17, 12);
730        magnum.X = 0;
731        magnum.Y = -350;
732        magnum.Tag = "Magnum";
733        magnum.Image = magnumkuva;
734        Add(magnum);
735
736        PhysicsObject haulikko = new PhysicsObject(39, 13);
737        haulikko.X = -550;
738        haulikko.Y = -150;
739        haulikko.Tag = "Haulikko";
740        haulikko.Image = haulikonkuva;
741        Add(haulikko);
742
743        PhysicsObject kranaatinheitin = new PhysicsObject(37, 19);
744        kranaatinheitin.X = -180;
745        kranaatinheitin.Y = -100;
746        kranaatinheitin.Tag = "Kranaatinheitin";
747        kranaatinheitin.Image = kranaatinheittimenkuva;
748        Add(kranaatinheitin);
749
750        //Lisää myös törmäyksen käsittelijä aseelle, jossa kutsutaan keraaAse -aliohjelmaa
751        AddCollisionHandler<PhysicsObject, Pelaaja>(kivaari, "pelaaja", keraaAse);
752        AddCollisionHandler<PhysicsObject, Pelaaja>(haulikko, "pelaaja", keraaAse);
753        AddCollisionHandler<PhysicsObject, Pelaaja>(kranaatinheitin, "pelaaja", keraaAse);
754        AddCollisionHandler<PhysicsObject, Pelaaja>(magnum, "pelaaja", keraaAse);
755    }
756
757    void lisaaAsePelaajalle()
758    {
759        Bullet luoti = new Bullet(1);
760        PhysicsObject pistol1 = new PhysicsObject(16, 11);
761        pistol1.Image = pistoolinkuva;
762        pistol1.Tag = "Pistooli";
763
764        LuoAsePelaajalle(pistol1, pelaaja1);
765        LuoAsePelaajalle(pistol1, pelaaja2);
766    }
767
768    #endregion
769
770
771    #region Nappaimet
772    // Lisää peliin kaikki näppäimet
773    void lisaaNappaimet()
774    {
775        ClearControls();
776        //Yleiset näppäimet
777        Keyboard.Listen(Key.F1, ButtonState.Pressed, uusiPeli, "Aloittaa uuden pelin");
778
779        // Pelaajan näppäimet
780        Keyboard.Listen(Key.A, ButtonState.Down, liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector(-LIIKEVOIMA, 0));
781        Keyboard.Listen(Key.D, ButtonState.Down, liikuta, "Liikkuu oikealle", pelaaja1, new Vector(LIIKEVOIMA, 0));
782        Keyboard.Listen(Key.W, ButtonState.Pressed, hyppaa, "Hyppää", pelaaja1, HYPPYVOIMA);
783        Keyboard.Listen(Key.Space, ButtonState.Down, Ammu, "Ammu", pelaaja1);
784
785        Keyboard.Listen(Key.Left, ButtonState.Down, liikuta, "Liikkuu vasemmalle", pelaaja2, new Vector(-LIIKEVOIMA, 0));
786        Keyboard.Listen(Key.Right, ButtonState.Down, liikuta, "Liikkuu oikealle", pelaaja2, new Vector(LIIKEVOIMA, 0));
787        Keyboard.Listen(Key.Up, ButtonState.Pressed, hyppaa, "Hyppää", pelaaja2, HYPPYVOIMA);
788        Keyboard.Listen(Key.Enter, ButtonState.Down, Ammu, "Ammu", pelaaja2);
789
790        Keyboard.Listen(Key.Escape, ButtonState.Pressed, PeliPauselle, "Pysäyttää pelin");
791
792        Keyboard.Listen(Key.LeftShift, ButtonState.Pressed, Testi, "testi");
793
794        lisaaGamePadNappaimet(ControllerOne, pelaaja1);
795        lisaaGamePadNappaimet(ControllerTwo, pelaaja2);
796    }
797
798    void Testi()
799    {
800        MessageDisplay.Add("testi");
801    }
802    void lisaaGamePadNappaimet(GamePad pelaajaNro, PlatformCharacter pelaaja)
803    {
804        //Yleiset näppäimet
805        //pelaajaNro.Listen(pelaajaNro, Button.Start, ButtonState.Pressed, uusiPeli, "Aloittaa uuden pelin");
806
807        //pelaajaNro.Listen(pelaajaNro, Button.DPadLeft, ButtonState.Down, liikuta, "Pelaaja liikkuu vasemmalle", pelaaja, new Vector(-liikeVoima, 0));
808        //pelaajaNro.Listen(pelaajaNro, Button.DPadRight, ButtonState.Down, liikuta, "Pelaaja liikkuu oikealle", pelaaja, new Vector(liikeVoima, 0));
809        //pelaajaNro.Listen(pelaajaNro, Button.A, ButtonState.Pressed, hyppaa, "Pelaaja hyppää", pelaaja, hyppyVoima);
810        //pelaajaNro.Listen(pelaajaNro, Button.RightTrigger, ButtonState.Down, Ammu, "Ammu", pelaaja);
811    }
812
813    void PeliPauselle()
814    {
815        Pause();
816        MultiSelectWindow PauseValikko = new MultiSelectWindow("Kynäri",
817        "Jatka peliä", "Aloita peli alusta", "Päävalikko", "Lopeta");
818        Add(PauseValikko);
819        PauseValikko.AddItemHandler(0, Pause);
820        PauseValikko.AddItemHandler(1, delegate { uusiPeli(); Pause(); });
821        PauseValikko.AddItemHandler(2, delegate { LuoAlkuValikko(); Pause(); });
822        PauseValikko.AddItemHandler(3, Exit);
823        PauseValikko.DefaultCancel = 0;
824        PauseValikko.Color = Color.Gray;
825    }
826
827    // Näppäimiin liitetyt toiminnot alkavat tästä -->
828    void liikuta(PlatformCharacter hahmo, Vector voima)
829    {
830        //hahmo.Walk(e.Time, voima);
831        hahmo.Walk(voima.X);
832    }
833
834    void naytaTiedot()
835    {
836        MessageDisplay.Clear();
837        MessageDisplay.X = 0;
838        if (pelaaja1.Weapon != null)
839        {
840            MessageDisplay.Add("Pelaaja 1: " + pelaaja1.Weapon.Tag);
841        }
842        if (pelaaja2.Weapon != null)
843        {
844            MessageDisplay.Add("Pelaaja 2: " + pelaaja2.Weapon.Tag);
845        }
846    }
847
848    void Ammu(PlatformCharacter hahmo)
849    {
850        if (hahmo.IsDestroyed || saaAmpua == false)
851        {
852            return;
853        }
854
855        PhysicsObject ammus = hahmo.Weapon.Shoot();
856
857        if (ammus != null)
858        {
859            ammus.Tag = "ammus";
860            ammus.IgnoresCollisionResponse = true;
861            ammus.IgnoresExplosions = true;
862
863            if ((string)hahmo.Weapon.Tag == "Kranaatinheitin")
864            {
865                ammus.Destroying += delegate { KranaattiRajahdys(ammus); };
866                ammus.IgnoresCollisionResponse = false;
867
868                Timer.SingleShot(0.1, delegate { ammus.CollisionIgnorer = null; });
869            }
870            if ((string)hahmo.Weapon.Tag == "Raketinheitin")
871            {
872                ammus.Destroying += delegate { RakettiRajahdys(ammus); };
873                ammus.IgnoresCollisionResponse = false;
874
875                Timer.SingleShot(0.1, delegate { ammus.CollisionIgnorer = null; });
876            }
877            if ((string)hahmo.Weapon.Tag == "Haulikko")
878            {
879                for (int i = 0; i < 5; i++)
880                {
881                    PhysicsObject ammus2 = new PhysicsObject(ammus.Image);
882                    ammus2.IgnoresGravity = true;
883                    ammus2.Size = ammus.Size;
884                    ammus2.Position = ammus.Position;
885                    ammus2.Velocity = ammus.Velocity;
886                    ammus2.MaximumLifetime = TimeSpan.FromSeconds(0.4);
887                    ammus2.Hit(new Vector(RandomGen.NextDouble(-100, 100), RandomGen.NextDouble(-300, 300)));
888                    //ammus2.CollisionIgnoreGroup = 2;
889                    ammus2.CollisionIgnorer = ammus.CollisionIgnorer;
890                    ammus2.Tag = "ammus";
891                    ammus2.IgnoresCollisionResponse = true;
892                    ammus2.IgnoresExplosions = true;
893                    AddCollisionHandler(ammus2, HaulikkoOsui);
894                    Add(ammus2);
895                }
896            }
897            Add(ammus);
898        }
899
900        return;
901    }
902
903    void KranaattiRajahdys(PhysicsObject ammus)
904    {
905        Explosion rajahdys = new Explosion(100);
906        rajahdys.Position = ammus.Position;
907        rajahdys.AddShockwaveHandler("pelaaja", PaineaaltoOsuu);
908        Add(rajahdys);
909        rajahdys.Force = 100;
910        rajahdys.Speed = 1000;
911    }
912    void RakettiRajahdys(PhysicsObject ammus)
913    {
914        Explosion rajahdys = new Explosion(50);
915        rajahdys.Position = ammus.Position;
916        rajahdys.AddShockwaveHandler("pelaaja", RaketinPaineaaltoOsuu);
917        Add(rajahdys);
918        rajahdys.Force = 100;
919        rajahdys.Speed = 1000;
920    }
921
922    void hyppaa(PlatformCharacter hahmo, double voima)
923    {
924        //PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
925        //double voima = e.Parameter1.ToDouble();
926
927        /* if (Math.Abs(hahmo.Velocity.Y) > 0.001)
928         {
929             return;
930         }
931         */
932
933        if (hahmo.Jump(voima))
934        {
935            hyppyAani.Play();
936        }
937    }
938
939    void uusiPeli()
940    {
941        NollaaLaskurit();
942        aloitaUusiPeli();
943    }
944    #endregion
945
946
947}
Note: See TracBrowser for help on using the repository browser.