source: 2015/koodauskerho/AakeR/IMBT/IMBT/IMBT/IMBT.cs @ 7078

Revision 7078, 20.0 KB checked in by aaelruut, 5 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9public class Pelaaja : PhysicsObject
10{
11    public DoubleMeter healthit;
12    public bool savuttaa = false;
13    public bool boosti = true;
14    public AssaultRifle Ase;
15    public bool telaJaljetLimit;
16
17    public Pelaaja(double leveys, double korkeus, Image pelaajanKuva, Image tykkiTorninKuva, Image rajahdysKuva, Image liekkiKuva)
18        : base(leveys, korkeus)
19    {
20
21        this.Image = pelaajanKuva;
22        this.healthit = new DoubleMeter(100, 0, 100);
23        this.LinearDamping = 0.95;
24        this.telaJaljetLimit = true;
25        this.Tag = "pelaaja";
26        this.healthit.LowerLimit += delegate ()
27        {
28
29            Explosion rajahdys = new Explosion(200);
30            rajahdys.ShockwaveReachesObject += delegate (IPhysicsObject pelaajaJohonPaineaaltoOsui, Vector voima)
31            {
32                if (pelaajaJohonPaineaaltoOsui.Tag.Equals("pelaaja"))
33                {
34                    (pelaajaJohonPaineaaltoOsui as Pelaaja).healthit.Value -= 1000;
35                    SavuLiekki();
36                }
37            };
38            rajahdys.Image = rajahdysKuva;
39            rajahdys.Tag = "rajahdys";
40            rajahdys.Position = this.Position;
41            ((IMBT)Game.Instance).Add(rajahdys);
42
43            this.Ase.Ammo.Value = 0;
44            this.Ase.Destroy();
45            this.Destroy();
46        };
47
48        ((IMBT)Game.Instance).AddCollisionHandler(this, "perusAmmus", delegate (PhysicsObject a, PhysicsObject b)
49        {
50            this.healthit.Value -= 3.5;
51            SavuLiekki();
52        });
53        ((IMBT)Game.Instance).AddCollisionHandler(this, "raketti", delegate (PhysicsObject a, PhysicsObject b)
54        {
55            this.healthit.Value -= 12;
56            SavuLiekki();
57        });
58        ((IMBT)Game.Instance).AddCollisionHandler(this, "pallo", delegate (PhysicsObject a, PhysicsObject b)
59        {
60            this.healthit.Value -= 18;
61            SavuLiekki();
62        });
63        ((IMBT)Game.Instance).AddCollisionHandler(this, "rajahdys", delegate (PhysicsObject a, PhysicsObject b)
64        {
65            this.healthit.Value -= 1000;
66            SavuLiekki();
67        });
68        ((IMBT)Game.Instance).AddCollisionHandler(this, "laser", delegate (PhysicsObject a, PhysicsObject b)
69        {
70            this.healthit.Value -= 80;
71            SavuLiekki();
72        });
73
74        this.Ase = new AssaultRifle(30, 30);
75        this.Ase.Image = tykkiTorninKuva;
76
77        Game.Instance.Add(Ase, 1);
78
79        Timer ajastin = new Timer();
80        ajastin.Interval = 0.01;
81        ajastin.Timeout += delegate
82        {
83            Ase.Position = this.Position;
84        };
85        ajastin.Start();
86
87
88    }
89
90    public void SavuLiekki()
91    {
92        if (this.healthit.Value < this.healthit.MaxValue / 2)
93        {
94            if (this.savuttaa == false)
95            {
96                Smoke savu = new Smoke();
97                Game.Instance.Add(savu);
98                savu.Position = this.Position;
99                Timer seuraajaAjastin = new Timer();
100                seuraajaAjastin.Interval = 0.1;
101                seuraajaAjastin.Timeout += delegate
102                {
103                    savu.Position = this.Position;
104                };
105                seuraajaAjastin.Start();
106                this.savuttaa = true;
107            }
108        }
109
110        if (this.healthit.Value < this.healthit.MaxValue / 4)
111        {
112
113            Flame liekki = new Flame(((IMBT)Game.Instance).liekkiKuva);
114            liekki.MinScale = 25.0;
115            liekki.MaxScale = 50.0;
116            liekki.ScaleAmount = 0.8;
117            Game.Instance.Add(liekki);
118            liekki.Position = this.Position;
119            Timer seuraajaAjastin = new Timer();
120            seuraajaAjastin.Interval = 0.1;
121            seuraajaAjastin.Timeout += delegate
122            {
123                liekki.Position = this.Position;
124            };
125            seuraajaAjastin.Start();
126            this.savuttaa = true;
127
128        }
129
130    }
131
132
133
134
135}
136public class IMBT : PhysicsGame
137{
138
139    static Image pelaaja1Kone1 = LoadImage("Pelaaja1Kone1");
140    static Image pelaaja2Kone1 = LoadImage("Pelaaja2Kone1");
141    static Image pelaaja3Kone1 = LoadImage("Pelaaja3Kone1");
142    static Image pelaaja4Kone1 = LoadImage("Pelaaja4Kone1");
143    static Image pelaaja1Kone2 = LoadImage("Pelaaja1Kone2");
144    static Image pelaaja2Kone2 = LoadImage("Pelaaja2Kone2");
145    static Image pelaaja3Kone2 = LoadImage("Pelaaja3Kone2");
146    static Image pelaaja4Kone2 = LoadImage("Pelaaja4Kone2");
147    static Image palikkaKuva = LoadImage("Palikka");
148    static Image pelaaja4Kone1Tykki = LoadImage("Pelaaja4Kone1Tykki");
149    static Image pelaaja3Kone1Tykki = LoadImage("Pelaaja3Kone1Tykki");
150    static Image pelaaja2Kone1Tykki = LoadImage("Pelaaja2Kone1Tykki");
151    static Image pelaaja1Kone1Tykki = LoadImage("Pelaaja1Kone1Tykki");
152    static Image pelaaja1Kone2Tykki = LoadImage("Pelaaja1Kone2Tykki");
153    static Image pelaaja2Kone2Tykki = LoadImage("Pelaaja2Kone2Tykki");
154    static Image pelaaja3Kone2Tykki = LoadImage("Pelaaja3Kone2Tykki");
155    static Image pelaaja4Kone2Tykki = LoadImage("Pelaaja4Kone2Tykki");
156    static Image pelaaja1Kone3Tykki = LoadImage("Pelaaja1Kone3Tykki");
157    static Image pelaaja2Kone3Tykki = LoadImage("Pelaaja2Kone3Tykki");
158    static Image pelaaja3Kone3Tykki = LoadImage("Pelaaja3Kone3Tykki");
159    static Image pelaaja4Kone3Tykki = LoadImage("Pelaaja4Kone3Tykki");
160    static Image pelaaja1Kone3 = LoadImage("Pelaaja1Kone3");
161    static Image pelaaja2Kone3 = LoadImage("Pelaaja2Kone3");
162    static Image pelaaja3Kone3 = LoadImage("Pelaaja3Kone3");
163    static Image pelaaja4Kone3 = LoadImage("Pelaaja4Kone3");
164
165    static Image[] pelaaja1Koneet = { pelaaja1Kone1, pelaaja1Kone2, pelaaja1Kone3 };
166    static Image[] pelaaja2Koneet = { pelaaja2Kone1, pelaaja2Kone2, pelaaja2Kone3 };
167    static Image[] pelaaja3Koneet = { pelaaja3Kone1, pelaaja3Kone2, pelaaja3Kone3 };
168    static Image[] pelaaja4Koneet = { pelaaja4Kone1, pelaaja4Kone2, pelaaja4Kone3 };
169
170    static Image[] pelaaja1Tykit = { pelaaja1Kone1Tykki, pelaaja1Kone2Tykki, pelaaja1Kone3Tykki };
171    static Image[] pelaaja2Tykit = { pelaaja2Kone1Tykki, pelaaja2Kone2Tykki, pelaaja2Kone3Tykki };
172    static Image[] pelaaja3Tykit = { pelaaja3Kone1Tykki, pelaaja3Kone2Tykki, pelaaja3Kone3Tykki };
173    static Image[] pelaaja4Tykit = { pelaaja4Kone1Tykki, pelaaja4Kone2Tykki, pelaaja4Kone3Tykki };
174
175    Image[][] pelaajienKoneet = { pelaaja1Koneet, pelaaja2Koneet, pelaaja3Koneet, pelaaja4Koneet };
176    Image[][] pelaajienTykit = { pelaaja1Tykit, pelaaja2Tykit, pelaaja3Tykit, pelaaja4Tykit };
177
178    static Image perusAmmus1 = LoadImage("Kone1PerusAmmus");
179    static Image perusAmmus2 = LoadImage("Kone2PerusAmmus");
180    static Image perusAmmus3 = LoadImage("Kone3PerusAmmus");
181
182    Image[] perusAmmus = { perusAmmus1, perusAmmus2, perusAmmus3 };
183
184    Image hakeutuvaRakettikuva = LoadImage("HakeutuvaRaketti");
185    Image paineAaltoKuva = LoadImage("PaineAalto");
186    Image rakettiKuva = LoadImage("Raketti");
187    Image palloKuva = LoadImage("KimpoilevaPallo");
188    Image telaJaljetKuva = LoadImage("RenkaidenJäljet");
189    Image rajahdysKuva = LoadImage("Rajahdys");
190    Image laser1Kuva = LoadImage("LaserAnimaatio1");
191    Image laser2Kuva = LoadImage("LaserAnimaatio2");
192    Image laser3Kuva = LoadImage("LaserAnimaatio3");
193    Image laser4Kuva = LoadImage("LaserAnimaatio4");
194    Image suojaKilpi = LoadImage("Suojakilpi");
195    Image suojaKilpiTykki = LoadImage("TykkiSuojakilpi");
196    Image haulikkoAmmus = LoadImage("haulikkoAmmus");
197    public Image liekkiKuva = LoadImage("Liekki");
198    SoundEffect ammusAani = LoadSoundEffect("AmmusÄäni");
199    SoundEffect raketinAani = LoadSoundEffect("RakettiAani");
200    SoundEffect palloAani = LoadSoundEffect("PalloAani");
201    SoundEffect boostiAani = LoadSoundEffect("BoostiAani");
202    Pelaaja pelaaja1;
203    MultiSelectWindow alkuValikko;
204    int pelaajienMaara = 2;
205    double maxNopeus = 1000.0;
206
207    List<Pelaaja> pelaajat = new List<Pelaaja>();
208
209    public override void Begin()
210    {
211        Alkuvalikko();
212        //LuoKentta();
213        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
214        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
215
216    }
217
218    void Alkuvalikko()
219    {
220        alkuValikko = new MultiSelectWindow("Pelin alkuvalikko",
221        "Pelaa", "Lopeta");
222        Add(alkuValikko);
223        alkuValikko.AddItemHandler(0, PelaajaMaara);
224        alkuValikko.AddItemHandler(1, Exit);
225
226
227    }
228
229    void PelaajaMaara()
230    {
231        alkuValikko.Destroy();
232        alkuValikko = new MultiSelectWindow("Pelaajien määrä", "2 Pelaajaa", "3 Pelaajaa", "4 Pelaajaa");
233        Add(alkuValikko);
234        alkuValikko.AddItemHandler(0, LuoKentta);
235        alkuValikko.AddItemHandler(1, delegate { pelaajienMaara = 3; LuoKentta(); });
236        alkuValikko.AddItemHandler(2, delegate { pelaajienMaara = 4; LuoKentta(); });
237    }
238
239    void LuoKentta()
240    {
241
242        alkuValikko.Destroy();
243        string Kenttä = RandomGen.SelectOne<string>("Kenttä1", "Kenttä2", "Kenttä3", "Kenttä4", "Kenttä5");
244        ColorTileMap ruudut = ColorTileMap.FromLevelAsset(Kenttä);
245
246
247        ruudut.SetTileMethod(Color.FromHexCode("0026FF"), LuoPelaaja1);
248        ruudut.SetTileMethod(Color.Cyan, LuoPelaaja2);
249        if (pelaajienMaara >= 3)
250        {
251            ruudut.SetTileMethod(Color.BrightGreen, LuoPelaaja3);
252        }
253        if (pelaajienMaara == 4)
254        {
255            ruudut.SetTileMethod(Color.Rose, LuoPelaaja4);
256        }
257        ruudut.SetTileMethod(Color.Black, LuoPalikka);
258        Level.Background.Color = Color.Silver;
259
260        ruudut.Execute(80, 80);
261        Wind = new Vector(RandomGen.NextDouble(-50, 50), RandomGen.NextDouble(-50, 50));
262        Camera.ZoomToLevel();
263    }
264
265    Pelaaja LuoPelaaja(Vector paikka, double leveys, double korkeus, int pelaajanr)
266    {
267        int valinta = RandomGen.NextInt(pelaaja1Koneet.Length);
268
269        Pelaaja pelaaja = new Pelaaja(leveys * 0.8, korkeus * 0.8, pelaajienKoneet[pelaajanr - 1][valinta], pelaajienTykit[pelaajanr - 1][valinta], rajahdysKuva, liekkiKuva);
270        pelaaja.AngularDamping = 0.95;
271        pelaaja.Position = paikka;
272
273        GamePad[] kontrollerit = { ControllerOne, ControllerTwo, ControllerThree, ControllerFour };
274
275        kontrollerit[pelaajanr - 1].ListenAnalog(AnalogControl.LeftStick, 0.0, KaannaPelaajaa, "", pelaaja);
276        kontrollerit[pelaajanr - 1].ListenAnalog(AnalogControl.RightStick, 0.0, KaannaTykkia, "", pelaaja);
277        kontrollerit[pelaajanr - 1].Listen(Button.RightTrigger, ButtonState.Down, Ammu, "", pelaaja, "perus", valinta);
278        kontrollerit[pelaajanr - 1].Listen(Button.LeftTrigger, ButtonState.Pressed, Ammu, "", pelaaja, "raketti", valinta);
279        kontrollerit[pelaajanr - 1].Listen(Button.RightShoulder, ButtonState.Pressed, Ammu, "", pelaaja, "pallo", valinta); 
280        kontrollerit[pelaajanr - 1].Listen(Button.LeftShoulder, ButtonState.Pressed, Boosti, "", pelaaja, valinta);
281
282        return pelaaja;
283    }
284
285    void LuoPelaaja1(Vector paikka, double leveys, double korkeus)
286    {
287        pelaaja1 = LuoPelaaja(paikka, leveys, korkeus, 1);
288
289
290        Add(pelaaja1);
291        pelaajat.Add(pelaaja1);
292    }
293
294    void LuoPalikka(Vector paikka, double leveys, double korkeus)
295    {
296        PhysicsObject palikka = PhysicsObject.CreateStaticObject(leveys, korkeus);
297        palikka.Shape = Shape.Rectangle;
298        palikka.Position = paikka;
299        palikka.Image = palikkaKuva;
300        Add(palikka);
301    }
302
303
304    void LuoPelaaja2(Vector paikka, double leveys, double korkeus)
305    {
306
307        Pelaaja pelaaja2 = LuoPelaaja(paikka, leveys, korkeus, 2);
308
309
310        Add(pelaaja2);
311        pelaajat.Add(pelaaja2);
312    }
313
314    void LuoPelaaja3(Vector paikka, double leveys, double korkeus)
315    {
316
317        Pelaaja pelaaja3 = LuoPelaaja(paikka, leveys, korkeus, 3);
318
319
320        Add(pelaaja3);
321        pelaajat.Add(pelaaja3);
322    }
323
324    void LuoPelaaja4(Vector paikka, double leveys, double korkeus)
325    {
326
327        Pelaaja pelaaja4 = LuoPelaaja(paikka, leveys, korkeus, 4);
328
329
330        Add(pelaaja4);
331        pelaajat.Add(pelaaja4);
332    }
333
334    void LuoElamaLaskuri(Pelaaja pelaaja)
335    {
336        ProgressBar elamaPalkki = new ProgressBar(150, 20);
337        elamaPalkki.BindTo(pelaaja.healthit);
338
339        Timer ajastin = new Timer();
340        ajastin.Interval = 0.01;
341        ajastin.Timeout += delegate
342        {
343            elamaPalkki.AbsolutePosition = pelaaja.Position;
344        };
345
346        ajastin.Start();
347    }
348
349    void KaannaPelaajaa(AnalogState tatinTila, Pelaaja pelaaja)
350    {
351        Angle vanhaKulma = pelaaja.Angle;
352        pelaaja.Angle = tatinTila.StateVector.Angle;
353
354        Angle kulmanMuutos = pelaaja.Angle - vanhaKulma;
355
356        if (pelaaja.telaJaljetLimit && pelaaja.IsVisible)
357        {
358            pelaaja.telaJaljetLimit = false;
359
360            GameObject telaJaljet = new GameObject(telaJaljetKuva);
361            telaJaljet.Angle = pelaaja.Angle;
362            telaJaljet.Position = pelaaja.Position;
363            Add(telaJaljet, -1);
364
365            Timer.SingleShot(0.05, delegate { pelaaja.telaJaljetLimit = true; });
366
367            Timer.SingleShot(RandomGen.NextDouble(2.0, 20.0), delegate { telaJaljet.Destroy(); });
368        }
369
370        pelaaja.Push(tatinTila.StateVector * maxNopeus);
371
372    }
373
374    void KaannaTykkia(AnalogState tatinTila, Pelaaja pelaaja)
375    {
376        pelaaja.Ase.AbsoluteAngle = tatinTila.StateVector.Angle;
377    }
378
379    void Ammu(Pelaaja pelaaja, String ammusTyyppi, int konenr)
380    {
381
382        PhysicsObject ammus = pelaaja.Ase.Shoot();
383        if (ammus != null)
384        {
385            switch (ammusTyyppi)
386            {
387                case "perus":
388                    ammusAani.Play();
389                    ammus.Image = perusAmmus[konenr];
390                    if (konenr == 2)
391                    {
392                        ammus.Height = 25;
393                    }
394                    ammus.Tag = "perusAmmus";
395                    AddCollisionHandler(ammus, delegate (PhysicsObject a, PhysicsObject b)
396                    {
397                        a.Destroy();
398                    });
399                    pelaaja.Ase.FireRate = 10;
400                    break;
401                case "raketti":
402                    raketinAani.Play();
403                    ammus.Image = rakettiKuva;
404                    ammus.Tag = "raketti";
405                    ammus.Size *= 2.5;
406                    AddCollisionHandler(ammus, delegate (PhysicsObject a, PhysicsObject b)
407                    {
408                        a.Destroy();
409                        Explosion rajahdys = new Explosion(140);
410                        rajahdys.Position = a.Position;
411                        rajahdys.ShockwaveReachesObject += RajahdysOsuu;
412                        Add(rajahdys);
413                        raketinAani.Stop();
414                    });
415                    pelaaja.Ase.FireRate = 0.45;
416
417                    if (konenr == 1)
418                    {
419                        Pelaaja[] kohdePelaajat = new Pelaaja[pelaajat.Count - 1];
420                        for (int i = 0, j = 0; i < pelaajat.Count; i++)
421                        {
422                            if (pelaajat[i] != pelaaja)
423                            {
424                                kohdePelaajat[j] = pelaajat[i];
425                                j++;
426                            }
427                        }
428
429                        ammus.Image = hakeutuvaRakettikuva;
430
431
432                        FollowerBrain seuraajanAivot = new FollowerBrain(kohdePelaajat);
433                        seuraajanAivot.TurnSpeed = UnlimitedAngle.FromDegrees(45);
434                        //seuraajanAivot.TurnWhileMoving = true;
435                        seuraajanAivot.Speed = 600;
436                        ammus.Brain = seuraajanAivot;
437
438                        Timer ajastin = new Timer();
439                        ajastin.Interval = 0.1;
440                        ajastin.Timeout += delegate
441                        {
442                            ammus.AbsoluteAngle = ammus.Velocity.Angle;
443                            if (ammus.IsDestroyed)
444                            {
445                                ajastin.Stop();
446                            }
447                        };
448                        ajastin.Start();
449                    }
450                    break;
451                case "pallo":
452                    if (konenr == 0)
453                    {
454                        palloAani.Play();
455                        ammus.Image = palloKuva;
456                        ammus.Tag = "pallo";
457                        ammus.Size *= 5;
458                        ammus.MaximumLifetime = new TimeSpan(0, 0, 4);
459                        pelaaja.Ase.FireRate = 0.5;
460                    }
461                    // Tähän tulee laser, ei pallo
462                    else if (konenr == 2)
463                    {
464                        ammus.Image = laser1Kuva;
465                        ammus.Tag = "laser";
466                        ammus.Size = new Vector(3000, 10);
467                        ammus.Position += ammus.Angle.Cos * new Vector(1490, 0) + ammus.Angle.Sin * new Vector(0, 1490);
468                        ammus.Velocity = new Vector(0, 0);
469                        Timer.SingleShot(1.5, delegate 
470                        {
471                            Animation ammusAnim = new Animation(new Image[]{ laser2Kuva, laser3Kuva, laser4Kuva });
472                            ammus.Animation = ammusAnim;
473                            ammus.Size = new Vector(3000, 40);
474                            ammus.Animation.Start();
475                        });
476                        Timer.SingleShot(4.0, delegate
477                        {
478                            ammus.Destroy();
479                        });
480                        ammus.IgnoresCollisionResponse = true;
481                    }
482                    else
483                    {
484                        ammus.Destroy();
485                        Explosion poks = new Explosion(200);
486                        poks.Position = pelaaja.Position;
487                        poks.Animation = null;
488                        poks.Speed = 1000;
489                        poks.Image = paineAaltoKuva;
490                        poks.AddShockwaveHandler("raketti", delegate (IPhysicsObject a, Vector v)
491                        {
492                            a.Brain.Active = false;
493                        });
494                        pelaaja.IgnoresExplosions = true;
495                        Add(poks);
496                        Timer ajastin = new Timer();
497                        Timer.SingleShot(0.5, delegate { pelaaja.IgnoresExplosions = false; });
498                        pelaaja.Ase.FireRate = 0.5;
499                        ajastin.Start();
500
501                    }
502                    break;
503                default:
504                    break;
505            }
506
507            ammus.Position += pelaaja.Ase.Angle.GetVector() * 70;
508
509
510        }
511
512    }
513
514    void RajahdysOsuu(IPhysicsObject olio, Vector suunta)
515    {
516        if (olio.Tag.Equals("pelaaja"))
517        {
518            ((Pelaaja)olio).healthit.Value -= 4;
519            ((Pelaaja)olio).SavuLiekki();
520        }
521    }
522
523    void Boosti(Pelaaja pelaaja, int konenr)
524    {
525        if (pelaaja.boosti)
526        {
527            int nopeus = 1000;
528
529            if (konenr == 1)
530            {
531                nopeus = 750;
532
533                pelaaja.IsVisible = false;
534                pelaaja.Ase.IsVisible = false;
535
536                Timer.SingleShot(0.75, delegate
537                {
538                    pelaaja.IsVisible = true;
539                    pelaaja.Ase.IsVisible = true;
540                });
541            }
542
543            pelaaja.boosti = false;
544            pelaaja.Hit(pelaaja.Angle.GetVector() * nopeus);
545            boostiAani.Play();
546            Timer.SingleShot(2.5, delegate
547            {
548                pelaaja.boosti = true;
549            });
550        }
551
552    }
553}
Note: See TracBrowser for help on using the repository browser.