source: 2016/30/TaavettiV/streetalien2/streetalien2/streetalien2/streetalien2.cs @ 9477

Revision 9477, 17.4 KB checked in by rikavila, 17 months 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 streetalien2 : 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("parasase");
20    Image pelaajanKuva = LoadImage("pelityyppiparas");
21    Image tahtiKuva = LoadImage("tahti");
22
23    Image pompKuva = LoadImage("pomp");
24    Image asevihukuva = LoadImage("kesken");
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
31
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 = 1;
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 = 1.2;
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("taustamusa");
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.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
118        Level.CreateBorders();
119
120        Level.Background.CreateGradient(Color.DarkRed, Color.LightBlue);
121    }
122
123    void LisaaTaso(Vector paikka, double leveys, double korkeus)
124    {
125        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
126        taso.Position = paikka;
127        taso.Color = Color.DarkBrown;
128        Add(taso);
129        taso.Image = LoadImage("metalli");
130    }
131    void lisaaMaali(Vector paikka, double leveys, double korkeus)
132    {
133        PhysicsObject maali = PhysicsObject.CreateStaticObject(leveys, korkeus);
134
135        maali.Tag = "maali";
136        maali.Position = paikka;
137        Add(maali);
138    }
139
140    void Lisaametallii(Vector paikka, double leveys, double korkeus)
141    {
142        PhysicsObject metalli = new PhysicsObject(leveys, korkeus);
143        metalli.Position = paikka;
144        metalli.Color = Color.Green;
145        metalli.Tag = "metalli";
146        Add(metalli);
147        metalli.MakeStatic();
148
149        metalli.Image = LoadImage("metalli");
150
151    }
152
153
154
155    void LisaaTahti(Vector paikka, double leveys, double korkeus)
156    {
157        PhysicsObject tahti = PhysicsObject.CreateStaticObject(leveys, korkeus);
158        tahti.IgnoresCollisionResponse = true;
159        tahti.Position = paikka;
160        tahti.Image = tahtiKuva;
161        tahti.Tag = "tahti";
162        Add(tahti);
163    }
164    void LisaaOlio(Vector paikka, double leveys, double korkeus)
165    {
166        PlatformCharacter p = new PlatformCharacter(leveys * 0.9, korkeus * 0.9);
167        p.Position = paikka;
168        p.Image = pompKuva;
169        Add(p);
170        p.Tag = "p";
171
172        PlatformWandererBrain tasoAivot = new PlatformWandererBrain();
173        tasoAivot.Speed = 100;
174
175        tasoAivot.FallsOffPlatforms = true;
176        tasoAivot.TriesToJump = true;
177
178        p.Brain = tasoAivot;
179
180    }
181
182    void LisaaOlio2(Vector paikka, double leveys, double korkeus)
183    {
184        Asevihu asevihu = new Asevihu(leveys * 0.9, korkeus * 0.9);
185        asevihu.Position = paikka;
186        asevihu.Image = asevihukuva;
187        Add(asevihu);
188        asevihu.Tag = "A";
189
190        PlatformWandererBrain tasoAivot = new PlatformWandererBrain();
191        tasoAivot.Speed = 100;
192
193        tasoAivot.FallsOffPlatforms = true;
194        tasoAivot.TriesToJump = true;
195
196        asevihu.Brain = tasoAivot;
197
198        //AssaultRifle ase = new AssaultRifle(30, 10);
199        //ase.ProjectileCollision = VihuAmmusOsui;
200        //asevihu.Add(ase);
201        asevihu.Weapon = new AssaultRifle(30, 10);
202        asevihu.Weapon.ProjectileCollision = VihuAmmusOsui;
203
204        Timer aikaLaskuri = new Timer();
205        aikaLaskuri.Interval = 2;
206        aikaLaskuri.Timeout += () => AmmuAseella(asevihu);
207        aikaLaskuri.Start();
208    }
209    void LisaaOlio3(Vector paikka, double leveys, double korkeus)
210    {
211        PlatformCharacter m = new PlatformCharacter(leveys * 0.9, korkeus * 0.9);
212        m.Position = paikka;
213        m.Image = knightkuva;
214        Add(m);
215        m.Tag = "m";
216
217        PlatformWandererBrain tasoAivot = new PlatformWandererBrain();
218        tasoAivot.Speed = 100;
219
220        tasoAivot.FallsOffPlatforms = true;
221        tasoAivot.TriesToJump = true;
222
223        m.Brain = tasoAivot;
224
225    }
226
227
228    void LisaaOlio4(Vector paikka, double leveys, double korkeus)
229    {
230        OutoHirvio B = new OutoHirvio(leveys * 1.0, korkeus * 1.0);
231        B.Position = paikka;
232        B.Image = vauvaBoss;
233        Add(B);
234        B.Tag = "B";
235
236
237        PlatformWandererBrain tasoAivot = new PlatformWandererBrain();
238        tasoAivot.Speed = 100;
239
240        tasoAivot.FallsOffPlatforms = true;
241        tasoAivot.TriesToJump = true;
242
243        B.Brain = tasoAivot;
244
245    }
246
247    void LisaaOlio6(Vector paikka, double leveys, double korkeus)
248    {
249        PlatformCharacter y = new PlatformCharacter(leveys * 1.0, korkeus * 1.0);
250        y.Position = paikka;
251        y.Image = Ythomas;
252        Add(y);
253        y.Tag = "y";
254
255        PlatformWandererBrain tasoAivot = new PlatformWandererBrain();
256        tasoAivot.Speed = 900;
257
258        tasoAivot.FallsOffPlatforms = true;
259        tasoAivot.TriesToJump = true;
260
261        y.Brain = tasoAivot;
262
263    }
264    void LisaaOlio5(Vector paikka, double leveys, double korkeus)
265    {
266        OutoHirvio m = new OutoHirvio(leveys * 2.9, korkeus * 2.9);
267        m.Position = paikka;
268        m.Image = vihreaBossKuva;
269        Add(m);
270        m.Tag = "m";
271
272        PlatformWandererBrain tasoAivot = new PlatformWandererBrain();
273        tasoAivot.Speed = 100;
274
275        tasoAivot.FallsOffPlatforms = true;
276        tasoAivot.TriesToJump = true;
277
278        m.Brain = tasoAivot;
279
280    }
281
282    void Tormaap(PhysicsObject pelaaja1, PhysicsObject p)
283    {
284        pelaaja1.Destroy();
285
286        Explosion rajahdys = new Explosion(50);
287        rajahdys.Position = p.Position;
288        Add(rajahdys);
289    }
290
291    PlatformCharacter LuoPelaaja(Vector paikka, double leveys, double korkeus)
292    {
293        PlatformCharacter pelaaja = new PlatformCharacter(leveys * 0.7, korkeus * 0.9);
294        pelaaja.Position = paikka;
295        pelaaja.Mass = 3.0;
296        pelaaja.Tag = "pelaaja";
297        pelaaja.Image = pelaajanKuva;
298        AddCollisionHandler(pelaaja, "tahti", TormaaTahteen);
299        AddCollisionHandler(pelaaja, "p", CollisionHandler.ExplodeBoth(999, true));
300        AddCollisionHandler(pelaaja, "B", CollisionHandler.ExplodeBoth(999, true));
301        AddCollisionHandler(pelaaja, "maali", paasiMaalin);
302        AddCollisionHandler(pelaaja, "m", Tormaap);
303        AddCollisionHandler(pelaaja, "y", Rajayta);
304
305        Add(pelaaja);
306
307
308
309        pelaaja.Destroyed += pelinlopussa;
310
311        pelaaja.Weapon = new AssaultRifle(30, 10);
312        pelaaja.Weapon.ProjectileCollision = AmmusOsui;
313        pelaaja.Weapon.InfiniteAmmo = true;
314        pelaaja.Weapon.Power.DefaultValue = 400;
315        pelaaja.Weapon.AmmoIgnoresGravity = true;
316        pelaaja.Weapon.AmmoIgnoresExplosions = true;
317        pelaaja.Weapon.CanHitOwner = false;
318        pelaaja.Weapon.Image = aseenkuva;
319        pelaaja.Weapon.Y = 5;
320
321        pelaaja.Weapon.FireRate = 10;
322
323        pelaaja.Weapon.FireRate = 50;
324
325        return pelaaja;
326
327    }
328
329    void paasiMaalin(PhysicsObject pelaaja, PhysicsObject maali)
330    {
331        kenttaNumero++;
332
333        ClearAll();
334        Begin();
335
336
337    }
338    void lisaapelaaja1(Vector paikka, double leveys, double korkeus)
339    {
340        pelaaja1 = LuoPelaaja(paikka, leveys, korkeus);
341    }
342
343    void lisaapelaaja2(Vector paikka, double leveys, double korkeus)
344    {
345        pelaaja2 = LuoPelaaja(paikka, leveys, korkeus);
346    }
347
348    void Rajayta(PhysicsObject tormaaja, PhysicsObject Kohde)
349    {
350        int pMaxMaara = 3;
351        // Alustetaan räjähdysjärjestelmä
352        // Parametrit:
353        // * kuva: mitä tekstuuria räjähdyksen
354        //   hiukkasten halutaan käyttävän
355        // * pMaxMaara: räjähdyksen käyttämien
356        //   hiukkasten eli partikkeleiden maksimimäärä
357        ExplosionSystem rajahdys =
358        new ExplosionSystem(LoadImage("Thomasräjähdys"), pMaxMaara);
359        rajahdys.MaxScale = 1000;
360
361
362        // Lisätään järjestelmä peliin
363        Add(rajahdys);
364
365        int pMaara = 50;
366        // "Käynnistetään" räjähdys
367        rajahdys.AddEffect(tormaaja.X, Kohde.Y, pMaara);
368        tormaaja.Destroy();
369    }
370
371
372
373
374
375
376
377
378    void LisaaNappaimet()
379    {
380        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
381        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
382
383        Keyboard.Listen(Key.A, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, -nopeus);
384        Keyboard.Listen(Key.D, ButtonState.Down, Liikuta, "Liikkuu oikealle", pelaaja1, nopeus);
385        Keyboard.Listen(Key.W, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
386
387        Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja2, -nopeus);
388        Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikkuu oikealle", pelaaja2, nopeus);
389        Keyboard.Listen(Key.Up, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja2, hyppyNopeus);
390        Keyboard.Listen(Key.L, ButtonState.Down, HeitaKranaatti, "heitä kranaatti", pelaaja2);
391        //Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja2,-nopeus);
392        //Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikkuu oikealle", pelaaja2,nopeus);
393        //Keyboard.Listen(Key.Up, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja2, pelaaja1.hyppyNopeus);
394        //Keyboard.Listen(Key.O, ButtonState.Down, fly, "pelaaja lentää", pelaaja2, flynopeus);
395
396        Keyboard.Listen(Key.Enter, ButtonState.Pressed, KysyTeksti, "kysytaan pelajalta tekstiä");
397
398        ControllerOne.Listen(Button.Back, ButtonState.Pressed, Exit, "Poistu pelistä");
399
400        ControllerOne.Listen(Button.DPadLeft, ButtonState.Down, Liikuta, "Pelaaja liikkuu vasemmalle", pelaaja1, -nopeus);
401        ControllerOne.Listen(Button.DPadRight, ButtonState.Down, Liikuta, "Pelaaja liikkuu oikealle", pelaaja1, nopeus);
402        ControllerOne.Listen(Button.A, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
403        //Keyboard.Listen(Key.Space, ButtonState.Down, AmmuAseella, "Ammu", pelaaja1);
404        Keyboard.Listen(Key.E, ButtonState.Down, HeitaKranaatti, "heitä kranaatti", pelaaja1);
405
406        Mouse.ListenMovement(0.0, KuunteleLiiketta, null);
407        Mouse.Listen(MouseButton.Left, ButtonState.Down, AmmuAseella, null, pelaaja1);
408
409
410
411
412    }
413    void KysyTeksti()
414    {
415        InputWindow viestiIkkuna = new InputWindow("Kirjoista viesti");
416        viestiIkkuna.TextEntered += ProcessInput;
417        Add(viestiIkkuna);
418    }
419    void ProcessInput(InputWindow ikkuna)
420    {
421        string viesti = ikkuna.InputBox.Text;
422        MessageDisplay.Add(viesti);
423
424        // pätkitään vastaus moneen palaseen:
425        string[] palat = viesti.Split(new char[] { ' ' });
426
427        // jos palasia oli tasan näin monta kappaletta:
428        if (palat.Length == 2)
429        {
430            // tarkistetaan, oliko eka sana tämä:
431            if (palat[0] == "gravity")
432            {
433                // asetetaan painovoiman oletus:
434                double luku = -1000;
435                // jos toinen palanen oli luettavissa lukuna:
436                if (double.TryParse(palat[1], out luku))
437                {
438                    // asetetaan painovoimaksi luku
439                    Gravity = new Vector(0, luku);
440                }
441            }
442        }
443    }
444    void KuunteleLiiketta(AnalogState hiirenTila)
445    {
446        tahtain.Position = Mouse.PositionOnWorld;
447        pelaaja1.Weapon.AbsoluteAngle = (Mouse.PositionOnWorld - pelaaja1.Position).Angle;
448
449    }
450
451
452    void Liikuta(PlatformCharacter hahmo, double nopeus)
453    {
454        hahmo.Walk(nopeus);
455    }
456
457    void Hyppaa(PlatformCharacter hahmo, double nopeus)
458    {
459        hahmo.Jump(nopeus);
460    }
461
462    void TormaaTahteen(PhysicsObject hahmo, PhysicsObject tahti)
463    {
464        maaliAani.Play();
465        MessageDisplay.Add("keräsit paskan!");
466        tahti.Destroy();
467    }
468    void AmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
469    {
470        ammus.Destroy();
471        if (kohde.Tag.Equals("m"))
472        {
473            //ShowMessageWindow("Osu");
474            if ((kohde as OutoHirvio).AloitaAjastin())
475            {
476                (kohde as OutoHirvio).Ajastin.Timeout += delegate { SpawnaaUusiBosspoop(kohde.Position); };
477            }
478            (kohde as OutoHirvio).ElamaLaskuri.Value--;
479        }
480        if (kohde.Tag.ToString() == "p")
481        {
482            kohde.Destroy();
483            pisteLaskuri.Value += 1;
484        }
485        if (kohde.Tag == "A")
486        {
487
488            (kohde as Asevihu).ElamaLaskuri.Value--;
489            // kohde.Destroy();
490        }
491
492
493    }
494
495    void SpawnaaUusiBosspoop(Vector paikka)
496    {
497        LisaaOlio4(paikka, RUUDUN_KOKO / 2.0, RUUDUN_KOKO / 2.0);
498
499
500    }
501
502    void VihuAmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
503    {
504        ammus.Destroy();
505        if (kohde.Tag == "pelaaja")
506        {
507            kohde.Destroy();
508        }
509    }
510    void AmmuAseella(Asevihu asevihu)
511    {
512        if (asevihu.IsDestroyed) return;
513
514        PhysicsObject ammus = asevihu.Weapon.Shoot();
515
516        if (ammus != null)
517        {
518            //ammus.Size *= 0.10;
519            ammus.Width = 20;
520            ammus.Height = 1;
521            //ammus.Image = ...
522            ammus.MaximumLifetime = TimeSpan.FromSeconds(2.0);
523        }
524
525
526    }
527    void AmmuAseella(PlatformCharacter pelaaja)
528    {
529        if (pelaaja.IsDestroyed) return;
530
531        PhysicsObject ammus = pelaaja.Weapon.Shoot();
532
533        if (ammus != null)
534        {
535            //ammus.Size *= 0.10;
536            ammus.Width = 20;
537            ammus.Height = 1;
538            //ammus.Image = ...
539            ammus.MaximumLifetime = TimeSpan.FromSeconds(10.0);
540        }
541
542
543
544    }
545    void HeitaKranaatti(PlatformCharacter pelaaja)
546    {
547        if (pelaaja.IsDestroyed) return;
548
549        Grenade kranu = new Grenade(3.0);
550        pelaaja1.Throw(kranu, Angle.FromDegrees(50), 10000);
551
552        kranu.Explosion.AddShockwaveHandler("A", KranaattiOsui);
553
554        kranu.Explosion.AddShockwaveHandler("p", KranaattiOsui);
555    }
556    void KranaattiOsui(IPhysicsObject rajahdyksenKohde, Vector v)
557    {
558        rajahdyksenKohde.Destroy();
559    }
560
561    void pelinlopussa()
562    {
563        MultiSelectWindow alkuValikko = new MultiSelectWindow("Pelin alkuvalikko", "Aloita peli", "Lopeta");
564        Add(alkuValikko);
565
566        alkuValikko.AddItemHandler(0, Begin);
567        alkuValikko.AddItemHandler(1, Exit);
568    }
569}
570
571class OutoHirvio : PlatformCharacter
572{
573    private IntMeter elamaLaskuri = new IntMeter(30, 0, 30);
574    public IntMeter ElamaLaskuri { get { return elamaLaskuri; } }
575    public Timer Ajastin = new Timer();
576    public OutoHirvio(double leveys, double korkeus)
577        : base(leveys, korkeus)
578    {
579        this.Ajastin.Interval = 1.0;
580
581        elamaLaskuri.LowerLimit += delegate { this.Destroy(); };
582    }
583
584    public bool AloitaAjastin()
585    {
586        if (this.Ajastin.Enabled == true)
587        {
588            return false;
589        }
590        else
591        {
592            this.Ajastin.Start();
593        }
594
595        return true;
596
597    }
598
599}
Note: See TracBrowser for help on using the repository browser.