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

Revision 7070, 15.7 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;
51            SavuLiekki();
52        });
53        ((IMBT)Game.Instance).AddCollisionHandler(this, "raketti", delegate (PhysicsObject a, PhysicsObject b)
54        {
55            this.healthit.Value -= 16;
56            SavuLiekki();
57        });
58        ((IMBT)Game.Instance).AddCollisionHandler(this, "pallo", delegate (PhysicsObject a, PhysicsObject b)
59        {
60            this.healthit.Value -= 14;
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
69        this.Ase = new AssaultRifle(30, 30);
70        this.Ase.Image = tykkiTorninKuva;
71
72        Game.Instance.Add(Ase, 1);
73
74        Timer ajastin = new Timer();
75        ajastin.Interval = 0.01;
76        ajastin.Timeout += delegate
77        {
78            Ase.Position = this.Position;
79        };
80        ajastin.Start();
81
82
83    }
84
85    public void SavuLiekki()
86    {
87        if (this.healthit.Value < this.healthit.MaxValue / 2)
88        {
89            if (this.savuttaa == false)
90            {
91                Smoke savu = new Smoke();
92                Game.Instance.Add(savu);
93                savu.Position = this.Position;
94                Timer seuraajaAjastin = new Timer();
95                seuraajaAjastin.Interval = 0.1;
96                seuraajaAjastin.Timeout += delegate
97                {
98                    savu.Position = this.Position;
99                };
100                seuraajaAjastin.Start();
101                this.savuttaa = true;
102            }
103        }
104
105        if (this.healthit.Value < this.healthit.MaxValue / 4)
106        {
107
108            Flame liekki = new Flame(((IMBT)Game.Instance).liekkiKuva);
109            liekki.MinScale = 25.0;
110            liekki.MaxScale = 50.0;
111            liekki.ScaleAmount = 0.8;
112            Game.Instance.Add(liekki);
113            liekki.Position = this.Position;
114            Timer seuraajaAjastin = new Timer();
115            seuraajaAjastin.Interval = 0.1;
116            seuraajaAjastin.Timeout += delegate
117            {
118                liekki.Position = this.Position;
119            };
120            seuraajaAjastin.Start();
121            this.savuttaa = true;
122
123        }
124
125    }
126
127
128
129
130}
131public class IMBT : PhysicsGame
132{
133
134    static Image pelaaja1Kone1 = LoadImage("Pelaaja1Kone1");
135    static Image pelaaja2Kone1 = LoadImage("Pelaaja2Kone1");
136    static Image pelaaja3Kone1 = LoadImage("Pelaaja3Kone1");
137    static Image pelaaja4Kone1 = LoadImage("Pelaaja4Kone1");
138    static Image pelaaja1Kone2 = LoadImage("Pelaaja1Kone2");
139    static Image pelaaja2Kone2 = LoadImage("Pelaaja2Kone2");
140    static Image pelaaja3Kone2 = LoadImage("Pelaaja3Kone2");
141    static Image pelaaja4Kone2 = LoadImage("Pelaaja4Kone2");
142    static Image palikkaKuva = LoadImage("Palikka");
143    static Image pelaaja4Kone1Tykki = LoadImage("Pelaaja4Kone1Tykki");
144    static Image pelaaja3Kone1Tykki = LoadImage("Pelaaja3Kone1Tykki");
145    static Image pelaaja2Kone1Tykki = LoadImage("Pelaaja2Kone1Tykki");
146    static Image pelaaja1Kone1Tykki = LoadImage("Pelaaja1Kone1Tykki");
147    static Image pelaaja1Kone2Tykki = LoadImage("Pelaaja1Kone2Tykki");
148    static Image pelaaja2Kone2Tykki = LoadImage("Pelaaja2Kone2Tykki");
149    static Image pelaaja3Kone2Tykki = LoadImage("Pelaaja3Kone2Tykki");
150    static Image pelaaja4Kone2Tykki = LoadImage("Pelaaja4Kone2Tykki");
151
152    static Image[] pelaaja1Koneet = { pelaaja1Kone1, pelaaja1Kone2 };
153    static Image[] pelaaja2Koneet = { pelaaja2Kone1, pelaaja2Kone2 };
154    static Image[] pelaaja3Koneet = { pelaaja3Kone1, pelaaja3Kone2 };
155    static Image[] pelaaja4Koneet = { pelaaja4Kone1, pelaaja4Kone2 };
156
157    static Image[] pelaaja1Tykit = { pelaaja1Kone1Tykki, pelaaja1Kone2Tykki };
158    static Image[] pelaaja2Tykit = { pelaaja2Kone1Tykki, pelaaja2Kone2Tykki };
159    static Image[] pelaaja3Tykit = { pelaaja3Kone1Tykki, pelaaja3Kone2Tykki };
160    static Image[] pelaaja4Tykit = { pelaaja4Kone1Tykki, pelaaja4Kone2Tykki };
161
162    Image[][] pelaajienKoneet = { pelaaja1Koneet, pelaaja2Koneet, pelaaja3Koneet, pelaaja4Koneet };
163    Image[][] pelaajienTykit = { pelaaja1Tykit, pelaaja2Tykit, pelaaja3Tykit, pelaaja4Tykit };
164
165    static Image perusAmmus1 = LoadImage("Kone1PerusAmmus");
166    static Image perusAmmus2 = LoadImage("Kone2PerusAmmus");
167
168    Image[] perusAmmus = { perusAmmus1, perusAmmus2 };
169
170    Image hakeutuvaRakettikuva = LoadImage("HakeutuvaRaketti");
171    Image paineAaltoKuva = LoadImage("PaineAalto");
172    Image rakettiKuva = LoadImage("Raketti");
173    Image palloKuva = LoadImage("KimpoilevaPallo");
174    Image telaJaljetKuva = LoadImage("RenkaidenJäljet");
175    Image rajahdysKuva = LoadImage("Rajahdys");
176    public Image liekkiKuva = LoadImage("Liekki");
177    SoundEffect ammusAani = LoadSoundEffect("AmmusÄäni");
178    SoundEffect raketinAani = LoadSoundEffect("RakettiAani");
179    SoundEffect palloAani = LoadSoundEffect("PalloAani");
180    SoundEffect boostiAani = LoadSoundEffect("BoostiAani");
181    Pelaaja pelaaja1;
182    MultiSelectWindow alkuValikko;
183    int pelaajienMaara = 2;
184    double maxNopeus = 1000.0;
185
186
187
188    public override void Begin()
189    {
190        Alkuvalikko();
191        //LuoKentta();
192        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
193        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
194
195    }
196
197    void Alkuvalikko()
198    {
199        alkuValikko = new MultiSelectWindow("Pelin alkuvalikko",
200        "Pelaa", "Lopeta");
201        Add(alkuValikko);
202        alkuValikko.AddItemHandler(0, PelaajaMaara);
203        alkuValikko.AddItemHandler(1, Exit);
204
205
206    }
207
208    void PelaajaMaara()
209    {
210        alkuValikko.Destroy();
211        alkuValikko = new MultiSelectWindow("Pelaajien määrä", "2 Pelaajaa", "3 Pelaajaa", "4 Pelaajaa");
212        Add(alkuValikko);
213        alkuValikko.AddItemHandler(0, LuoKentta);
214        alkuValikko.AddItemHandler(1, delegate { pelaajienMaara = 3; LuoKentta(); });
215        alkuValikko.AddItemHandler(2, delegate { pelaajienMaara = 4; LuoKentta(); });
216    }
217
218    void LuoKentta()
219    {
220
221        alkuValikko.Destroy();
222        string Kenttä = RandomGen.SelectOne<string>("Kenttä1", "Kenttä2", "Kenttä3", "Kenttä4", "Kenttä5");
223        ColorTileMap ruudut = ColorTileMap.FromLevelAsset(Kenttä);
224
225
226        ruudut.SetTileMethod(Color.FromHexCode("0026FF"), LuoPelaaja1);
227        ruudut.SetTileMethod(Color.Cyan, LuoPelaaja2);
228        if (pelaajienMaara >= 3)
229        {
230            ruudut.SetTileMethod(Color.BrightGreen, LuoPelaaja3);
231        }
232        if (pelaajienMaara == 4)
233        {
234            ruudut.SetTileMethod(Color.Rose, LuoPelaaja4);
235        }
236        ruudut.SetTileMethod(Color.Black, LuoPalikka);
237        Level.Background.Color = Color.Silver;
238
239        ruudut.Execute(80, 80);
240        Wind = new Vector(RandomGen.NextDouble(-50, 50), RandomGen.NextDouble(-50, 50));
241        Camera.ZoomToLevel();
242    }
243
244    Pelaaja LuoPelaaja(Vector paikka, double leveys, double korkeus, int pelaajanr)
245    {
246        int valinta = RandomGen.NextInt(pelaaja1Koneet.Length);
247
248        Pelaaja pelaaja = new Pelaaja(leveys * 0.8, korkeus * 0.8, pelaajienKoneet[pelaajanr - 1][valinta], pelaajienTykit[pelaajanr - 1][valinta], rajahdysKuva, liekkiKuva);
249        pelaaja.AngularDamping = 0.95;
250        pelaaja.Position = paikka;
251
252        GamePad[] kontrollerit = { ControllerOne, ControllerTwo, ControllerThree, ControllerFour };
253
254        kontrollerit[pelaajanr - 1].ListenAnalog(AnalogControl.LeftStick, 0.0, KaannaPelaajaa, "", pelaaja);
255        kontrollerit[pelaajanr - 1].ListenAnalog(AnalogControl.RightStick, 0.0, KaannaTykkia, "", pelaaja);
256        kontrollerit[pelaajanr - 1].Listen(Button.RightTrigger, ButtonState.Down, Ammu, "", pelaaja, "perus", valinta);
257        kontrollerit[pelaajanr - 1].Listen(Button.LeftTrigger, ButtonState.Pressed, Ammu, "", pelaaja, "raketti", valinta);
258        kontrollerit[pelaajanr - 1].Listen(Button.RightShoulder, ButtonState.Pressed, Ammu, "", pelaaja, "pallo", valinta);
259        kontrollerit[pelaajanr - 1].Listen(Button.LeftShoulder, ButtonState.Pressed, Boosti, "", pelaaja);
260
261        return pelaaja;
262    }
263
264    void LuoPelaaja1(Vector paikka, double leveys, double korkeus)
265    {
266        pelaaja1 = LuoPelaaja(paikka, leveys, korkeus, 1);
267
268
269        Add(pelaaja1);
270    }
271
272    void LuoPalikka(Vector paikka, double leveys, double korkeus)
273    {
274        PhysicsObject palikka = PhysicsObject.CreateStaticObject(leveys, korkeus);
275        palikka.Shape = Shape.Rectangle;
276        palikka.Position = paikka;
277        palikka.Image = palikkaKuva;
278        Add(palikka);
279    }
280
281
282    void LuoPelaaja2(Vector paikka, double leveys, double korkeus)
283    {
284
285        Pelaaja pelaaja2 = LuoPelaaja(paikka, leveys, korkeus, 2);
286
287
288        Add(pelaaja2);
289    }
290
291    void LuoPelaaja3(Vector paikka, double leveys, double korkeus)
292    {
293
294        Pelaaja pelaaja3 = LuoPelaaja(paikka, leveys, korkeus, 3);
295
296
297        Add(pelaaja3);
298    }
299
300    void LuoPelaaja4(Vector paikka, double leveys, double korkeus)
301    {
302
303        Pelaaja pelaaja4 = LuoPelaaja(paikka, leveys, korkeus, 4);
304
305
306        Add(pelaaja4);
307    }
308
309    void LuoElamaLaskuri(Pelaaja pelaaja)
310    {
311        ProgressBar elamaPalkki = new ProgressBar(150, 20);
312        elamaPalkki.BindTo(pelaaja.healthit);
313
314        Timer ajastin = new Timer();
315        ajastin.Interval = 0.01;
316        ajastin.Timeout += delegate
317        {
318            elamaPalkki.AbsolutePosition = pelaaja.Position;
319        };
320
321        ajastin.Start();
322    }
323
324    void KaannaPelaajaa(AnalogState tatinTila, Pelaaja pelaaja)
325    {
326        Angle vanhaKulma = pelaaja.Angle;
327        pelaaja.Angle = tatinTila.StateVector.Angle;
328
329        Angle kulmanMuutos = pelaaja.Angle - vanhaKulma;
330
331        if (pelaaja.telaJaljetLimit)
332        {
333            pelaaja.telaJaljetLimit = false;
334
335            GameObject telaJaljet = new GameObject(telaJaljetKuva);
336            telaJaljet.Angle = pelaaja.Angle;
337            telaJaljet.Position = pelaaja.Position;
338            Add(telaJaljet, -1);
339
340            Timer.SingleShot(0.05, delegate { pelaaja.telaJaljetLimit = true; });
341
342            Timer.SingleShot(RandomGen.NextDouble(2.0, 20.0), delegate { telaJaljet.Destroy(); });
343        }
344
345        pelaaja.Push(tatinTila.StateVector * maxNopeus);
346
347    }
348
349    void KaannaTykkia(AnalogState tatinTila, Pelaaja pelaaja)
350    {
351        pelaaja.Ase.AbsoluteAngle = tatinTila.StateVector.Angle;
352    }
353
354    void Ammu(Pelaaja pelaaja, String ammusTyyppi, int konenr)
355    {
356
357        PhysicsObject ammus = pelaaja.Ase.Shoot();
358        if (ammus != null)
359        {
360            switch (ammusTyyppi)
361            {
362                case "perus":
363                    ammusAani.Play();
364                    ammus.Image = perusAmmus[konenr];
365                    ammus.Tag = "perusAmmus";
366                    AddCollisionHandler(ammus, delegate (PhysicsObject a, PhysicsObject b)
367                    {
368                        a.Destroy();
369                    });
370                    pelaaja.Ase.FireRate = 10;
371                    break;
372                case "raketti":
373                    raketinAani.Play();
374                    ammus.Image = rakettiKuva;
375                    ammus.Tag = "raketti";
376                    ammus.Size *= 2.5;
377                    AddCollisionHandler(ammus, delegate (PhysicsObject a, PhysicsObject b)
378                    {
379                        a.Destroy();
380                        Explosion rajahdys = new Explosion(140);
381                        rajahdys.Position = a.Position;
382                        rajahdys.ShockwaveReachesObject += RajahdysOsuu;
383                        Add(rajahdys);
384                        raketinAani.Stop();
385                    });
386                    pelaaja.Ase.FireRate = 1;
387
388                    if (konenr== 1)
389                    {
390                        ammus.Image = hakeutuvaRakettikuva;
391                        FollowerBrain seuraajanAivot = new FollowerBrain("pelaaja");
392                        seuraajanAivot.TurnSpeed = UnlimitedAngle.FromDegrees(45);
393                        seuraajanAivot.TurnWhileMoving = true;
394                        ammus.Brain = seuraajanAivot;
395                    }
396                    break;
397                case "pallo":
398                    if (konenr == 0)
399                    {
400                        palloAani.Play();
401                        ammus.Image = palloKuva;
402                        ammus.Tag = "pallo";
403                        ammus.Size *= 5;
404                        ammus.MaximumLifetime = new TimeSpan(0, 0, 4);
405                        pelaaja.Ase.FireRate = 0.5;
406                    }
407                    else
408                    {
409                        ammus.Destroy();
410                        Explosion poks = new Explosion(200);
411                        poks.Position = pelaaja.Position;
412                        poks.Animation = null;
413                        poks.Speed = 1000;
414                        poks.Image = paineAaltoKuva;
415                        pelaaja.IgnoresExplosions = true;
416                        Add(poks);
417                        Timer ajastin = new Timer();
418                        Timer.SingleShot(0.5, delegate { pelaaja.IgnoresExplosions = false; });
419                        pelaaja.Ase.FireRate = 0.5;
420                        ajastin.Start();
421
422                    }
423                    break;
424                default:
425                    break;
426            }
427
428            ammus.Position += pelaaja.Ase.Angle.GetVector() * 70;
429
430
431        }
432
433    }
434
435    void RajahdysOsuu(IPhysicsObject olio, Vector suunta)
436    {
437        if (olio.Tag.Equals("pelaaja"))
438        {
439            ((Pelaaja)olio).healthit.Value -= 4;
440            ((Pelaaja)olio).SavuLiekki();
441        }
442    }
443
444    void Boosti(Pelaaja pelaaja)
445    {
446        if (pelaaja.boosti)
447        {
448            pelaaja.boosti = false;
449            pelaaja.Hit(pelaaja.Angle.GetVector() * 1000);
450            boostiAani.Play();
451            Timer.SingleShot(2.5, delegate
452            {
453                pelaaja.boosti = true;
454            });
455        }
456
457    }
458}
Note: See TracBrowser for help on using the repository browser.