source: 2017/koodauskerho/aldo/StreetAlien/StreetAlien/StreetAlien/StreetAlien.cs @ 9494

Revision 9494, 19.3 KB checked in by mianhayr, 3 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 StreetAlien : PhysicsGame
10{
11    const double nopeus = 494;
12    const double hyppyNopeus = 750;
13    const int RUUDUN_KOKO = 40;
14
15    PlatformCharacter pelaaja1;
16    PlatformCharacter pelaaja2;
17
18    GameObject tahtain;
19    Image aseenkuva = LoadImage("alkuase");
20    Image pelaajanKuva = LoadImage("pelityyppiparas");
21    Image tahtiKuva = LoadImage("tahti");
22    Image pelaaja2Kuva = LoadImage("pelihahmo2");
23    Image pompKuva = LoadImage("pomp");
24    Image asevihukuva = LoadImage("terrorist");
25    Image tähtäinkuva = LoadImage("tähtäin");
26    Image vauvaBoss = LoadImage("bosspoop");
27    Image vihreaBossKuva = LoadImage("outohirvio");
28    Image Ythomas = LoadImage("Ythomas");
29    Image knightkuva = LoadImage("knight");
30    Image ketjukuva = LoadImage("ketju");
31    Image ase2kuva = LoadImage("ase2");
32
33    SoundEffect maaliAani = LoadSoundEffect("maali");
34
35
36
37    class Asevihu : PlatformCharacter
38    {
39        private IntMeter elamaLaskuri = new IntMeter(5, 0, 5);
40        public IntMeter ElamaLaskuri { get { return elamaLaskuri; } }
41
42        public Asevihu(double leveys, double korkeus)
43            : base(leveys, korkeus)
44        {
45            elamaLaskuri.LowerLimit += delegate { this.Destroy(); };
46        }
47
48    }
49
50    int kenttaNumero = 4;
51
52
53
54    public override void Begin()
55    {
56        //Window.Fullscreen = true;
57
58        ClearAll();
59        SmoothTextures = false;
60
61        PhysicsObject kissa = new PhysicsObject(40, 20);
62        kissa.Shape = Shape.Rectangle;
63        kissa.Mass = 1000000.10000000;
64
65        Add(kissa);
66
67        tahtain = new GameObject(40, 40);
68        tahtain.Image = tähtäinkuva;
69        Add(tahtain, 3);
70
71
72        Gravity = new Vector(0, -1000);
73
74        LuoKentta();
75        LisaaNappaimet();
76        LuoPistelaskuri();
77
78        Camera.Follow(pelaaja1);
79        Camera.ZoomFactor = 2.0;
80        Camera.StayInLevel = true;
81    }
82
83
84
85    IntMeter pisteLaskuri;
86
87    void LuoPistelaskuri()
88    {
89        pisteLaskuri = new IntMeter(0);
90
91        Label pisteNaytto = new Label();
92        pisteNaytto.X = Screen.Left + 100;
93        pisteNaytto.Y = Screen.Top - 100;
94        pisteNaytto.TextColor = Color.Black;
95        pisteNaytto.Color = Color.White;
96
97        pisteNaytto.BindTo(pisteLaskuri);
98        Add(pisteNaytto);
99    }
100
101
102    void LuoKentta()
103    {
104        //MediaPlayer.Play("");
105        TileMap kentta = TileMap.FromLevelAsset("kentta" + kenttaNumero);
106        kentta.SetTileMethod('#', LisaaTaso);
107        kentta.SetTileMethod('*', LisaaTahti);
108        kentta.SetTileMethod('N', lisaapelaaja1);
109        kentta.SetTileMethod('n', lisaapelaaja2);
110        kentta.SetTileMethod('p', LisaaOlio);
111        kentta.SetTileMethod('A', LisaaOlio2);
112        kentta.SetTileMethod('m', LisaaOlio3);
113        kentta.SetTileMethod('B', LisaaOlio4);
114        kentta.SetTileMethod('V', LisaaOlio5);
115        kentta.SetTileMethod('y', LisaaOlio6);
116        kentta.SetTileMethod('K', lisaaMaali);
117        kentta.SetTileMethod('I', lisaaketju);
118        kentta.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
119        Level.CreateBorders();
120
121        Level.Background.CreateGradient(Color.DarkRed, Color.LightBlue);
122    }
123
124    void LisaaTaso(Vector paikka, double leveys, double korkeus)
125    {
126        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
127        taso.Position = paikka;
128        taso.Color = Color.DarkBrown;
129        Add(taso);
130        taso.Image = LoadImage("metalli");
131    }
132    void lisaaMaali(Vector paikka, double leveys, double korkeus)
133    {
134        PhysicsObject maali = PhysicsObject.CreateStaticObject(leveys, korkeus);
135
136        maali.Tag = "maali";
137        maali.Position = paikka;
138        Add(maali);
139    }
140
141    void Lisaametallii(Vector paikka, double leveys, double korkeus)
142    {
143        PhysicsObject metalli = new PhysicsObject(leveys, korkeus);
144        metalli.Position = paikka;
145        metalli.Color = Color.Green;
146        metalli.Tag = "metalli";
147        Add(metalli);
148        metalli.MakeStatic();
149
150        metalli.Image = LoadImage("metalli");
151
152    }
153
154
155    void lisaaketju(Vector paikka, double leveys, double korkeus)
156    {
157        PhysicsObject ketju = PhysicsObject.CreateStaticObject(leveys * 0.3, korkeus);
158        ketju.IgnoresCollisionResponse = true;
159        ketju.Position = paikka;
160        ketju.Image = ketjukuva;
161        ketju.Tag = "ketju";
162        Add(ketju);
163    }
164    void LisaaTahti(Vector paikka, double leveys, double korkeus)
165    {
166        PhysicsObject tahti = PhysicsObject.CreateStaticObject(leveys, korkeus);
167        tahti.IgnoresCollisionResponse = true;
168        tahti.Position = paikka;
169        tahti.Image = tahtiKuva;
170        tahti.Tag = "tahti";
171        Add(tahti);
172    }
173    void LisaaOlio(Vector paikka, double leveys, double korkeus)
174    {
175        PlatformCharacter p = new PlatformCharacter(leveys * 0.9, korkeus * 0.9);
176        p.Position = paikka;
177        p.Image = pompKuva;
178        Add(p);
179        p.Tag = "p";
180
181        PlatformWandererBrain tasoAivot = new PlatformWandererBrain();
182        tasoAivot.Speed = 100;
183
184        tasoAivot.FallsOffPlatforms = true;
185        tasoAivot.TriesToJump = true;
186
187        p.Brain = tasoAivot;
188
189    }
190
191    void LisaaOlio2(Vector paikka, double leveys, double korkeus)
192    {
193        Asevihu asevihu = new Asevihu(leveys * 0.9, korkeus * 0.9);
194        asevihu.Position = paikka;
195        asevihu.Image = asevihukuva;
196        Add(asevihu);
197        asevihu.Tag = "A";
198
199        PlatformWandererBrain tasoAivot = new PlatformWandererBrain();
200        tasoAivot.Speed = 100;
201
202        tasoAivot.FallsOffPlatforms = true;
203        tasoAivot.TriesToJump = true;
204
205        asevihu.Brain = tasoAivot;
206
207        //AssaultRifle ase = new AssaultRifle(30, 10);
208        //ase.ProjectileCollision = VihuAmmusOsui;
209        //asevihu.Add(ase);
210        asevihu.Weapon = new AssaultRifle(30, 10);
211        asevihu.Weapon.ProjectileCollision = VihuAmmusOsui;
212
213        Timer aikaLaskuri = new Timer();
214        aikaLaskuri.Interval = 2;
215        aikaLaskuri.Timeout += () => AmmuAseella(asevihu);
216        aikaLaskuri.Start();
217       
218    }
219    void LisaaOlio3(Vector paikka, double leveys, double korkeus)
220    {
221        PlatformCharacter m = new PlatformCharacter(leveys * 0.9, korkeus * 0.9);
222        m.Position = paikka;
223        m.Image = knightkuva;
224        Add(m);
225        m.Tag = "m";
226
227        PlatformWandererBrain tasoAivot = new PlatformWandererBrain();
228        tasoAivot.Speed = 100;
229
230        tasoAivot.FallsOffPlatforms = true;
231        tasoAivot.TriesToJump = true;
232
233        m.Brain = tasoAivot;
234
235    }
236
237
238    void LisaaOlio4(Vector paikka, double leveys, double korkeus)
239    {
240        OutoHirvio B = new OutoHirvio(leveys * 1.0, korkeus * 1.0);
241        B.Position = paikka;
242        B.Image = vauvaBoss;
243        Add(B);
244        B.Tag = "B";
245
246
247        PlatformWandererBrain tasoAivot = new PlatformWandererBrain();
248        tasoAivot.Speed = 100;
249
250        tasoAivot.FallsOffPlatforms = true;
251        tasoAivot.TriesToJump = true;
252
253        B.Brain = tasoAivot;
254
255    }
256
257    void LisaaOlio6(Vector paikka, double leveys, double korkeus)
258    {
259        PlatformCharacter y = new PlatformCharacter(leveys * 1.0, korkeus * 1.0);
260        y.Position = paikka;
261        y.Image = Ythomas;
262        Add(y);
263        y.Tag = "y";
264
265        PlatformWandererBrain tasoAivot = new PlatformWandererBrain();
266        tasoAivot.Speed = 900;
267
268        tasoAivot.FallsOffPlatforms = true;
269        tasoAivot.TriesToJump = true;
270
271        y.Brain = tasoAivot;
272
273    }
274    void LisaaOlio5(Vector paikka, double leveys, double korkeus)
275    {
276        OutoHirvio m = new OutoHirvio(leveys * 2.9, korkeus * 2.9);
277        m.Position = paikka;
278        m.Image = vihreaBossKuva;
279        Add(m);
280        m.Tag = "m";
281
282        PlatformWandererBrain tasoAivot = new PlatformWandererBrain();
283        tasoAivot.Speed = 100;
284
285        tasoAivot.FallsOffPlatforms = true;
286        tasoAivot.TriesToJump = true;
287
288        m.Brain = tasoAivot;
289
290    }
291
292    void Tormaap(PhysicsObject pelaaja1, PhysicsObject p)
293    {
294        pelaaja1.Destroy();
295
296        Explosion rajahdys = new Explosion(50);
297        rajahdys.Position = p.Position;
298        Add(rajahdys);
299    }
300
301    PlatformCharacter LuoPelaaja(Vector paikka, double leveys, double korkeus)
302    {
303        PlatformCharacter pelaaja = new PlatformCharacter(leveys * 0.8, korkeus * 1.0);
304        pelaaja.Position = paikka;
305        pelaaja.Mass = 3.0;
306        pelaaja.Tag = "pelaaja";
307        pelaaja.Image = pelaajanKuva;
308     
309        AddCollisionHandler(pelaaja, "tahti", TormaaTahteen);
310        AddCollisionHandler(pelaaja, "p", CollisionHandler.ExplodeBoth(999, true));
311        AddCollisionHandler(pelaaja, "B", CollisionHandler.ExplodeBoth(999, true));
312        AddCollisionHandler(pelaaja, "maali", paasiMaalin);
313        AddCollisionHandler(pelaaja, "m", Tormaap);
314        AddCollisionHandler(pelaaja, "y", Rajayta);
315
316        Add(pelaaja);
317
318
319
320        pelaaja.Destroyed += pelinlopussa;
321
322        pelaaja.Weapon = new AssaultRifle(30, 10);
323        pelaaja.Weapon.ProjectileCollision = AmmusOsui;
324        pelaaja.Weapon.InfiniteAmmo = true;
325        pelaaja.Weapon.Power.DefaultValue = 400;
326        pelaaja.Weapon.AmmoIgnoresGravity = true;
327        pelaaja.Weapon.AmmoIgnoresExplosions = true;
328        pelaaja.Weapon.CanHitOwner = false;
329        pelaaja.Weapon.Image = aseenkuva;
330        pelaaja.Weapon.Y = 5;
331
332       
333        pelaaja.Weapon.FireRate = 4;
334
335<<<<<<< .mine
336=======
337     
338
339>>>>>>> .r9492
340        return pelaaja;
341
342    }
343
344    void paasiMaalin(PhysicsObject pelaaja, PhysicsObject maali)
345    {
346        kenttaNumero++;
347
348        ClearAll();
349        Begin();
350
351
352    }
353    void lisaapelaaja1(Vector paikka, double leveys, double korkeus)
354    {
355        pelaaja1 = LuoPelaaja(paikka, leveys, korkeus);
356    }
357
358    void lisaapelaaja2(Vector paikka, double leveys, double korkeus)
359    {
360        pelaaja2 = LuoPelaaja(paikka, leveys, korkeus);
361        pelaaja2.Image = pelaaja2Kuva;
362        pelaaja2.Weapon = new AssaultRifle(40, 15);
363        pelaaja2.Weapon.ProjectileCollision = AmmusOsui;
364        pelaaja2.Weapon.InfiniteAmmo = true;
365        pelaaja2.Weapon.Power.DefaultValue = 400;
366        pelaaja2.Weapon.AmmoIgnoresGravity = true;
367        pelaaja2.Weapon.AmmoIgnoresExplosions = true;
368        pelaaja2.Weapon.CanHitOwner = false;
369        pelaaja2.Weapon.Image = ase2kuva;
370        pelaaja2.Weapon.Y = 5;
371          PlatformCharacter pelaaja = new PlatformCharacter(leveys * 0.8, korkeus * 1.0);
372        pelaaja2.Weapon.FireRate = 1000;
373
374
375
376     
377     
378    }
379
380    void Rajayta(PhysicsObject tormaaja, PhysicsObject Kohde)
381    {
382        int pMaxMaara = 4;
383        // Alustetaan räjähdysjärjestelmä
384        // Parametrit:
385        // * kuva: mitä tekstuuria räjähdyksen
386        //   hiukkasten halutaan käyttävän
387        // * pMaxMaara: räjähdyksen käyttämien
388        //   hiukkasten eli partikkeleiden maksimimäärä
389        ExplosionSystem rajahdys =
390        new ExplosionSystem(LoadImage("Thomasräjähdys"), pMaxMaara);
391        rajahdys.MaxScale = 1000;
392
393
394        // Lisätään järjestelmä peliin
395        Add(rajahdys);
396
397        int pMaara = 50;
398        // "Käynnistetään" räjähdys
399        rajahdys.AddEffect(tormaaja.X, Kohde.Y, pMaara);
400        tormaaja.Destroy();
401    }
402
403
404
405
406
407
408
409
410    void LisaaNappaimet()
411    {
412        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
413        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
414
415        Keyboard.Listen(Key.A, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, -nopeus);
416        Keyboard.Listen(Key.D, ButtonState.Down, Liikuta, "Liikkuu oikealle", pelaaja1, nopeus);
417        Keyboard.Listen(Key.W, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
418
419        Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja2, -nopeus);
420        Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikkuu oikealle", pelaaja2, nopeus);
421        Keyboard.Listen(Key.Up, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja2, hyppyNopeus);
422        Keyboard.Listen(Key.L, ButtonState.Down, HeitaKranaatti, "heitä kranaatti", pelaaja2);
423        //Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja2,-nopeus);
424        //Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikkuu oikealle", pelaaja2,nopeus);
425        //Keyboard.Listen(Key.Up, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja2, pelaaja1.hyppyNopeus);
426        //Keyboard.Listen(Key.O, ButtonState.Down, fly, "pelaaja lentää", pelaaja2, flynopeus);
427
428        Keyboard.Listen(Key.Enter, ButtonState.Pressed, KysyTeksti, "kysytaan pelajalta tekstiä");
429
430        ControllerOne.Listen(Button.Back, ButtonState.Pressed, Exit, "Poistu pelistä");
431
432        ControllerOne.Listen(Button.DPadLeft, ButtonState.Down, Liikuta, "Pelaaja liikkuu vasemmalle", pelaaja1, -nopeus);
433        ControllerOne.Listen(Button.DPadRight, ButtonState.Down, Liikuta, "Pelaaja liikkuu oikealle", pelaaja1, nopeus);
434        ControllerOne.Listen(Button.A, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
435        //Keyboard.Listen(Key.Space, ButtonState.Down, AmmuAseella, "Ammu", pelaaja1);
436        Keyboard.Listen(Key.E, ButtonState.Down, HeitaKranaatti, "heitä kranaatti", pelaaja1);
437
438        Mouse.ListenMovement(0.0, KuunteleLiiketta, null);
439        Mouse.Listen(MouseButton.Left, ButtonState.Pressed, AmmuAseella, null, pelaaja1);
440        Keyboard.Listen(Key.P, ButtonState.Down, AmmuAseella, null, pelaaja2);
441
442
443
444    }
445    void KysyTeksti()
446    {
447        InputWindow viestiIkkuna = new InputWindow("Kirjoista viesti");
448        viestiIkkuna.TextEntered += ProcessInput;
449        Add(viestiIkkuna);
450    }
451    void ProcessInput(InputWindow ikkuna)
452    {
453        string viesti = ikkuna.InputBox.Text;
454        MessageDisplay.Add(viesti);
455
456        // pätkitään vastaus moneen palaseen:
457        string[] palat = viesti.Split(new char[] { ' ' });
458
459        // jos palasia oli tasan näin monta kappaletta:
460        if (palat.Length == 2)
461        {
462            // tarkistetaan, oliko eka sana tämä:
463            if (palat[0] == "gravity")
464            {
465                // asetetaan painovoiman oletus:
466                double luku = -1000;
467                // jos toinen palanen oli luettavissa lukuna:
468                if (double.TryParse(palat[1], out luku))
469                {
470                    // asetetaan painovoimaksi luku
471                    Gravity = new Vector(0, luku);
472                }
473            }
474        }
475    }
476    void KuunteleLiiketta(AnalogState hiirenTila)
477    {
478        tahtain.Position = Mouse.PositionOnWorld;
479        pelaaja1.Weapon.AbsoluteAngle = (Mouse.PositionOnWorld - pelaaja1.Position).Angle;
480
481    }
482
483
484    void Liikuta(PlatformCharacter hahmo, double nopeus)
485    {
486        hahmo.Walk(nopeus);
487    }
488
489    void Hyppaa(PlatformCharacter hahmo, double nopeus)
490    {
491        hahmo.Jump(nopeus);
492    }
493
494    void TormaaTahteen(PhysicsObject hahmo, PhysicsObject tahti)
495    {
496        maaliAani.Play();
497        MessageDisplay.Add("lol");
498        tahti.Destroy();
499    }
500    void AmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
501    {
502        ammus.Destroy();
503        if (kohde.Tag == "pelaaja" || kohde.Tag == "ammus") return;
504       
505        if (kohde.Tag.Equals("m"))
506        {
507            //ShowMessageWindow("Osu");
508            if ((kohde as OutoHirvio).AloitaAjastin())
509            {
510                (kohde as OutoHirvio).Ajastin.Timeout += delegate { SpawnaaUusiBosspoop(kohde.Position); };
511            }
512            (kohde as OutoHirvio).ElamaLaskuri.Value--;
513        }
514        if (kohde.Tag.ToString() == "p")
515        {
516            kohde.Destroy();
517            pisteLaskuri.Value += 1;
518        }
519        if (kohde.Tag == "A")
520        {
521
522            (kohde as Asevihu).ElamaLaskuri.Value--;
523            // kohde.Destroy();
524        }
525
526
527    }
528
529    void SpawnaaUusiBosspoop(Vector paikka)
530    {
531        LisaaOlio4(paikka, RUUDUN_KOKO / 2.0, RUUDUN_KOKO / 2.0);
532
533
534    }
535
536    void VihuAmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
537    {
538        ammus.Destroy();
539        if (kohde.Tag == "pelaaja")
540        {
541            kohde.Destroy();
542        }
543    }
544    void AmmuAseella(Asevihu asevihu)
545    {
546        if (asevihu.IsDestroyed) return;
547
548        PhysicsObject ammus = asevihu.Weapon.Shoot();
549
550        if (ammus != null)
551        {
552            //ammus.Size *= 0.10;
553            ammus.Width = 20;
554            ammus.Height = 1;
555            //ammus.Image = ...
556            ammus.MaximumLifetime = TimeSpan.FromSeconds(2.0);
557        }
558
559
560    }
561    void AmmuAseella(PlatformCharacter pelaaja)
562    {
563        if (pelaaja.IsDestroyed) return;
564
565        for (int i = -2; i <= 2; i++)
566        {
567            PhysicsObject ammus = new PhysicsObject (10,10, Shape.Star);
568            ammus.Position = pelaaja.Position;
569            ammus.MaximumLifetime = TimeSpan.FromSeconds(0.4);
570            Add(ammus);
571            ammus.Tag = "ammus";
572            ammus.Hit(Vector.FromLengthAndAngle(1000,pelaaja.Weapon.Angle + Angle.FromDegrees(i*10)));
573            ammus.IgnoresCollisionWith(pelaaja1);
574            ammus.IgnoresCollisionWith(pelaaja2);
575            ammus.IgnoresGravity = true;
576            AddCollisionHandler(ammus, "p", AmmusOsui);
577            AddCollisionHandler(ammus, "A", AmmusOsui);
578            AddCollisionHandler(ammus, "m", AmmusOsui);
579            AddCollisionHandler(ammus, "V", AmmusOsui);
580            AddCollisionHandler(ammus, "B", AmmusOsui);
581            AddCollisionHandler(ammus, "y", AmmusOsui);
582        }
583
584
585
586    }
587    void HeitaKranaatti(PlatformCharacter pelaaja)
588    {
589        if (pelaaja.IsDestroyed) return;
590
591        Grenade kranu = new Grenade(3.0);
592        pelaaja1.Throw(kranu, Angle.FromDegrees(50), 10000);
593
594        kranu.Explosion.AddShockwaveHandler("A", KranaattiOsui);
595
596        kranu.Explosion.AddShockwaveHandler("p", KranaattiOsui);
597    }
598    void KranaattiOsui(IPhysicsObject rajahdyksenKohde, Vector v)
599    {
600        rajahdyksenKohde.Destroy();
601    }
602
603    void pelinlopussa()
604    {
605        MultiSelectWindow alkuValikko = new MultiSelectWindow("Pelin alkuvalikko", "Aloita peli", "Lopeta");
606        Add(alkuValikko);
607
608        alkuValikko.AddItemHandler(0, Begin);
609        alkuValikko.AddItemHandler(1, Exit);
610    }
611}
612
613class OutoHirvio : PlatformCharacter
614{
615    private IntMeter elamaLaskuri = new IntMeter(30, 0, 30);
616    public IntMeter ElamaLaskuri { get { return elamaLaskuri; } }
617    public Timer Ajastin = new Timer();
618    public OutoHirvio(double leveys, double korkeus)
619        : base(leveys, korkeus)
620    {
621        this.Ajastin.Interval = 1.0;
622
623        elamaLaskuri.LowerLimit += delegate { this.Destroy(); };
624    }
625
626    public bool AloitaAjastin()
627    {
628        if (this.Ajastin.Enabled == true)
629        {
630            return false;
631        }
632        else
633        {
634            this.Ajastin.Start();
635        }
636
637        return true;
638
639    }
640
641}
Note: See TracBrowser for help on using the repository browser.