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

Revision 5623, 16.2 KB checked in by athebla, 5 years ago (diff)

Peli päivitetty + Boss ja sen musiikki

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