source: 2014/27/JuhanaK/Avaruuspeli/Avaruuspeli/Avaruuspeli/Avaruuspeli.cs @ 5380

Revision 5380, 15.5 KB checked in by jumaalku, 6 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
9
10
11class Vihu : PlatformCharacter
12{
13    private IntMeter elamaLaskuri;
14    public IntMeter ElamaLaskuri { get { return elamaLaskuri; } }
15
16    public Vihu(int elama, double leveys, double korkeus)
17        : base(leveys, korkeus)
18    {
19        elamaLaskuri = new IntMeter(elama, 0, elama);
20       
21    }
22}
23/// <summary>
24/// Esinevalikko.
25/// </summary>
26class Inventory : Widget
27{
28    /// <summary>
29    /// Tapahtuma, kun esine on valittu.
30    /// </summary>
31    public event Action<PhysicsObject> ItemSelected;
32
33    /// <summary>
34    /// Luo uuden esinevalikon.
35    /// </summary>
36    public Inventory()
37        : base(new HorizontalLayout())
38    {
39    }
40
41    /// <summary>
42    /// Lisää esineen.
43    /// </summary>
44    /// <param name="item">Lisättävä esine.</param>
45    /// <param name="kuva">Esineen ikoni, joka näkyy valikossa.</param>
46    public void AddItem(PhysicsObject item, Image kuva)
47    {
48        PushButton icon = new PushButton(kuva);
49        Add(icon);
50        icon.Clicked += delegate() { SelectItem(item); };
51    }
52
53    void SelectItem(PhysicsObject item)
54    {
55        if (ItemSelected != null)
56        {
57            ItemSelected(item);
58        }
59    }
60}
61
62public class Avaruuspeli : PhysicsGame
63{
64    private Animation OrkinKavely;
65    private Animation MonsteriKavely;
66    private Animation AlienKavely;
67
68    const double nopeus = 200;
69    const double hyppyNopeus = 750;
70    const int RUUDUN_KOKO = 40;
71
72    private int kieorrokset = 10;
73    DoubleMeter aaltoPalkki;
74    ProgressBar aaltoNaytto;
75    DoubleMeter alaspainLaskuri;
76    Timer aaltoAikaLaskuri;
77    private const int MAX_KIERROSAIKA = 300;
78
79    List<Vihu> vihut = new List<Vihu>();
80
81    private Image[] Avaruuskävely = LoadImages("Avaruus saankari", "Avaruus saankari2");
82    private Image[] Monsterinkavelykuvat = LoadImages("Monsteri", "Monsteri2");
83    private Image[] Alienkavelykuvat = LoadImages("Alien", "Alien2");
84
85    PlatformCharacter pelaaja2;
86    PlatformCharacter pelaaja1;
87
88    Image AlienKuva = LoadImage("Alien");
89    Image Orkkikuva = LoadImage("Orkki");
90    Image monsteri = LoadImage("Monsteri");
91    Image flamerkuva= LoadImage("Flamer");
92
93    Image Robo = LoadImage("Robot");
94    Image pelaajanKuva = LoadImage("Avaruus saankari");
95    Image taustakuva = LoadImage("scifi hallway space ship model interior");
96    SoundEffect maaliAani = LoadSoundEffect("maali");
97    DoubleMeter elamaLaskuri;
98    DoubleMeter elamaLaskuri2;
99    SoundEffect osumisaani = LoadSoundEffect("Hit_Hurt2");
100    Inventory inventory;
101
102    public override void Begin()
103    {
104        MediaPlayer.Play("musiikki");
105        MediaPlayer.IsRepeating = true;
106        OrkinKavely = LoadAnimation("Orkki liikkuu");
107        MonsteriKavely = new Animation(Monsterinkavelykuvat);
108        AlienKavely = new Animation(Alienkavelykuvat);
109
110        MultiSelectWindow alkuValikko = new MultiSelectWindow("Spaceship madness", "Aloita peli", "Parhaat pisteet", "Lopeta");
111        Add(alkuValikko);
112        alkuValikko.AddItemHandler(0, pelaajienvalinta);
113        //alkuValikko.AddItemHandler(1, ParhaatPisteet);
114        alkuValikko.AddItemHandler(2, Exit);
115    }
116    void pelaajienvalinta()
117    {
118        MultiSelectWindow alkuValikko = new MultiSelectWindow("Spaceship madness", "yksi pelaaja", "kaksi pelaajaa");
119        Add(alkuValikko);
120        alkuValikko.AddItemHandler(0, Aloitapeli, 1);
121        alkuValikko.AddItemHandler(1, Aloitapeli, 2);
122    }
123
124    void Aloitapeli(int pelaajienLkm)
125    {
126        Gravity = new Vector(0, -1000);
127        SmoothTextures = false;
128       
129
130        if (pelaajienLkm == 1)
131        {
132            LuoKentta();
133        }
134        else
135        {
136            LuoKentta2();
137            LuoElamaLaskuri2();
138        }
139        LisaaNappaimet();
140        LuoElamaLaskuri();
141        LuoPistelaskuri();
142        LuoAaltoPalkki();
143        AaltoLoppui();
144       
145
146
147       
148
149
150
151        Camera.Follow(pelaaja1);
152        Camera.ZoomFactor = 1.2;
153        Camera.StayInLevel = true;
154    }
155
156    void LuoKentta()
157    {
158        TileMap kentta = TileMap.FromLevelAsset("kentta1");
159        kentta.SetTileMethod('#', LisaaTaso);
160
161
162        kentta.SetTileMethod('N', LisaaPelaaja);
163        kentta.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
164        Level.CreateBorders();
165        Level.Background.Image = taustakuva;
166        Level.Background.ScaleToLevelByHeight();
167    }
168    void LuoKentta2()
169    {
170        TileMap kentta = TileMap.FromLevelAsset("kentta1");
171        kentta.SetTileMethod('#', LisaaTaso);
172
173        kentta.SetTileMethod('M', LisaaPelaaja2);
174        kentta.SetTileMethod('N', LisaaPelaaja);
175        kentta.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
176        Level.CreateBorders();
177        Level.Background.Image = taustakuva;
178        Level.Background.ScaleToLevelByHeight();
179    }
180    void LisaaTaso(Vector paikka, double leveys, double korkeus)
181    {
182        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
183        taso.Position = paikka;
184        taso.Color = Color.Transparent;
185        Add(taso);
186    }
187
188
189
190    void LisaaPelaaja(Vector paikka, double leveys, double korkeus)
191    {
192        pelaaja1 = new PlatformCharacter(leveys * 3, korkeus * 3);
193        pelaaja1.Position = paikka;
194        pelaaja1.Mass = 4.0;
195        pelaaja1.Image = pelaajanKuva;
196        Add(pelaaja1);
197        AddCollisionHandler(pelaaja1, "vihollinen", Tormaaviholliseen);
198
199        pelaaja1.AnimWalk = new Animation(Avaruuskävely);
200        pelaaja1.AnimIdle = new Animation(pelaajanKuva);
201        pelaaja1.AnimWalk.FPS = 5;
202
203        inventory = new Inventory();
204        Add(inventory);
205
206        pelaaja1.Weapon = new AssaultRifle(30, 10);
207        pelaaja1.Weapon.Ammo.Value = 100000;
208        pelaaja1.Weapon.ProjectileCollision = AmmusOsui;
209
210        //inventory.AddItem(, flamerkuva);
211
212    }
213    void LisaaPelaaja2(Vector paikka, double leveys, double korkeus)
214    {
215        pelaaja2 = new PlatformCharacter(leveys * 3, korkeus * 3);
216        pelaaja2.Position = paikka;
217        pelaaja2.Mass = 4.0;
218        pelaaja2.Image = pelaajanKuva;
219        Add(pelaaja2);
220        AddCollisionHandler(pelaaja2, "vihollinen", Tormaaviholliseen);
221
222        pelaaja2.AnimWalk = new Animation(Avaruuskävely);
223        pelaaja2.AnimIdle = new Animation(pelaajanKuva);
224        pelaaja2.AnimWalk.FPS = 5;
225
226        pelaaja2.Weapon = new AssaultRifle(30, 10);
227        pelaaja2.Weapon.Ammo.Value = 1000;
228        pelaaja2.Weapon.ProjectileCollision = AmmusOsui;
229    }
230
231    void AmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
232    {
233        ammus.Destroy();
234        if (kohde.Tag.Equals("vihollinen"))
235        {
236            (kohde as Vihu).ElamaLaskuri.Value--;
237            osumisaani.Play();
238           
239        }
240    }
241
242    void AmmuAseella(PlatformCharacter pelaaja)
243    {
244        if (!pelaaja.IsDestroyed)
245        {
246            PhysicsObject ammus = pelaaja.Weapon.Shoot();
247
248            if (ammus != null)
249            {
250                //ammus.Size *= 3;
251                //ammus.Image = ...
252                ammus.MaximumLifetime = TimeSpan.FromSeconds(2.0);
253            }
254        }
255    }
256
257
258    void LisaaNappaimet()
259    {
260        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
261        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
262
263        Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, -nopeus);
264        Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, nopeus);
265
266        Keyboard.Listen(Key.Up, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
267        Keyboard.Listen(Key.Space, ButtonState.Down, AmmuAseella, "Ammu", pelaaja1);
268
269        ControllerOne.Listen(Button.Back, ButtonState.Pressed, Exit, "Poistu pelistä");
270
271        ControllerOne.Listen(Button.DPadLeft, ButtonState.Down, Liikuta, "Pelaaja liikkuu vasemmalle", pelaaja1, -nopeus);
272        ControllerOne.Listen(Button.DPadRight, ButtonState.Down, Liikuta, "Pelaaja liikkuu oikealle", pelaaja1, nopeus);
273        ControllerOne.Listen(Button.A, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
274
275        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
276    }
277
278    void Liikuta(PlatformCharacter hahmo, double nopeus)
279    {
280        hahmo.Walk(nopeus);
281    }
282   
283
284
285    void Hyppaa(PlatformCharacter hahmo, double nopeus)
286    {
287        hahmo.Jump(nopeus);
288    }
289
290
291    void Tormaaviholliseen(PhysicsObject hahmo, PhysicsObject vihollinen)
292    {
293        elamaLaskuri.Value--;
294        osumisaani.Play();
295    }
296
297
298    void LuoAlien()
299    {
300        Vihu vihollinen = new Vihu(20, 100, 150);
301        vihollinen.ElamaLaskuri.LowerLimit += delegate
302        {
303            vihollinen.Destroy();
304            vihut.Remove(vihollinen as Vihu);
305            pisteLaskuri.Value += 20;
306        };
307        vihollinen.Image = AlienKuva;
308        vihollinen.CollisionIgnoreGroup = 1;
309        vihollinen.X = Level.Right - 100;
310        vihollinen.Tag = "vihollinen";
311        Add(vihollinen);
312
313        vihut.Add(vihollinen);
314
315        vihollinen.Animation = AlienKavely;
316        vihollinen.Animation.FPS = 5;
317        vihollinen.Animation.Start();
318        //vihollinen.AnimWalk = OrkinKavely;
319        //vihollinen.PlayAnimation(OrkinKavely);
320
321        PlatformWandererBrain tasoAivot = new PlatformWandererBrain();
322        tasoAivot.Speed = 100;
323        tasoAivot.FallsOffPlatforms = true;
324        tasoAivot.TriesToJump = true;
325
326        vihollinen.Brain = tasoAivot;
327    }
328
329
330    void LuoOrkki()
331    {
332        Vihu vihollinen = new Vihu(10, 200, 200);
333        vihollinen.ElamaLaskuri.LowerLimit += delegate
334        {
335            vihollinen.Destroy();
336            vihut.Remove(vihollinen as Vihu);
337            pisteLaskuri.Value += 10;
338        };
339        vihollinen.Image = Orkkikuva;
340        vihollinen.CollisionIgnoreGroup = 1;
341        vihollinen.X = Level.Right - 100;
342        vihollinen.Tag = "vihollinen";
343        Add(vihollinen);
344
345        vihut.Add(vihollinen);
346
347        vihollinen.Animation = OrkinKavely;
348        vihollinen.Animation.FPS = 5;
349        vihollinen.Animation.Start();
350        //vihollinen.AnimWalk = OrkinKavely;
351        //vihollinen.PlayAnimation(OrkinKavely);
352
353        PlatformWandererBrain tasoAivot = new PlatformWandererBrain();
354        tasoAivot.Speed = 100;
355        tasoAivot.FallsOffPlatforms = true;
356        tasoAivot.TriesToJump = true;
357
358        vihollinen.Brain = tasoAivot;
359    }
360    void Luovihollinen()
361    {
362        Vihu vihollinen = new Vihu(3, 100, 100);
363        vihollinen.ElamaLaskuri.LowerLimit += delegate {
364            vihollinen.Destroy();
365            vihut.Remove(vihollinen as Vihu);
366            pisteLaskuri.Value += 5;
367        };
368        vihollinen.Image = monsteri;
369        vihollinen.CollisionIgnoreGroup = 1;
370        vihollinen.X = Level.Right - 40;
371        vihollinen.Tag = "vihollinen";
372        Add(vihollinen);
373
374        vihut.Add(vihollinen);
375
376        vihollinen.Animation = MonsteriKavely;
377        vihollinen.Animation.FPS = 5;
378        vihollinen.Animation.Start();
379
380        PlatformWandererBrain tasoAivot = new PlatformWandererBrain();
381        tasoAivot.Speed = 100;
382        tasoAivot.FallsOffPlatforms = true;
383        tasoAivot.TriesToJump = true;
384
385        vihollinen.Brain = tasoAivot;
386    }
387    void LuoElamaLaskuri()
388    {
389        elamaLaskuri = new DoubleMeter(20);
390        elamaLaskuri.MaxValue = 20;
391        elamaLaskuri.LowerLimit += ElamaLoppui;
392
393        ProgressBar elamaPalkki = new ProgressBar(150, 20);
394        elamaPalkki.X = Screen.Left + 150;
395        elamaPalkki.Y = Screen.Top - 20;
396        elamaPalkki.BindTo(elamaLaskuri);
397        Add(elamaPalkki);
398    }
399    void LuoElamaLaskuri2()
400    {
401        elamaLaskuri2 = new DoubleMeter(20);
402        elamaLaskuri2.MaxValue = 20;
403        elamaLaskuri2.LowerLimit += ElamaLoppui;
404
405        ProgressBar elamaPalkki = new ProgressBar(150, 20);
406        elamaPalkki.X = Screen.Right - 150;
407        elamaPalkki.Y = Screen.Top - 20;
408        elamaPalkki.BindTo(elamaLaskuri2);
409        Add(elamaPalkki);
410    }
411
412
413    void ElamaLoppui()
414    {
415        MessageDisplay.Add("Elämät loppuivat.");
416        pelaaja1.Destroy();
417    }
418
419
420    IntMeter pisteLaskuri;
421
422    void LuoPistelaskuri()
423    {
424        pisteLaskuri = new IntMeter(0);
425
426        Label pisteNaytto = new Label();
427        pisteNaytto.X = Screen.Left + 100;
428        pisteNaytto.Y = Screen.Top - 100;
429        pisteNaytto.TextColor = Color.Black;
430        pisteNaytto.Color = Color.White;
431
432        pisteNaytto.BindTo(pisteLaskuri);
433        Add(pisteNaytto);
434    }
435
436    void AloitaAalto()
437    {
438        int kier = 20 / kieorrokset;
439
440        Timer ajastin = new Timer();
441        ajastin.Interval = RandomGen.NextDouble(3.0, 5.0);
442        ajastin.Timeout += Luovihollinen;
443        ajastin.Start();
444
445        Timer ajastin2 = new Timer();
446        ajastin2.Interval = RandomGen.NextDouble(6.0, 8.0);
447        ajastin2.Timeout += LuoOrkki;
448        ajastin2.Start();
449
450        Timer ajastin3 = new Timer();
451        ajastin3.Interval = RandomGen.NextDouble(9.0, 12.0);
452        ajastin3.Timeout += LuoAlien;
453        ajastin3.Start();
454
455        if (alaspainLaskuri==null) LuoAaltoAikaLaskuri();
456        else
457        {
458            alaspainLaskuri.Value = MAX_KIERROSAIKA / kieorrokset;
459            aaltoAikaLaskuri.Start();
460        }
461        Timer.SingleShot(MAX_KIERROSAIKA / kieorrokset, delegate { ajastin.Stop(); ajastin2.Stop(); ajastin3.Stop(); TarkistaLoppu(); });
462    }
463
464
465    void LuoAaltoPalkki()
466    {
467        aaltoPalkki = new DoubleMeter(20);
468        aaltoPalkki.MaxValue = 20;
469        aaltoPalkki.LowerLimit += AloitaAalto;
470
471        aaltoNaytto = new ProgressBar(150, 20);
472        aaltoNaytto.X = 0;
473        aaltoNaytto.Y = Screen.Top - 20;
474        aaltoNaytto.BindTo(aaltoPalkki);
475        Add(aaltoNaytto);
476    }
477
478    void LuoAaltoAikaLaskuri()
479    {
480        alaspainLaskuri = new DoubleMeter(MAX_KIERROSAIKA / kieorrokset);
481
482        aaltoAikaLaskuri = new Timer();
483        aaltoAikaLaskuri.Interval = 0.1;
484        aaltoAikaLaskuri.Timeout += LaskeAlaspain;
485        aaltoAikaLaskuri.Start();
486
487        Label aikaNaytto = new Label();
488        aikaNaytto.TextColor = Color.White;
489        aikaNaytto.DecimalPlaces = 1;
490        aikaNaytto.X = 0;
491        aikaNaytto.Y = Screen.Top - 50;
492        aikaNaytto.BindTo(alaspainLaskuri);
493        Add(aikaNaytto);
494    }
495
496    void LaskeAlaspain()
497    {
498        alaspainLaskuri.Value -= 0.1;
499
500        if (alaspainLaskuri.Value <= 0)
501        {
502            MessageDisplay.Add("Aika loppui...");
503            aaltoAikaLaskuri.Stop();
504
505            // täydennä mitä tapahtuu, kun aika loppuu
506        }
507    }
508
509
510    void TarkistaLoppu()
511    {
512        Timer tarkistaja = new Timer();
513        tarkistaja.Interval = 0.5;
514        tarkistaja.Timeout += delegate { if (vihut.Count <= 0) { tarkistaja.Stop(); AaltoLoppui(); } };
515        tarkistaja.Start();
516    }
517
518
519    void AaltoLoppui()
520    {
521        kieorrokset--;
522        aaltoPalkki.Value = 20;
523        Timer aaltoLaskuri = new Timer();
524        aaltoLaskuri.Interval = 0.1;
525        aaltoLaskuri.Timeout += delegate { aaltoPalkki.Value--; MessageDisplay.Add("Moi"); };
526        aaltoLaskuri.Start(20);
527    }
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551}
Note: See TracBrowser for help on using the repository browser.