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

Revision 3948, 27.1 KB checked in by anlakane, 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    const int PISTEMAARA_JOLLA_VOITTAA_PELIN = 3;
31
32    Pelaaja pelaaja1 = new Pelaaja(40, 40, Shape.Circle);
33    Pelaaja pelaaja2 = new Pelaaja(40, 40, Shape.Circle);
34    //DoubleMeter hpLaskuri1 = new DoubleMeter(100);
35    //DoubleMeter hpLaskuri2 = new DoubleMeter(100);
36
37    Image kranaatinheittimenkuva = LoadImage("grenadelauncher");
38    Image kranaatinkuva = LoadImage("grenade");
39    Image magnumkuva = LoadImage("magnum");
40    Image norsu = LoadImage("norsu");
41    Image haulikonkuva = LoadImage("shotgun");
42    Image pistoolinkuva = LoadImage("pistol");
43    Image kivaarinkuva = LoadImage("assaultrifle");
44    Image raketinheittimenkuva = LoadImage("rocketlauncher");
45    Image raketinkuva = LoadImage("rocket");
46    Image sniperinkuva = LoadImage("sniper");
47    bool saaAmpua = false;
48    //bool peliohi = false;
49
50    SoundEffect hyppyAani = LoadSoundEffect("hyppays");
51
52    ProgressBar hpNaytto;
53    ProgressBar hpNaytto2;
54
55    IntMeter pelaajan1Pisteet;
56    IntMeter pelaajan2Pisteet;
57
58    #endregion
59
60    #region Alustukset
61    public override void Begin()
62    {
63        pelaajan1Pisteet = new IntMeter(0);
64        pelaajan2Pisteet = new IntMeter(0);
65
66        DrawPerimeter = false; // ei haluta piirtää kentän reunoja
67        LuoAlkuValikko();
68    }
69
70    void AloitaUusiPeli()
71    {
72
73        MessageDisplay.Clear();
74        // ladataan kenttä
75        //seuraavaKentta();
76        LuoKentta(1);
77        lisaaNappaimet();
78        LisaaLaskurit();
79        LisaaHPNaytot();
80        naytaTiedot();
81        //peliohi = false;
82        saaAmpua = false;
83        Timer.SingleShot(0.1, delegate
84        {
85            saaAmpua = true;
86        });
87    }
88    #endregion
89
90
91    #region KentanLataus
92
93    void LuoKentta(int kenttaNro)
94    {
95        ClearAll();
96        TileMap ruudut = TileMap.FromLevelAsset("kentta1");
97        ruudut.SetTileMethod('x', LuoReuna);
98        ruudut.SetTileMethod('t', LuoTaso);
99        ruudut.SetTileMethod('A', LuoAse, new Vector(39, 13), "Kivääri", kivaarinkuva);
100        ruudut.SetTileMethod('G', LuoAse, new Vector(42, 15), "Kranaatinheitin", kranaatinheittimenkuva);
101        ruudut.SetTileMethod('S', LuoAse, new Vector(42, 10), "Haulikko", haulikonkuva);
102        ruudut.SetTileMethod('M', LuoAse, new Vector(17, 12), "Magnum", magnumkuva);
103        ruudut.SetTileMethod('R', LuoAse, new Vector(48, 15), "Raketinheitin", raketinheittimenkuva);
104        ruudut.SetTileMethod('U', LuoAse, new Vector(42, 11), "Sniper", sniperinkuva);
105        ruudut.SetTileMethod('1', delegate(Vector paikka, double leveys, double korkeus) { pelaaja1 = LuoPelaaja(paikka, leveys, korkeus, pelaaja1); });
106        ruudut.SetTileMethod('2', delegate(Vector paikka, double leveys, double korkeus) { pelaaja2 = LuoPelaaja(paikka, leveys, korkeus, pelaaja2); });
107        ruudut.Execute(RUUDUNLEVEYS, RUUDUNKORKEUS);
108        Level.Background.CreateGradient(Color.White, Color.Gray);
109        Gravity = new Vector(0, -1500);
110
111        Timer timer = new Timer();
112        timer.Interval = 0.1;
113        timer.Timeout += delegate { TarkistaReunat(Level.Right - 1.5 * RUUDUNLEVEYS, Level.Top - 1.5 * RUUDUNKORKEUS); };
114        timer.Start();
115    }
116
117    void LuoReuna(Vector paikka, double leveys, double korkeus)
118    {
119        PhysicsObject reuna = new PhysicsObject(leveys, korkeus);
120        reuna.Position = paikka;
121        reuna.Color = Color.Gray;
122        reuna.Tag = "reuna";
123        reuna.MakeStatic();
124        Add(reuna);
125    }
126
127    void LuoTaso(Vector paikka, double leveys, double korkeus)
128    {
129        PhysicsObject taso = new PhysicsObject(leveys, korkeus);
130        taso.Position = paikka;
131        taso.Color = Color.Gray;
132        taso.Tag = "taso";
133        taso.MakeStatic();
134        Add(taso);
135    }
136
137
138    void TarkistaReunat(double leveys, double korkeus)
139    {
140        if (pelaaja1.Position.X < -leveys) pelaaja1.Position = new Vector(-leveys, pelaaja1.Position.Y);
141        if (pelaaja1.Position.X > leveys) pelaaja1.Position = new Vector(leveys, pelaaja1.Position.Y);
142        if (pelaaja1.Position.Y < -korkeus) pelaaja1.Position = new Vector(pelaaja1.Position.X, -korkeus);
143        if (pelaaja1.Position.Y > korkeus) pelaaja1.Position = new Vector(pelaaja1.Position.Y, korkeus);
144        if (pelaaja2.Position.X < -leveys) pelaaja2.Position = new Vector(-leveys, pelaaja2.Position.Y);
145        if (pelaaja2.Position.X > leveys) pelaaja2.Position = new Vector(leveys, pelaaja2.Position.Y);
146        if (pelaaja2.Position.Y < -korkeus) pelaaja2.Position = new Vector(pelaaja2.Position.X, -korkeus);
147        if (pelaaja2.Position.Y > korkeus) pelaaja2.Position = new Vector(pelaaja2.Position.Y, korkeus);
148    }
149
150    void LuoAlkuValikko()
151    {
152        ClearAll();
153        NollaaLaskurit();
154        MultiSelectWindow alkuValikko = new MultiSelectWindow("Kynäri",
155        "Aloita peli", "Lopeta");
156        Add(alkuValikko);
157        alkuValikko.AddItemHandler(0, AloitaUusiPeli);
158        alkuValikko.AddItemHandler(1, Exit);
159        alkuValikko.DefaultCancel = 1;
160        alkuValikko.Color = Color.Gray;
161        Level.BackgroundColor = Color.Gray;
162    }
163
164    void luoTasot()
165    {
166        PhysicsObject alusta = new PhysicsObject(Level.Width, 300);
167        alusta.Color = Color.Gray;
168        alusta.X = 0;
169        alusta.Y = Level.Bottom - alusta.Height / 2;
170        Add(alusta);
171
172        lisaaPieniTaso(-200, -350);
173        lisaaPieniTaso(0, -400);
174        lisaaPieniTaso(100, -300);
175        lisaaPieniTaso(400, -350);
176        lisaaPieniTaso(450, -200);
177        lisaaPieniTaso(-500, -400);
178        lisaaPieniTaso(-550, -200);
179        lisaaPieniTaso(-400, -300);
180        lisaaPieniTaso(-150, -150);
181        lisaaPieniTaso(-870, -350);
182        lisaaPieniTaso(-700, -400);
183
184        lisaaPieniTaso(600, -300);
185        lisaaPieniTaso(850, -300);
186        lisaaPieniTaso(750, -400);
187        lisaaPieniTaso(200, -200);
188        lisaaPieniTaso(-200, -150);
189
190        lisaaPystyTaso(600, -450);
191        lisaaPystyTaso(-600, -500);
192        lisaaPystyTaso(0, -450);
193
194        lisaaReuna(-1375, 0);
195        lisaaReuna(1375, 0);
196    }
197
198    void LisaaHPNaytot()
199    {
200        // luodaan elämänäyttö
201        hpNaytto = new ProgressBar(250, 30);
202        //hpNaytto.Angle = Angle.FromDegrees(90);
203        hpNaytto.BarColor = Color.LightGreen;
204        hpNaytto.Color = Color.Red;
205        hpNaytto.BindTo(pelaaja1.HPLaskuri);
206        hpNaytto.Position = new Vector(Screen.LeftSafe + 300, Screen.TopSafe - 170);
207        Add(hpNaytto);
208
209        hpNaytto2 = new ProgressBar(250, 30);
210        //hpNaytto2.Angle = Angle.FromDegrees(90);
211        hpNaytto2.BarColor = Color.LightGreen;
212        hpNaytto2.Color = Color.Red;
213        hpNaytto2.BindTo(pelaaja2.HPLaskuri);
214        hpNaytto2.Position = new Vector(Screen.RightSafe - 300, Screen.TopSafe - 170);
215        Add(hpNaytto2);
216    }
217
218    void LisaaLaskurit()
219    {
220        LuoPisteLaskuri(Screen.Left + 100.0, Screen.Top - 175.0, pelaajan1Pisteet);
221        LuoPisteLaskuri(Screen.Right - 100.0, Screen.Top - 175.0, pelaajan2Pisteet);
222        pelaajan1Pisteet.MaxValue = PISTEMAARA_JOLLA_VOITTAA_PELIN;
223        pelaajan2Pisteet.MaxValue = PISTEMAARA_JOLLA_VOITTAA_PELIN;
224        pelaajan1Pisteet.UpperLimit += delegate() { PelaajaVoittaa(pelaaja1, "Pelaaja 1", pelaaja2, pelaajan2Pisteet); };
225        pelaajan2Pisteet.UpperLimit += delegate() { PelaajaVoittaa(pelaaja2, "Pelaaja 2", pelaaja1, pelaajan1Pisteet); };
226    }
227
228    void NollaaLaskurit()
229    {
230        pelaajan1Pisteet.Reset();
231        pelaajan2Pisteet.Reset();
232    }
233
234    IntMeter LuoPisteLaskuri(double x, double y, IntMeter laskuri)
235    {
236        Label naytto = new Label();
237        naytto.BindTo(laskuri);
238        naytto.X = x;
239        naytto.Y = y;
240        Add(naytto);
241        return laskuri;
242    }
243
244    void PelaajaVoittaa(Pelaaja voittaja, String voittajanNimi, Pelaaja haviaja, IntMeter haviajanPisteet)
245    {
246        MessageDisplay.Clear();
247        if (voittaja.IsDestroying && haviajanPisteet.Value == haviajanPisteet.MaxValue)
248        {
249            MessageDisplay.Add("Tasapeli!");
250        }
251        else
252        {
253            MessageDisplay.Add(voittajanNimi + " voittaa!");
254        }
255
256    }
257
258    //Vanha
259    void Pelaaja1Voitti()
260    {
261
262        MessageDisplay.Clear();
263        if (pelaaja1.IsDestroying && pelaajan2Pisteet.Value == pelaajan2Pisteet.MaxValue)
264        {
265            MessageDisplay.Add("Tasapeli!");
266        }
267        else
268        {
269            MessageDisplay.Add("Pelaaja 1 voittaa!");
270        }
271        MessageDisplay.X = 0;
272    }
273
274    //Vanha
275    void Pelaaja2Voitti()
276    {
277        MessageDisplay.Clear();
278        if (pelaaja2.IsDestroying && pelaajan1Pisteet.Value == pelaajan1Pisteet.MaxValue)
279        {
280            MessageDisplay.Add("Tasapeli!");
281        }
282        else
283        {
284            MessageDisplay.Add("Pelaaja 2 voittaa!");
285        }
286        MessageDisplay.X = 0;
287
288    }
289
290    void lisaaPieniTaso(double x, double y)
291    {
292        PhysicsObject taso = PhysicsObject.CreateStaticObject(100, 30, Shape.Rectangle);
293        taso.Color = Color.Gray;
294        taso.X = x;
295        taso.Y = y;
296        Add(taso);
297    }
298
299    void lisaaReuna(double x, double y)
300    {
301        PhysicsObject taso = PhysicsObject.CreateStaticObject(1000, 1000, Shape.Rectangle);
302        taso.Color = Color.Gray;
303        taso.X = x;
304        taso.Y = y;
305        Add(taso);
306    }
307
308    void lisaaPystyTaso(double x, double y)
309    {
310        PhysicsObject taso = PhysicsObject.CreateStaticObject(30, 100, Shape.Rectangle);
311        taso.Color = Color.Gray;
312        taso.X = x;
313        taso.Y = y;
314        Add(taso);
315    }
316
317    Pelaaja LuoPelaaja(Vector paikka, double leveys, double korkeus, Pelaaja pelaaja)
318    {
319        pelaaja = new Pelaaja(40, 40, Shape.Circle);
320        pelaaja.Image = norsu;
321        pelaaja.Position = paikka;
322        pelaaja.Tag = "pelaaja";
323
324        pelaaja.HPLaskuri = new DoubleMeter(100, 0, 100);
325        pelaaja.HPLaskuri.MaxValue = 100;
326        pelaaja.HPLaskuri.Value = 100;
327        pelaaja.HPLaskuri.LowerLimit += delegate()
328        {
329            PelaajaKuoli(pelaaja);
330        };
331        Add(pelaaja);
332
333        //lisaaAsePelaajalle(ase, pelaaja);
334        PhysicsObject pistol = new PhysicsObject(16, 11);
335        pistol.Image = pistoolinkuva;
336        pistol.Tag = "Pistooli";
337
338        LuoAsePelaajalle(pistol, pelaaja);
339        return pelaaja;
340    }
341
342    void PelaajaKuoli(Pelaaja pelaaja)
343    {
344        if (pelaaja.IsDestroying)
345        {
346            return;
347        }
348
349        pelaaja.Destroy();
350        PudotaAseenHahmo(pelaaja);
351        MessageDisplay.Clear();
352        MessageDisplay.X = 0;
353
354        if (pelaaja == pelaaja1)
355        {
356            pelaajan2Pisteet.Value += 1;
357
358            if (!(pelaajan1Pisteet.Value == pelaajan1Pisteet.MaxValue || pelaajan2Pisteet.Value == pelaajan2Pisteet.MaxValue))
359            {
360                if (pelaaja2.IsDestroying && pelaajan1Pisteet.Value != pelaajan1Pisteet.MaxValue)
361                {
362                    MessageDisplay.Clear();
363                    MessageDisplay.Add("Erä tasan!");
364                }
365                else if (pelaajan1Pisteet.Value != pelaajan1Pisteet.MaxValue)
366                {
367                    MessageDisplay.Add("Pelaaja 2 voitti erän!");
368                }
369
370                Timer.SingleShot(3.0, AloitaUusiPeli);
371            }
372            else if (pelaajan2Pisteet.Value == pelaajan2Pisteet.MaxValue)
373            {
374                Pelaaja2Voitti();
375                ClearTimers();
376                Timer.SingleShot(3.0, LuoAlkuValikko);
377            }
378        }
379
380        if (pelaaja == pelaaja2)
381        {
382            pelaajan1Pisteet.Value += 1;
383
384            if (!(pelaajan2Pisteet.Value == pelaajan2Pisteet.MaxValue || pelaajan1Pisteet.Value == pelaajan1Pisteet.MaxValue))
385            {
386                if (pelaaja1.IsDestroying && pelaajan2Pisteet.Value != pelaajan2Pisteet.MaxValue)
387                {
388                    MessageDisplay.Clear();
389                    MessageDisplay.Add("Erä tasan!");
390                }
391                else if (pelaajan1Pisteet.Value != pelaajan2Pisteet.MaxValue)
392                {
393                    MessageDisplay.Add("Pelaaja 1 voitti erän!");
394                }
395
396                Timer.SingleShot(3.0, AloitaUusiPeli);
397            }
398            else if (pelaajan1Pisteet.Value == pelaajan1Pisteet.MaxValue)
399            {
400                Pelaaja1Voitti();
401                ClearTimers();
402                Timer.SingleShot(3.0, LuoAlkuValikko);
403            }
404        }
405
406    }
407
408    void keraaAse(PhysicsObject ase, Pelaaja pelaaja)
409    {
410        if (!pelaaja.voikoPoimiaAseen) return;
411        ase.Destroy();
412        PudotaAseenHahmo(pelaaja); // tiputtaa asetta vastaavan fysiikkaolion maahan kerättäväksi uudestaan
413        LuoAsePelaajalle(ase, pelaaja);
414        naytaTiedot();
415    }
416
417
418    private void PudotaAseenHahmo(Pelaaja pelaaja)
419    {
420        if (pelaaja.Weapon == null) return;
421
422        pelaaja.voikoPoimiaAseen = false;
423        Timer.SingleShot(0.5, delegate { pelaaja.voikoPoimiaAseen = true; });
424        String aseenTagi = pelaaja.Weapon.Tag.ToString();
425        Vector koko = pelaaja.Weapon.Size;
426        Vector paikka = pelaaja.Position;
427
428        PhysicsObject tiputettuAse = new PhysicsObject(koko.X, koko.Y);
429        tiputettuAse.Position = paikka;
430        tiputettuAse.Tag = aseenTagi;
431        tiputettuAse.CollisionIgnoreGroup = 1;
432        pelaaja.CollisionIgnoreGroup = 1;
433        Timer.SingleShot(1.0, delegate
434        {
435            tiputettuAse.CollisionIgnoreGroup = 0;
436            pelaaja.CollisionIgnoreGroup = 0;
437        });
438        Add(tiputettuAse);
439        tiputettuAse.Image = pelaaja.Weapon.Image;
440        AddCollisionHandler<PhysicsObject, Pelaaja>(tiputettuAse, "pelaaja", keraaAse);
441
442        pelaaja.Weapon = null;
443    }
444
445    void KranaattiOsui(PhysicsObject ammus, PhysicsObject kohde)
446    {
447        if (ammus.IsDestroying) return;
448        if (!(kohde is Pelaaja)) return;
449        RajaytaKranaatti(ammus);
450
451        Pelaaja pelaaja = (Pelaaja)kohde;
452        ammus.Destroy();
453        pelaaja.HPLaskuri.Value -= 25;
454    }
455
456    void RajaytaKranaatti(PhysicsObject ammus)
457    {
458        if (ammus.IsDestroying || ammus.IsDestroyed) return;
459        Explosion rajahdys = new Explosion(100);
460        rajahdys.Position = ammus.Position;
461        rajahdys.ShockwaveReachesObject += delegate(IPhysicsObject p, Vector shokki) { PaineaaltoOsuu(p, shokki, rajahdys, 50.0); };
462        Add(rajahdys);
463        rajahdys.Force = 50;
464        rajahdys.Speed = 1000;
465        ammus.Destroy();
466    }
467
468    void RakettiOsui(PhysicsObject ammus, PhysicsObject kohde)
469    {
470        if (ammus.IsDestroying) return;
471        Explosion rajahdys = new Explosion(75);
472        rajahdys.Position = ammus.Position;
473        rajahdys.ShockwaveReachesObject += delegate(IPhysicsObject p, Vector shokki) { PaineaaltoOsuu(p, shokki, rajahdys, 40.0); };
474        Add(rajahdys);
475        rajahdys.Force = 50;
476        rajahdys.Speed = 1000;
477
478        ammus.Destroy(); // ei voi taata tapahtuuko tämä "heti". Siksi tarvitaan alkuun tarkistus, että onko ammus tuhoutumassa.
479        if (!(kohde is Pelaaja)) return;
480        Pelaaja pelaaja = (Pelaaja)kohde;
481        pelaaja.HPLaskuri.Value -= 20;
482    }
483
484    void PaineaaltoOsuu(IPhysicsObject kohde, Vector shokki, Explosion e, double damagenMaara)
485    {
486        if (!(kohde is Pelaaja)) return;
487        Pelaaja p = (Pelaaja)kohde;
488        if (p.ViimeisinRajahdys == e) return;
489        p.ViimeisinRajahdys = e;
490        p.HPLaskuri.Value -= damagenMaara;
491    }
492
493    void AmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
494    {
495        if (ammus.IsDestroying) return;
496        if (kohde.Tag.ToString() != "ammus") ammus.Destroy();
497        if (!(kohde is Pelaaja)) return;
498        Pelaaja p = (Pelaaja)kohde;
499        p.HPLaskuri.Value -= 15;
500    }
501
502    void KivaariOsui(PhysicsObject ammus, PhysicsObject kohde)
503    {
504        if (ammus.IsDestroying) return;
505        if ((string)kohde.Tag != "ammus") ammus.Destroy();
506        if (!(kohde is Pelaaja)) return;
507        Pelaaja p = (Pelaaja)kohde;
508        p.HPLaskuri.Value -= 10;
509    }
510
511    void SniperOsui(PhysicsObject ammus, PhysicsObject kohde)
512    {
513        if (ammus.IsDestroying) return;
514        if ((string)kohde.Tag != "ammus") ammus.Destroy();
515        if (!(kohde is Pelaaja)) return;
516        Pelaaja p = (Pelaaja)kohde;
517        p.HPLaskuri.Value -= 80;
518    }
519
520    void MagnumOsui(PhysicsObject ammus, PhysicsObject kohde)
521    {
522        if (ammus.IsDestroying) return;
523        if ((string)kohde.Tag != "ammus") ammus.Destroy();
524        if (!(kohde is Pelaaja)) return;
525        Pelaaja p = (Pelaaja)kohde;
526        p.HPLaskuri.Value -= 35;
527    }
528
529    void HaulikkoOsui(PhysicsObject ammus, PhysicsObject kohde)
530    {
531        if (ammus.IsDestroying) return;
532        if ((string)kohde.Tag != "ammus") ammus.Destroy();
533        if (!(kohde is Pelaaja)) return;
534        Pelaaja p = (Pelaaja)kohde;
535        p.HPLaskuri.Value -= 13;
536    }
537
538    void LuoAse(Vector paikka, double leveys, double korkeus, Vector koko, String tagi, Image kuva)
539    {
540        PhysicsObject ase = new PhysicsObject(koko.X, koko.Y);
541        ase.Position = paikka;
542        ase.Tag = tagi;
543        ase.Image = kuva;
544        Add(ase);
545        AddCollisionHandler<PhysicsObject, Pelaaja>(ase, "pelaaja", keraaAse);
546    }
547
548
549    /// <summary>
550    ///
551    /// </summary>
552    /// <param name="aseenHahmo">Fysiikkaolio, jonka perusteella laitetaan pelaajalle ase</param>
553    /// <param name="pelaaja">Pelaaja jolle ase luodaan</param>
554    /// <returns></returns>
555    private void LuoAsePelaajalle(PhysicsObject aseenHahmo, Pelaaja pelaaja)
556    {
557        if (aseenHahmo == null) return;
558
559        // Varsinainen ase
560        Weapon ase = null;
561
562        if (aseenHahmo.Tag.ToString() == "Kivääri")
563        {
564            ase = new AssaultRifle(39, 13);
565            ase.FireRate = 7;
566            ase.ProjectileCollision = KivaariOsui;
567            ase.MaxAmmoLifetime = TimeSpan.FromSeconds(10);
568            ase.Tag = "Kivääri";
569            ase.Image = kivaarinkuva;
570        }
571        if (aseenHahmo.Tag.ToString() == "Magnum")
572        {
573            ase = new AssaultRifle(17, 12);
574            ase.FireRate = 1.2;
575            ase.ProjectileCollision = MagnumOsui;
576            ase.MaxAmmoLifetime = TimeSpan.FromSeconds(10);
577            ase.Tag = "Magnum";
578            ase.Image = magnumkuva;
579
580            // Paikka suhteessa pelaajaan
581            ase.X = 10;
582            ase.Y = 10;
583        }
584
585        if (aseenHahmo.Tag.ToString() == "Haulikko")
586        {
587            ase = new AssaultRifle(42, 10);
588            ase.FireRate = 0.75;
589            ase.ProjectileCollision = HaulikkoOsui;
590            ase.MaxAmmoLifetime = TimeSpan.FromSeconds(0.4);
591            ase.Tag = "Haulikko";
592            ase.Image = haulikonkuva;
593        }
594
595        if (aseenHahmo.Tag.ToString() == "Sniper")
596        {
597            ase = new AssaultRifle(42, 11);
598            ase.FireRate = 0.4;
599            ase.ProjectileCollision = SniperOsui;
600            ase.Power.Value = 400;
601            ase.Power.DefaultValue = 400;
602            ase.MaxAmmoLifetime = TimeSpan.FromSeconds(10);
603            ase.Tag = "Sniper";
604            ase.Image = sniperinkuva;
605        }
606
607        if (aseenHahmo.Tag.ToString() == "Kranaatinheitin")
608        {
609            ase = new Cannon(42, 15);
610            ase.FireRate = 0.5;
611            ase.ProjectileCollision = delegate(PhysicsObject ammus, PhysicsObject kohde) { KranaattiOsui(ammus, kohde); };
612            ase.MaxAmmoLifetime = TimeSpan.FromSeconds(3);
613            ase.Tag = "Kranaatinheitin";
614            ase.Image = kranaatinheittimenkuva;
615        }
616        if (aseenHahmo.Tag.ToString() == "Raketinheitin")
617        {
618            ase = new AssaultRifle(48, 15);
619            ase.FireRate = 0.5;
620            ase.ProjectileCollision = delegate(PhysicsObject ammus, PhysicsObject kohde) { RakettiOsui(ammus, kohde); };
621            ase.Power.Value = 125;
622            ase.Power.DefaultValue = 125;
623            ase.MaxAmmoLifetime = TimeSpan.FromSeconds(10);
624            ase.Tag = "Raketinheitin";
625            ase.Image = raketinheittimenkuva;
626        }
627
628        if (aseenHahmo.Tag.ToString() == "Pistooli")
629        {
630            ase = new AssaultRifle(16, 11);
631            ase.FireRate = 2;
632            ase.ProjectileCollision = AmmusOsui;
633            ase.MaxAmmoLifetime = TimeSpan.FromSeconds(10);
634            ase.Tag = "Pistooli";
635            ase.Image = pistoolinkuva;
636            ase.X = 10;
637            ase.Y = 10;
638        }
639
640        pelaaja.Weapon = ase;
641    }
642
643    void lisaaAsePelaajalle(PhysicsObject ase, Pelaaja pelaaja)
644    {
645        Bullet luoti = new Bullet(1);
646        PhysicsObject pistol = new PhysicsObject(16, 11);
647        pistol.Image = pistoolinkuva;
648        pistol.Tag = "Pistooli";
649
650        LuoAsePelaajalle(ase, pelaaja);
651    }
652
653    #endregion
654
655
656    #region Nappaimet
657    // Lisää peliin kaikki näppäimet
658    void lisaaNappaimet()
659    {
660        ClearControls();
661        //Yleiset näppäimet
662        Keyboard.Listen(Key.F1, ButtonState.Pressed, uusiPeli, "Aloittaa uuden pelin");
663
664        // Pelaajan näppäimet
665        Keyboard.Listen(Key.A, ButtonState.Down, liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector(-LIIKEVOIMA, 0));
666        Keyboard.Listen(Key.D, ButtonState.Down, liikuta, "Liikkuu oikealle", pelaaja1, new Vector(LIIKEVOIMA, 0));
667        Keyboard.Listen(Key.W, ButtonState.Pressed, hyppaa, "Hyppää", pelaaja1, HYPPYVOIMA);
668        Keyboard.Listen(Key.Space, ButtonState.Down, Ammu, "Ammu", pelaaja1);
669
670        Keyboard.Listen(Key.Left, ButtonState.Down, liikuta, "Liikkuu vasemmalle", pelaaja2, new Vector(-LIIKEVOIMA, 0));
671        Keyboard.Listen(Key.Right, ButtonState.Down, liikuta, "Liikkuu oikealle", pelaaja2, new Vector(LIIKEVOIMA, 0));
672        Keyboard.Listen(Key.Up, ButtonState.Pressed, hyppaa, "Hyppää", pelaaja2, HYPPYVOIMA);
673        Keyboard.Listen(Key.RightControl, ButtonState.Down, Ammu, "Ammu", pelaaja2);
674
675        Keyboard.Listen(Key.Escape, ButtonState.Pressed, PeliPauselle, "Pysäyttää pelin");
676
677        lisaaGamePadNappaimet(ControllerOne, pelaaja1);
678        lisaaGamePadNappaimet(ControllerTwo, pelaaja2);
679    }
680
681    void lisaaGamePadNappaimet(GamePad pelaajaNro, PlatformCharacter pelaaja)
682    {
683        //Yleiset näppäimet
684        pelaajaNro.Listen(Button.Start, ButtonState.Pressed, PeliPauselle, "Pysäyttää pelin");
685
686        //pelaajaNro.ListenAnalog(AnalogControl.LeftStick, 0.1, liikuta, "Pelaaja liikkuu vasemmalle", pelaaja, new Vector(-LIIKEVOIMA, 0));
687        //pelaajaNro.ListenAnalog(AnalogControl.LeftStick, 0.1, liikuta, "Pelaaja liikkuu vasemmalle", pelaaja, new Vector(-LIIKEVOIMA, 0));
688        pelaajaNro.Listen(Button.DPadLeft, ButtonState.Down, liikuta, "Pelaaja liikkuu vasemmalle", pelaaja, new Vector(-LIIKEVOIMA, 0));
689        pelaajaNro.Listen(Button.DPadRight, ButtonState.Down, liikuta, "Pelaaja liikkuu oikealle", pelaaja, new Vector(LIIKEVOIMA, 0));
690        pelaajaNro.Listen(Button.A, ButtonState.Pressed, hyppaa, "Pelaaja hyppää", pelaaja, HYPPYVOIMA);
691        pelaajaNro.Listen(Button.RightTrigger, ButtonState.Down, Ammu, "Ammu", pelaaja);
692    }
693
694    void PeliPauselle()
695    {
696        Pause();
697        MultiSelectWindow PauseValikko = new MultiSelectWindow("Kynäri",
698        "Jatka peliä", "Aloita peli alusta", "Päävalikko", "Lopeta");
699        Add(PauseValikko);
700        PauseValikko.AddItemHandler(0, Pause);
701        PauseValikko.AddItemHandler(1, delegate { uusiPeli(); Pause(); });
702        PauseValikko.AddItemHandler(2, delegate { LuoAlkuValikko(); Pause(); });
703        PauseValikko.AddItemHandler(3, Exit);
704        PauseValikko.DefaultCancel = 0;
705        PauseValikko.Color = Color.Gray;
706    }
707
708    // Näppäimiin liitetyt toiminnot alkavat tästä -->
709    void liikuta(PlatformCharacter hahmo, Vector voima)
710    {
711        hahmo.Walk(voima.X);
712    }
713
714    void naytaTiedot()
715    {
716        MessageDisplay.Clear();
717        MessageDisplay.X = 0;
718        if (pelaaja1.Weapon != null)
719        {
720            MessageDisplay.Add("Pelaaja 1: " + pelaaja1.Weapon.Tag);
721        }
722        if (pelaaja2.Weapon != null)
723        {
724            MessageDisplay.Add("Pelaaja 2: " + pelaaja2.Weapon.Tag);
725        }
726    }
727
728    void Ammu(PlatformCharacter hahmo)
729    {
730        if (hahmo.IsDestroyed || !saaAmpua) return;
731        PhysicsObject ammus = hahmo.Weapon.Shoot();
732        if (ammus == null) return;
733
734        ammus.Tag = "ammus";
735        ammus.IgnoresCollisionResponse = true;
736        ammus.IgnoresExplosions = true;
737
738        if (hahmo.Weapon.Tag.ToString() == "Kranaatinheitin")
739        {
740            ammus.Image = kranaatinkuva;
741            ammus.Size += new Vector(2, 1);
742            Timer.SingleShot(2.0, delegate { RajaytaKranaatti(ammus); });
743            ammus.IgnoresCollisionResponse = false;
744            Timer.SingleShot(0.1, delegate { ammus.CollisionIgnorer = null; });
745        }
746
747        if ((string)hahmo.Weapon.Tag == "Raketinheitin")
748        {
749            ammus.Image = raketinkuva;
750            ammus.Size += new Vector(3, 1);
751            ammus.IgnoresCollisionResponse = false;
752            Timer.SingleShot(0.1, delegate { ammus.CollisionIgnorer = null; });
753        }
754        if ((string)hahmo.Weapon.Tag == "Haulikko")
755        {
756            for (int i = 0; i < 5; i++)
757            {
758                PhysicsObject ammus2 = new PhysicsObject(ammus.Image);
759                ammus2.IgnoresGravity = true;
760                ammus2.Size = ammus.Size;
761                ammus2.Position = ammus.Position;
762                ammus2.Velocity = ammus.Velocity;
763                ammus2.MaximumLifetime = TimeSpan.FromSeconds(0.4);
764                ammus2.Hit(new Vector(RandomGen.NextDouble(-100, 100), RandomGen.NextDouble(-300, 300)));
765                ammus2.CollisionIgnorer = ammus.CollisionIgnorer;
766                ammus2.Tag = "ammus";
767                ammus2.IgnoresCollisionResponse = true;
768                ammus2.IgnoresExplosions = true;
769                AddCollisionHandler(ammus2, HaulikkoOsui);
770                Add(ammus2);
771            }
772        }
773        Add(ammus);
774    }
775
776    void hyppaa(PlatformCharacter hahmo, double voima)
777    {
778        if (hahmo.Jump(voima)) hyppyAani.Play();
779    }
780
781    void uusiPeli()
782    {
783        NollaaLaskurit();
784        AloitaUusiPeli();
785    }
786    #endregion
787
788
789}
Note: See TracBrowser for help on using the repository browser.