source: 2014/30/AtteB/Peli/Peli/Peli/Peli.cs @ 5644

Revision 5644, 19.2 KB checked in by athebla, 5 years ago (diff)

Peli päivitetty + uusi kenttä + Slimy päivitetty

Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9// TODO
10// TODO Lisää kenttiä + kenttiin teleporttaaminen (!!!)
11// TODO Lisää vihollisia
12
13class Vihollinen : PlatformCharacter
14{
15    private IntMeter elamaLaskuri;
16    public IntMeter ElamaLaskuri { get { return elamaLaskuri; } }
17
18    public Vihollinen(double leveys, double korkeus, int elama)
19        : base(leveys, korkeus)
20    {
21        elamaLaskuri = new IntMeter(elama, 0, elama);
22        elamaLaskuri.LowerLimit += delegate { this.Destroy(); };
23    }
24}
25
26class Boss : PhysicsObject
27{
28    private IntMeter elamaLaskuri;
29    public IntMeter ElamaLaskuri { get { return elamaLaskuri; } }
30
31    public Boss(double leveys, double korkeus, int elama)
32        : base(leveys, korkeus)
33    {
34        elamaLaskuri = new IntMeter(elama, 0, elama);
35        elamaLaskuri.LowerLimit += delegate { this.Destroy(); };
36    }
37}
38
39class Inventory : Widget
40{
41
42    /// Tapahtuma, kun esine on valittu.
43    public event Action<PhysicsObject> ItemSelected;
44
45    /// Luo uuden esinevalikon.
46    public Inventory()
47        : base(new HorizontalLayout())
48    {
49    }
50
51    /// Lisää esineen.
52    public void AddItem(PhysicsObject item, Image kuva)
53    {
54        PushButton icon = new PushButton(kuva);
55        Add(icon);
56        icon.Clicked += delegate() { SelectItem(item); };
57    }
58
59    void SelectItem(PhysicsObject item)
60    {
61        if (ItemSelected != null)
62        {
63            ItemSelected(item);
64        }
65    }
66}
67
68public class Peli : PhysicsGame
69{
70    DoubleMeter elämäLaskuri;
71
72    AssaultRifle P1FireBall;
73
74    const double nopeus = 200;
75    const double hyppyNopeus = 750;
76    const int RUUDUN_KOKO = 40;
77    int KenttäNumero = 1;
78
79    PlatformCharacter pelaaja1;
80    Vector BossSijainti;
81
82    Image tahtiKuva = LoadImage("tahti");
83    Image StoneKuva = LoadImage("StoneWall");
84    Image StoneTaso = LoadImage("Stone_katto");
85    Image StoneKuva_katto = LoadImage("Stone_katto");
86    Image Pelaaja_Seisoo = LoadImage("Pelaaja_Seisoo");
87    Image Pelaaja_Juoksee = LoadImage("Pelaaja_Juoksee");
88    Image StoneBrickTaso = LoadImage("Stone_brick_tile");
89    Image Slime1 = LoadImage("Slime");
90    Image Slime_damage = LoadImage("Slime_damage");
91    Image FireBall1 = LoadImage("FireBall_1");
92    Image FireBall2 = LoadImage("FireBall_2");
93    Image FireBall3 = LoadImage("FireBall_3");
94    Image FireBall4 = LoadImage("FireBall_4");
95    Image Clear = LoadImage("Clear");
96    Image Heart1 = LoadImage("heart");
97    Image SlimeBall = LoadImage("SlimeBall");
98    Image Gate = LoadImage("Gate");
99
100    SoundEffect maaliAani = LoadSoundEffect("maali");
101    SoundEffect HowItBegins = LoadSoundEffect("HowItBegins");
102    SoundEffect PlayerShoot1 = LoadSoundEffect("PlayerShoot");
103    SoundEffect Hitman = LoadSoundEffect("Hitman");
104
105    public override void Begin()
106    {
107        IsMouseVisible = true;
108        SetWindowSize(1000, 800);
109       
110        MultiSelectWindow alkuValikko = new MultiSelectWindow("Pelin alkuvalikko", "Aloita peli", "Lopeta");
111        Add(alkuValikko);
112
113        alkuValikko.AddItemHandler(0, AloitaPeli);
114        alkuValikko.AddItemHandler(1, Exit);
115    }
116
117    void AloitaPeli()
118    {
119        ClearAll();
120
121        Gravity = new Vector(0, -1000);
122
123        LuoKentta();
124        LisaaNappaimet();
125        LuoElämäLaskuri();
126
127        Camera.Follow(pelaaja1);
128        Camera.ZoomFactor = 1.2;
129        Camera.StayInLevel = true;
130
131        SmoothTextures = false;
132
133        Inventory inventory = new Inventory();
134        Add(inventory);
135
136        Camera.FollowedObject = pelaaja1;
137        Camera.Zoom(1.5);
138
139        MediaPlayer.Play("howitbegins");
140    }
141
142    void LuoKentta()
143    {
144        TileMap kentta = TileMap.FromLevelAsset("kentta" + KenttäNumero);
145        kentta.SetTileMethod('#', LisaaTaso);
146        kentta.SetTileMethod('N', LisaaPelaaja);
147        kentta.SetTileMethod('P', LisaaStoneLattia);
148        kentta.SetTileMethod('+', LisaaStoneKatto);
149        kentta.SetTileMethod('?', LisaaStoneBrickLattia);
150        kentta.SetTileMethod('S', LuoSlime);
151        kentta.SetTileMethod('H', LisaaHeart);
152        kentta.SetTileMethod('O', LisaaOvi);
153        kentta.SetTileMethod('-', LisaaOvenSulkija);
154        kentta.SetTileMethod('2', LisaaOvi2);
155        kentta.SetTileMethod('_', LisaaTeleportteri);
156        kentta.SetTileMethod('B', delegate(Vector paikka, double l, double k) { BossSijainti = paikka; });
157        kentta.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
158        Level.CreateBorders();
159        Level.Background.Image = StoneKuva;
160        Level.Background.TileToLevel();
161    }
162
163    void LisaaTaso(Vector paikka, double leveys, double korkeus)
164    {
165        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
166        taso.Position = paikka;
167        taso.Image = StoneTaso;
168        taso.Tag = "seinä";
169        Add(taso);
170    }
171
172    void LisaaStoneLattia(Vector paikka, double leveys, double korkeus)
173    {
174        PhysicsObject Stone = PhysicsObject.CreateStaticObject(leveys, korkeus);
175        Stone.IgnoresCollisionResponse = true;
176        Stone.Position = paikka;
177        Stone.Image = StoneKuva;
178        Stone.Tag = "seinä";
179        Add(Stone);
180       
181    }
182
183    void LisaaStoneBrickLattia(Vector paikka, double leveys, double korkeus)
184    {
185        PhysicsObject stoneBrick = PhysicsObject.CreateStaticObject(leveys, korkeus);
186        stoneBrick.IgnoresCollisionResponse = false;
187        stoneBrick.Position = paikka;
188        stoneBrick.Image = StoneBrickTaso;
189        stoneBrick.Tag = "seinä";
190        Add(stoneBrick);
191
192    }
193
194    void LisaaStoneKatto(Vector paikka, double leveys, double korkeus)
195    {
196        PhysicsObject Stone = PhysicsObject.CreateStaticObject(leveys, korkeus);
197        Stone.IgnoresCollisionResponse = true;
198        Stone.Position = paikka;
199        Stone.Image = StoneKuva_katto;
200        Stone.Tag = "seinä";
201        Add(Stone);
202
203    }
204
205    void LisaaHeart(Vector paikka, double leveys, double korkeus)
206    {
207        PhysicsObject heart = PhysicsObject.CreateStaticObject(leveys, korkeus);
208        heart.IgnoresCollisionResponse = true;
209        heart.Position = paikka;
210        heart.Image = Heart1;
211        heart.Tag = "health";
212        Add(heart);
213    }
214
215    void LisaaTeleportteri(Vector paikka, double leveys, double korkeus)
216    {
217        PhysicsObject tele = PhysicsObject.CreateStaticObject(leveys, korkeus);
218        tele.IgnoresCollisionResponse = true;
219        tele.Position = paikka;
220        tele.Image = Heart1;
221        tele.Tag = "teleportteri";
222        Add(tele);
223    }
224
225    void LisaaPelaaja(Vector paikka, double leveys, double korkeus)
226    {
227        pelaaja1 = new PlatformCharacter(leveys, korkeus);
228        pelaaja1.Position = paikka;
229        pelaaja1.Mass = 10.0;
230        pelaaja1.Tag = "pelaaja";
231        pelaaja1.Image = Pelaaja_Seisoo;
232        pelaaja1.CollisionIgnoreGroup = 10;
233        AddCollisionHandler(pelaaja1, "vihollinen", PelaajaOsuuViholliseen);
234        AddCollisionHandler(pelaaja1, "health", PelaajaOsuuHeart);
235        AddCollisionHandler(pelaaja1, "ovensulkija", OvetSulkeutuu);
236        AddCollisionHandler(pelaaja1, "boss", PelaajaOsuuViholliseen);
237        AddCollisionHandler(pelaaja1, "teleportteri", PelaajaOsuuTeleportteri);
238        Add(pelaaja1);
239
240        P1FireBall = new AssaultRifle(30, 10);
241        P1FireBall.CanHitOwner = false;
242
243        // Ammusten määrä
244        P1FireBall.InfiniteAmmo = true;
245
246        // Ammus osuu = mitä tapahtuu
247        P1FireBall.ProjectileCollision = AmmusOsuiJohonkin;
248        P1FireBall.Image = Clear;
249
250        pelaaja1.Add(P1FireBall);
251
252        P1FireBall.AttackSound = null;
253    }
254
255    void LisaaNappaimet()
256    {
257        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
258        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
259        Keyboard.Listen(Key.LeftShift, ButtonState.Down, AmmuAseella, "Ammu", P1FireBall);
260
261        Keyboard.Listen(Key.A, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, -nopeus);
262        Keyboard.Listen(Key.D, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, nopeus);
263        Keyboard.Listen(Key.W, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
264        Keyboard.Listen(Key.Space, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
265
266        ControllerOne.Listen(Button.Back, ButtonState.Pressed, Exit, "Poistu pelistä");
267
268        ControllerOne.Listen(Button.DPadLeft, ButtonState.Down, Liikuta, "Pelaaja liikkuu vasemmalle", pelaaja1, -nopeus);
269        ControllerOne.Listen(Button.DPadRight, ButtonState.Down, Liikuta, "Pelaaja liikkuu oikealle", pelaaja1, nopeus);
270        ControllerOne.Listen(Button.A, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
271
272        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
273
274        Mouse.ListenMovement(0.1, Tähtää, "Tähtää aseella");
275    }
276
277    void Liikuta(PlatformCharacter hahmo, double nopeus)
278    {
279        hahmo.Walk(nopeus);
280    }
281
282    void Hyppaa(PlatformCharacter hahmo, double nopeus)
283    {
284        hahmo.Jump(nopeus);
285    }
286
287    void LuoVihollinen(Vector paikka, double leveys, double korkeus)
288    {
289        PhysicsObject vihollinen = new PhysicsObject(leveys, korkeus);
290        vihollinen.Position = paikka;
291        vihollinen.Tag = "vihollinen";
292        //AddCollisionHandler(vihollinen, "ammus", AmmusOsuiJohonkin);
293        Add(vihollinen);
294    }
295
296    void LuoHealthPotion(Vector paikka, double leveys, double korkeus)
297    {
298        PhysicsObject potion = new PhysicsObject(leveys, korkeus);
299        potion.Position = paikka;
300        potion.Tag = "health";
301        Add(potion);
302    }
303
304    public void PelaajaOsuuViholliseen(PhysicsObject pelaaja1, PhysicsObject kohde)
305    {
306        elämäLaskuri.Value -= 5;
307
308        if (elämäLaskuri <= 0)
309            pelaaja1.Destroy();
310    }
311
312    public void PelaajaOsuuHeart(PhysicsObject pelaaja1, PhysicsObject kohde)
313    {
314        if (elämäLaskuri <= elämäLaskuri.MaxValue - 1)
315        {
316            elämäLaskuri.Value += elämäLaskuri + 20;
317            kohde.Destroy();
318        }
319    }
320
321    void LuoSlime(Vector paikka, double leveys, double korkeus)
322    {
323        Vihollinen Slime = new Vihollinen(leveys, korkeus * 0.5, 5);
324        Slime.CanRotate = false;
325        Slime.Position = paikka;
326        Slime.Tag = "vihollinen";
327        Slime.Image = Slime1;
328        Add(Slime);
329       
330        PlatformWandererBrain tasoAivot = new PlatformWandererBrain();
331        tasoAivot.Speed = 150;
332        Slime.Brain = tasoAivot;
333       
334        FollowerBrain SlimeAivot = new FollowerBrain("pelaaja");
335        SlimeAivot.Speed = 200;
336        SlimeAivot.DistanceFar = 600;
337        SlimeAivot.DistanceClose = 300;
338        SlimeAivot.StopWhenTargetClose = true;
339        SlimeAivot.FarBrain = tasoAivot;
340
341        Slime.Weapon = new AssaultRifle(30, 10);
342        Slime.Weapon.ProjectileCollision = BossAmmusOsuu;
343        Slime.Weapon.IsVisible = false;
344        Slime.Weapon.AttackSound = null;
345        Slime.Weapon.FireRate = 1;
346
347        Timer ajastin = new Timer();
348        ajastin.Interval = 0.5;
349        ajastin.Timeout += delegate
350        {
351            if (!Slime.IsDestroyed && Slime.SeesObject(pelaaja1, "seinä"))
352            {
353
354                PhysicsObject ammus2 = Slime.Weapon.Shoot();
355                if (ammus2 != null)
356                {
357                    ammus2.Image = SlimeBall;
358                    ammus2.Size = new Vector(20, 20);
359                    ammus2.MaximumLifetime = TimeSpan.FromSeconds(1.0);
360                    ammus2.Tag = "ammus2";
361                }
362            }
363        };
364        ajastin.Start();
365
366        Timer ajastin2 = new Timer();
367        ajastin2.Interval = 0.01;
368        ajastin2.Timeout += delegate
369        {
370
371            Vector suunta = (pelaaja1.Position - Slime.Position).Normalize();
372            Slime.Weapon.Angle = suunta.Angle;
373
374        };
375        ajastin2.Start();
376    }
377
378    void LuoBoss1(Vector paikka, double leveys, double korkeus)
379    {
380        Boss Boss1 = new Boss(leveys, korkeus * 0.5, 100);
381        Boss1.CanRotate = false;
382        Boss1.Position = paikka;
383        Boss1.Tag = "boss";
384        Boss1.Image = Slime1;
385        Boss1.IgnoresGravity = true;
386        //Boss1.IgnoresCollisionResponse = true;
387        Boss1.Mass = 90000000000;
388        Add(Boss1);
389
390
391        PathFollowerBrain tasoAivot = new PathFollowerBrain(100, paikka + new Vector(-200, 0), paikka + new Vector(200, 0), paikka + new Vector(200, -100), paikka + new Vector(-200, -100));
392        tasoAivot.Loop = true;
393        Boss1.Brain = tasoAivot;
394
395        AssaultRifle weapon = new AssaultRifle(30, 10);
396        weapon.ProjectileCollision = BossAmmusOsuu;
397        weapon.IsVisible = false;
398        weapon.AttackSound = null;
399        weapon.Power.MaxValue = 10;
400        Boss1.Add(weapon);
401
402        Timer ajastin = new Timer();
403        ajastin.Interval = 6;
404        ajastin.Timeout += delegate
405        {
406            Vector suunta = (pelaaja1.Position - Boss1.Position).Normalize();
407            weapon.Angle = suunta.Angle;
408
409            PhysicsObject ammus = weapon.Shoot();
410            if (ammus != null)
411            {
412                ammus.Image = SlimeBall;
413                ammus.Size = new Vector(10, 10);
414                ammus.MaximumLifetime = TimeSpan.FromSeconds(10.0);
415                ammus.Tag = "ammus2";
416                ammus.CollisionIgnoreGroup = 10;
417                AddCollisionHandler(ammus, "seinä", LuoMiniSlime);
418                AddCollisionHandler(ammus, "ovi", LuoMiniSlime);
419
420            }
421            if (Boss1.IsDestroyed)
422            {
423                ajastin.Stop();
424                MediaPlayer.Pause();
425                MediaPlayer.Play("howitbegins");
426
427                foreach (PhysicsObject ovi2 in GetObjectsWithTag("ovi2"))
428                {
429                    ovi2.IgnoresCollisionResponse = true;
430                    ovi2.IsVisible = false;
431                }
432            }
433        };
434        ajastin.Start();
435
436
437        ProgressBar elämäPalkki = new ProgressBar(80, 10);
438        elämäPalkki.X = 0;
439        elämäPalkki.Y = 30;
440        elämäPalkki.BindTo(Boss1.ElamaLaskuri);
441        elämäPalkki.Color = Color.Transparent;
442        elämäPalkki.BarColor = Color.Red;
443        elämäPalkki.BorderColor = Color.Black;
444        Boss1.Add(elämäPalkki);
445    }
446
447    void AmmusOsuiJohonkin(PhysicsObject ammus, PhysicsObject kohde)
448    {
449       
450        if (kohde.Tag.ToString() == "vihollinen")
451        {
452            (kohde as Vihollinen).ElamaLaskuri.Value--;
453            ammus.Destroy();
454
455            kohde.Image = Slime_damage;
456            Timer.SingleShot(0.25, delegate { kohde.Image = Slime1; });
457        }
458        if (kohde.Tag.ToString() == "boss")
459        {
460            (kohde as Boss).ElamaLaskuri.Value--;
461            ammus.Destroy();
462
463            kohde.Image = Slime_damage;
464            //System.Threading.Thread.Sleep(750);
465            Timer.SingleShot(0.25, delegate { kohde.Image = Slime1; });
466        }
467        if (kohde.Tag.ToString() == "seinä" || kohde.Tag.ToString() == "ovi" || kohde.Tag.ToString()== "ovi2")
468        {
469            ammus.Destroy();
470        }
471    }
472
473    void BossAmmusOsuu(PhysicsObject ammus, PhysicsObject kohde)
474    {
475
476        if (kohde.Tag.ToString() == "pelaaja")
477        {
478            elämäLaskuri.Value -= 5;
479            ammus.Destroy();
480        }
481        if (kohde.Tag.ToString() == "seinä")
482        {
483            ammus.Destroy();
484        }
485        if (kohde.Tag.ToString() == "ovi")
486        {
487            ammus.Destroy();
488        }
489        if (kohde.Tag.ToString() == "ovi2")
490        {
491            ammus.Destroy();
492        }
493    }
494
495    void AmmuAseella(AssaultRifle ase)
496    {
497        PhysicsObject ammus = ase.Shoot();
498
499        if (ammus != null)
500        {
501            ammus.Image = FireBall1;
502            ammus.Size = new Vector(40, 40);
503            ammus.MaximumLifetime = TimeSpan.FromSeconds(10.0);
504            ammus.Tag = "ammus";
505            ammus.CollisionIgnoreGroup = 10;
506
507        }
508    }
509
510    void LuoElämäLaskuri()
511    {
512        elämäLaskuri = new DoubleMeter(100);
513        elämäLaskuri.MaxValue = 100;
514        elämäLaskuri.LowerLimit += ElämäLoppui;
515
516        ProgressBar elämäPalkki = new ProgressBar(80, 10);
517        elämäPalkki.X = 0;
518        elämäPalkki.Y = 30;
519        elämäPalkki.BindTo(elämäLaskuri);
520        elämäPalkki.Color = Color.Transparent;
521        elämäPalkki.BarColor = Color.Red;
522        elämäPalkki.BorderColor = Color.Black;
523        pelaaja1.Add(elämäPalkki);
524    }
525
526    void ElämäLoppui()
527    {
528        Explosion PelaajaRäjähtää = new Explosion(200);
529        PelaajaRäjähtää.Position = pelaaja1.Position;
530        PelaajaRäjähtää.Sound = null;
531        Add(PelaajaRäjähtää);
532
533        MessageDisplay.Add("Elämät loppuivat, voi voi.");
534        pelaaja1.Destroy();
535
536        Timer.SingleShot(4.0, AloitaPeliAlusta);
537    }
538
539    void AloitaPeliAlusta()
540    {
541        ClearAll();
542        Begin();
543    }
544
545    void LisaaOvi(Vector paikka, double leveys, double korkeus)
546    {
547        PhysicsObject ovi = PhysicsObject.CreateStaticObject(leveys, korkeus);
548        ovi.Position = paikka;
549        ovi.Image = StoneKuva_katto;
550        ovi.Tag = "ovi";
551        ovi.IgnoresCollisionResponse = true;
552        ovi.IsVisible = false;
553        Add(ovi);
554    }
555
556    void LisaaOvenSulkija(Vector paikka, double leveys, double korkeus)
557    {
558        PhysicsObject ovensulkija = PhysicsObject.CreateStaticObject(leveys, korkeus * 8);
559        ovensulkija.Position = paikka;
560        ovensulkija.Image = Heart1;
561        ovensulkija.Tag = "ovensulkija";
562        ovensulkija.IgnoresCollisionResponse = true;
563        ovensulkija.IsVisible = false;
564        Add(ovensulkija);
565    }
566
567    void OvetSulkeutuu(PhysicsObject pelaaja1, PhysicsObject sulkija)
568    {
569        sulkija.Destroy();
570        foreach (PhysicsObject ovi in GetObjectsWithTag("ovi"))
571        {
572            ovi.IgnoresCollisionResponse = false;
573            ovi.IsVisible = true;
574        }
575
576        LuoBoss1(BossSijainti, RUUDUN_KOKO * 2, RUUDUN_KOKO * 2);
577
578        MediaPlayer.Pause();
579        MediaPlayer.Play("hitman");
580    }
581
582    void LisaaOvi2(Vector paikka, double leveys, double korkeus)
583    {
584        PhysicsObject ovi2 = PhysicsObject.CreateStaticObject(leveys, korkeus);
585        ovi2.Position = paikka;
586        ovi2.Image = StoneKuva_katto;
587        ovi2.Tag = "ovi2";
588        ovi2.IgnoresCollisionResponse = false;
589        ovi2.IsVisible = true;
590        Add(ovi2);
591    }
592
593    void Tähtää(AnalogState hiirenLiike)
594    {
595        Vector suunta = (Mouse.PositionOnWorld - P1FireBall.AbsolutePosition).Normalize();
596        P1FireBall.Angle = suunta.Angle;
597    }
598
599    void LuoMiniSlime(PhysicsObject ammus, PhysicsObject seinä)
600    {
601        LuoSlime(ammus.Position, RUUDUN_KOKO, RUUDUN_KOKO * 1);
602
603    }
604
605    void PelaajaOsuuTeleportteri(PhysicsObject pelaaja1, PhysicsObject kohde)
606    {
607        KenttäNumero++;
608
609        AloitaPeli();
610    }
611
612}
Note: See TracBrowser for help on using the repository browser.