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

Revision 9492, 18.6 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 = 300;
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        pelaaja.Weapon.FireRate = 10;
333
334     
335
336        return pelaaja;
337
338    }
339
340    void paasiMaalin(PhysicsObject pelaaja, PhysicsObject maali)
341    {
342        kenttaNumero++;
343
344        ClearAll();
345        Begin();
346
347
348    }
349    void lisaapelaaja1(Vector paikka, double leveys, double korkeus)
350    {
351        pelaaja1 = LuoPelaaja(paikka, leveys, korkeus);
352    }
353
354    void lisaapelaaja2(Vector paikka, double leveys, double korkeus)
355    {
356        pelaaja2 = LuoPelaaja(paikka, leveys, korkeus);
357        pelaaja2.Image = pelaaja2Kuva;
358        pelaaja2.Weapon = new AssaultRifle(40, 15);
359        pelaaja2.Weapon.ProjectileCollision = AmmusOsui;
360        pelaaja2.Weapon.InfiniteAmmo = true;
361        pelaaja2.Weapon.Power.DefaultValue = 400;
362        pelaaja2.Weapon.AmmoIgnoresGravity = true;
363        pelaaja2.Weapon.AmmoIgnoresExplosions = true;
364        pelaaja2.Weapon.CanHitOwner = false;
365        pelaaja2.Weapon.Image = ase2kuva;
366        pelaaja2.Weapon.Y = 5;
367          PlatformCharacter pelaaja = new PlatformCharacter(leveys * 0.8, korkeus * 1.0);
368        pelaaja2.Weapon.FireRate = 1000;
369
370
371
372     
373     
374    }
375
376    void Rajayta(PhysicsObject tormaaja, PhysicsObject Kohde)
377    {
378        int pMaxMaara = 4;
379        // Alustetaan räjähdysjärjestelmä
380        // Parametrit:
381        // * kuva: mitä tekstuuria räjähdyksen
382        //   hiukkasten halutaan käyttävän
383        // * pMaxMaara: räjähdyksen käyttämien
384        //   hiukkasten eli partikkeleiden maksimimäärä
385        ExplosionSystem rajahdys =
386        new ExplosionSystem(LoadImage("Thomasräjähdys"), pMaxMaara);
387        rajahdys.MaxScale = 1000;
388
389
390        // Lisätään järjestelmä peliin
391        Add(rajahdys);
392
393        int pMaara = 50;
394        // "Käynnistetään" räjähdys
395        rajahdys.AddEffect(tormaaja.X, Kohde.Y, pMaara);
396        tormaaja.Destroy();
397    }
398
399
400
401
402
403
404
405
406    void LisaaNappaimet()
407    {
408        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
409        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
410
411        Keyboard.Listen(Key.A, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, -nopeus);
412        Keyboard.Listen(Key.D, ButtonState.Down, Liikuta, "Liikkuu oikealle", pelaaja1, nopeus);
413        Keyboard.Listen(Key.W, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
414
415        Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja2, -nopeus);
416        Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikkuu oikealle", pelaaja2, nopeus);
417        Keyboard.Listen(Key.Up, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja2, hyppyNopeus);
418        Keyboard.Listen(Key.L, ButtonState.Down, HeitaKranaatti, "heitä kranaatti", pelaaja2);
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, pelaaja1.hyppyNopeus);
422        //Keyboard.Listen(Key.O, ButtonState.Down, fly, "pelaaja lentää", pelaaja2, flynopeus);
423
424        Keyboard.Listen(Key.Enter, ButtonState.Pressed, KysyTeksti, "kysytaan pelajalta tekstiä");
425
426        ControllerOne.Listen(Button.Back, ButtonState.Pressed, Exit, "Poistu pelistä");
427
428        ControllerOne.Listen(Button.DPadLeft, ButtonState.Down, Liikuta, "Pelaaja liikkuu vasemmalle", pelaaja1, -nopeus);
429        ControllerOne.Listen(Button.DPadRight, ButtonState.Down, Liikuta, "Pelaaja liikkuu oikealle", pelaaja1, nopeus);
430        ControllerOne.Listen(Button.A, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
431        //Keyboard.Listen(Key.Space, ButtonState.Down, AmmuAseella, "Ammu", pelaaja1);
432        Keyboard.Listen(Key.E, ButtonState.Down, HeitaKranaatti, "heitä kranaatti", pelaaja1);
433
434        Mouse.ListenMovement(0.0, KuunteleLiiketta, null);
435        Mouse.Listen(MouseButton.Left, ButtonState.Down, AmmuAseella, null, pelaaja1);
436        Keyboard.Listen(Key.P, ButtonState.Down, AmmuAseella, null, pelaaja2);
437
438
439
440    }
441    void KysyTeksti()
442    {
443        InputWindow viestiIkkuna = new InputWindow("Kirjoista viesti");
444        viestiIkkuna.TextEntered += ProcessInput;
445        Add(viestiIkkuna);
446    }
447    void ProcessInput(InputWindow ikkuna)
448    {
449        string viesti = ikkuna.InputBox.Text;
450        MessageDisplay.Add(viesti);
451
452        // pätkitään vastaus moneen palaseen:
453        string[] palat = viesti.Split(new char[] { ' ' });
454
455        // jos palasia oli tasan näin monta kappaletta:
456        if (palat.Length == 2)
457        {
458            // tarkistetaan, oliko eka sana tämä:
459            if (palat[0] == "gravity")
460            {
461                // asetetaan painovoiman oletus:
462                double luku = -1000;
463                // jos toinen palanen oli luettavissa lukuna:
464                if (double.TryParse(palat[1], out luku))
465                {
466                    // asetetaan painovoimaksi luku
467                    Gravity = new Vector(0, luku);
468                }
469            }
470        }
471    }
472    void KuunteleLiiketta(AnalogState hiirenTila)
473    {
474        tahtain.Position = Mouse.PositionOnWorld;
475        pelaaja1.Weapon.AbsoluteAngle = (Mouse.PositionOnWorld - pelaaja1.Position).Angle;
476
477    }
478
479
480    void Liikuta(PlatformCharacter hahmo, double nopeus)
481    {
482        hahmo.Walk(nopeus);
483    }
484
485    void Hyppaa(PlatformCharacter hahmo, double nopeus)
486    {
487        hahmo.Jump(nopeus);
488    }
489
490    void TormaaTahteen(PhysicsObject hahmo, PhysicsObject tahti)
491    {
492        maaliAani.Play();
493        MessageDisplay.Add("keräsit paskan!");
494        tahti.Destroy();
495    }
496    void AmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
497    {
498        ammus.Destroy();
499        if (kohde.Tag.Equals("m"))
500        {
501            //ShowMessageWindow("Osu");
502            if ((kohde as OutoHirvio).AloitaAjastin())
503            {
504                (kohde as OutoHirvio).Ajastin.Timeout += delegate { SpawnaaUusiBosspoop(kohde.Position); };
505            }
506            (kohde as OutoHirvio).ElamaLaskuri.Value--;
507        }
508        if (kohde.Tag.ToString() == "p")
509        {
510            kohde.Destroy();
511            pisteLaskuri.Value += 1;
512        }
513        if (kohde.Tag == "A")
514        {
515
516            (kohde as Asevihu).ElamaLaskuri.Value--;
517            // kohde.Destroy();
518        }
519
520
521    }
522
523    void SpawnaaUusiBosspoop(Vector paikka)
524    {
525        LisaaOlio4(paikka, RUUDUN_KOKO / 2.0, RUUDUN_KOKO / 2.0);
526
527
528    }
529
530    void VihuAmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
531    {
532        ammus.Destroy();
533        if (kohde.Tag == "pelaaja")
534        {
535            kohde.Destroy();
536        }
537    }
538    void AmmuAseella(Asevihu asevihu)
539    {
540        if (asevihu.IsDestroyed) return;
541
542        PhysicsObject ammus = asevihu.Weapon.Shoot();
543
544        if (ammus != null)
545        {
546            //ammus.Size *= 0.10;
547            ammus.Width = 20;
548            ammus.Height = 1;
549            //ammus.Image = ...
550            ammus.MaximumLifetime = TimeSpan.FromSeconds(2.0);
551        }
552
553
554    }
555    void AmmuAseella(PlatformCharacter pelaaja)
556    {
557        if (pelaaja.IsDestroyed) return;
558
559        PhysicsObject ammus = pelaaja.Weapon.Shoot();
560
561        if (ammus != null)
562        {
563            //ammus.Size *= 0.10;
564            ammus.Width = 20;
565            ammus.Height = 1;
566            //ammus.Image = ...
567            ammus.MaximumLifetime = TimeSpan.FromSeconds(10.0);
568        }
569
570
571
572    }
573    void HeitaKranaatti(PlatformCharacter pelaaja)
574    {
575        if (pelaaja.IsDestroyed) return;
576
577        Grenade kranu = new Grenade(3.0);
578        pelaaja1.Throw(kranu, Angle.FromDegrees(50), 10000);
579
580        kranu.Explosion.AddShockwaveHandler("A", KranaattiOsui);
581
582        kranu.Explosion.AddShockwaveHandler("p", KranaattiOsui);
583    }
584    void KranaattiOsui(IPhysicsObject rajahdyksenKohde, Vector v)
585    {
586        rajahdyksenKohde.Destroy();
587    }
588
589    void pelinlopussa()
590    {
591        MultiSelectWindow alkuValikko = new MultiSelectWindow("Pelin alkuvalikko", "Aloita peli", "Lopeta");
592        Add(alkuValikko);
593
594        alkuValikko.AddItemHandler(0, Begin);
595        alkuValikko.AddItemHandler(1, Exit);
596    }
597}
598
599class OutoHirvio : PlatformCharacter
600{
601    private IntMeter elamaLaskuri = new IntMeter(30, 0, 30);
602    public IntMeter ElamaLaskuri { get { return elamaLaskuri; } }
603    public Timer Ajastin = new Timer();
604    public OutoHirvio(double leveys, double korkeus)
605        : base(leveys, korkeus)
606    {
607        this.Ajastin.Interval = 1.0;
608
609        elamaLaskuri.LowerLimit += delegate { this.Destroy(); };
610    }
611
612    public bool AloitaAjastin()
613    {
614        if (this.Ajastin.Enabled == true)
615        {
616            return false;
617        }
618        else
619        {
620            this.Ajastin.Start();
621        }
622
623        return true;
624
625    }
626
627}
Note: See TracBrowser for help on using the repository browser.