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

Revision 5454, 25.7 KB checked in by jumaalku, 7 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
62class Tykki : PhysicsObject
63{
64    public int taso = 1;
65    public AssaultRifle ase;
66    private IntMeter elamaLaskuri;
67    public IntMeter ElamaLaskuri { get { return elamaLaskuri; } }
68
69    public Tykki(double leveys, double korkeus, int elama)
70        : base(leveys, korkeus)
71    {
72        elamaLaskuri = new IntMeter(elama, 0, elama);
73
74    }
75
76}
77
78public class Avaruuspeli : PhysicsGame
79{
80    private Animation OrkinKavely;
81    private Animation MonsteriKavely;
82    private Animation AlienKavely;
83
84    const double nopeus = 200;
85    const double hyppyNopeus = 750;
86    const int RUUDUN_KOKO = 40;
87
88    private int kieorrokset = 10;
89    DoubleMeter aaltoPalkki;
90    ProgressBar aaltoNaytto;
91    DoubleMeter alaspainLaskuri;
92    Timer aaltoAikaLaskuri;
93    private const int MAX_KIERROSAIKA = 300;
94
95    List<Timer> aseidenAjastimet = new List<Timer>();
96
97    List<Vihu> vihut = new List<Vihu>();
98
99    private Image[] Avaruuskävely = LoadImages("Avaruus saankari", "Avaruus saankari2");
100    private Image[] Monsterinkavelykuvat = LoadImages("Monsteri", "Monsteri2");
101    private Image[] Alienkavelykuvat = LoadImages("Alien", "Alien2");
102
103    PlatformCharacter pelaaja2;
104    PlatformCharacter pelaaja1;
105
106
107    Image Tulikuva = LoadImage("tuli");
108    Image AlienKuva = LoadImage("Alien");
109    Image Orkkikuva = LoadImage("Orkki");
110    Image monsteri = LoadImage("Monsteri");
111    Image flamerkuva = LoadImage("Flamer");
112    Image Estekuva = LoadImage("Este");
113    Image Automaattikuva = LoadImage("Automaattitykki");
114
115    Image Robo = LoadImage("Robot");
116    Image pelaajanKuva = LoadImage("Avaruus saankari");
117    Image taustakuva = LoadImage("scifi hallway space ship model interior");
118    SoundEffect maaliAani = LoadSoundEffect("maali");
119    DoubleMeter elamaLaskuri;
120    DoubleMeter elamaLaskuri2;
121    SoundEffect osumisaani = LoadSoundEffect("Hit_Hurt2");
122
123    List<PushButton> painonapit = new List<PushButton>();
124    Label menuHelperNaytto;
125    private PhysicsObject seurattava;
126    bool ollaanRakentamassa = false;
127
128    PushButton menuNappi;
129
130    public override void Begin()
131    {
132        SmoothTextures = false;
133        IsMouseVisible = true;
134        MediaPlayer.Play("musiikki");
135        MediaPlayer.IsRepeating = true;
136        OrkinKavely = LoadAnimation("Orkki liikkuu");
137        MonsteriKavely = new Animation(Monsterinkavelykuvat);
138        AlienKavely = new Animation(Alienkavelykuvat);
139
140        MultiSelectWindow alkuValikko = new MultiSelectWindow("Spaceship madness", "Aloita peli", "Parhaat pisteet", "Lopeta");
141        Add(alkuValikko);
142        alkuValikko.AddItemHandler(0, pelaajienvalinta);
143        //alkuValikko.AddItemHandler(1, ParhaatPisteet);
144        alkuValikko.AddItemHandler(2, Exit);
145    }
146
147    void HiirenLiikutus(AnalogState tila)
148    {
149        if (ollaanRakentamassa)
150        {
151            seurattava.Position = Mouse.PositionOnWorld;
152        }
153    }
154
155    void HiirenKlikkaus()
156    {
157        if (ollaanRakentamassa)
158        {
159            AssaultRifle ase = new AssaultRifle(30, 30);
160            ase.IsVisible = false;
161            ase.FireRate = 2;
162            ase.ProjectileCollision = AmmusOsui;
163            seurattava.Add(ase);
164            seurattava.IgnoresCollisionResponse = false;
165            (seurattava as Tykki).ase = ase;
166            if (seurattava.Tag.Equals("flamer"))
167            {
168                Timer aseenAjastin = new Timer();
169                aseenAjastin.Interval = 0.1;
170                aseenAjastin.Timeout += delegate
171                {
172
173
174                    //List<GameObject> vihut = GetObjectsWithTag("vihollinen");
175                    //var vihut = vihulista;
176                    //if (vihut == null || vihut.Count == 0) return;
177                    //
178                    //double etäisyys = Vector.Distance(ase.AbsolutePosition, vihut[0].Position);
179                    //if (etäisyys > 400) return;
180                    //
181                    ////vihut.Sort((a, b) => Vector.Distance(a.Position, ase.AbsolutePosition) > Vector.Distance(b.Position, ase.AbsolutePosition) ? 1 : -1);
182                    //vihut.Sort((a, b) => JarjestaVihut(ase, a, b));
183                    //ase.Angle = (vihut[0].Position - ase.AbsolutePosition).Angle;
184
185
186                    PhysicsObject ammus = ase.Shoot();
187
188                    if (ammus != null)
189                    {
190                        ammus.Image = Tulikuva;
191                        ammus.Size *= 3;
192                        ammus.CollisionIgnoreGroup = 3;
193                       
194                        //ammus.Image = cannonballKuva;
195                        ammus.MaximumLifetime = TimeSpan.FromSeconds(2.0);
196                    }
197
198                    if (ase.Parent != null && ase.Parent.IsDestroyed)
199                        aseenAjastin.Stop();
200                };
201                aseenAjastin.Start();
202
203                aseidenAjastimet.Add(aseenAjastin);
204
205                ollaanRakentamassa = false;
206                seurattava = null;
207            }
208
209
210
211            else if (seurattava.Tag.Equals("automaattiTykki"))
212            {
213                Timer aseenAjastin = new Timer();
214                aseenAjastin.Interval = 0.5;
215                aseenAjastin.Timeout += delegate
216                {
217
218
219                    //List<GameObject> vihut = GetObjectsWithTag("vihollinen");
220                    //var vihut = vihulista;
221                    //if (vihut == null || vihut.Count == 0) return;
222                    //
223                    //double etäisyys = Vector.Distance(ase.AbsolutePosition, vihut[0].Position);
224                    //if (etäisyys > 400) return;
225                    //
226                    ////vihut.Sort((a, b) => Vector.Distance(a.Position, ase.AbsolutePosition) > Vector.Distance(b.Position, ase.AbsolutePosition) ? 1 : -1);
227                    //vihut.Sort((a, b) => JarjestaVihut(ase, a, b));
228                    //ase.Angle = (vihut[0].Position - ase.AbsolutePosition).Angle;
229                    PhysicsObject ammus = ase.Shoot();
230
231                    if (ammus != null)
232                    {
233                        ammus.Size *= 0.5;
234                        ammus.CollisionIgnoreGroup = 3;
235                       
236                        //ammus.Image = cannonballKuva;
237                        ammus.MaximumLifetime = TimeSpan.FromSeconds(2.0);
238                    }
239
240                    if (ase.Parent != null && ase.Parent.IsDestroyed)
241                        aseenAjastin.Stop();
242                };
243                aseenAjastin.Start();
244
245                aseidenAjastimet.Add(aseenAjastin);
246
247                ollaanRakentamassa = false;
248                seurattava = null;
249            }
250        }
251
252    }
253
254    void AnnaAse(double leveys, double korkeus, int hinta, Image kuva, string tyyppi)
255    {
256        if (ollaanRakentamassa) return;
257        if (hinta > pisteLaskuri.Value) { MessageDisplay.Add("Ei tarpeeksi pisteitä!"); return; }
258        pisteLaskuri.Value -= hinta;
259
260        Tykki tykki = new Tykki(leveys, korkeus, 30);
261        tykki.MakeStatic();
262
263        tykki.ElamaLaskuri.LowerLimit += delegate
264        {
265            tykki.Destroy();
266        };
267
268        tykki.Color = Color.Black;
269        tykki.Image = kuva;
270        tykki.CanRotate = false;
271        tykki.IgnoresCollisionResponse = true;
272        tykki.Position = Mouse.PositionOnScreen;
273        tykki.IgnoresGravity = true;
274        tykki.Tag = tyyppi;
275        ollaanRakentamassa = true;
276        tykki.CollisionIgnoreGroup = 3;
277        seurattava = tykki;
278        Add(tykki, 3);
279        AddCollisionHandler(tykki, "vihollinen", VahingoitaAsetta);
280    }
281
282
283    void VahingoitaAsetta(PhysicsObject tykki, PhysicsObject kohde)
284    {
285        if (kohde.Tag.Equals("vihollinen"))
286        {
287            (tykki as Tykki).ElamaLaskuri.Value--;
288            MessageDisplay.Add("Au");
289            if ((tykki as Tykki).ElamaLaskuri.Value <= 0) tykki.Destroy();
290        }
291    }
292
293
294    void LuoTykkiNappula(Vector paikka, double leveys, double korkeus, Image rakennusKuva, int hinta, int rakennusKoko)
295    {
296        menuNappi = new PushButton(leveys * 2, korkeus * 2, rakennusKuva);
297        menuNappi.Position = paikka;
298        menuNappi.Clicked += new Action(() => AnnaAse(rakennusKoko, rakennusKoko, hinta, rakennusKuva, "automaattiTykki"));
299        Add(menuNappi);
300        Mouse.ListenMovement(1.0, delegate
301        {
302            if (Mouse.IsCursorOn(menuNappi))
303            {
304                menuHelperNaytto.IsVisible = true;
305                menuHelperNaytto.Text = "Ase, " + hinta + " pistettä";
306                menuHelperNaytto.Position = Mouse.PositionOnScreen + new Vector(menuHelperNaytto.Width / 2 + 10, 0);
307            }
308
309        }, null
310            );
311    }
312
313    int JarjestaVihut(AssaultRifle ase, GameObject a, GameObject b)
314    {
315        if (a == null || b == null) return 0;
316        return Vector.Distance(a.Position, ase.AbsolutePosition) > Vector.Distance(b.Position, ase.AbsolutePosition) ? 1 : -1;
317    }
318
319    void LuoAseNappula(Vector paikka, double leveys, double korkeus, Image rakennusKuva, int hinta, int rakennusKoko)
320    {
321        menuNappi = new PushButton(leveys * 2, korkeus * 2, flamerkuva);
322        menuNappi.Position = new Vector(0, (Screen.Bottom + 30));
323        menuNappi.Clicked += new Action(() => AnnaAse(rakennusKoko, rakennusKoko, hinta, rakennusKuva, "flamer"));
324        Add(menuNappi);
325        Mouse.ListenMovement(1.0, delegate
326        {
327            if (Mouse.IsCursorOn(menuNappi))
328            {
329                menuHelperNaytto.IsVisible = true;
330                menuHelperNaytto.Text = "Ase, " + hinta + " pistettä";
331                menuHelperNaytto.Position = Mouse.PositionOnScreen + new Vector(menuHelperNaytto.Width / 2 + 10, 0);
332            }
333
334        }, null
335            );
336    }
337
338    void pelaajienvalinta()
339    {
340        MultiSelectWindow alkuValikko = new MultiSelectWindow("Spaceship madness", "yksi pelaaja", "kaksi pelaajaa");
341        Add(alkuValikko);
342        alkuValikko.AddItemHandler(0, Aloitapeli, 1);
343        alkuValikko.AddItemHandler(1, Aloitapeli, 2);
344    }
345
346    void Aloitapeli(int pelaajienLkm)
347    {
348        Gravity = new Vector(0, -1000);
349        SmoothTextures = false;
350
351
352        if (pelaajienLkm == 1)
353        {
354            LuoKentta();
355        }
356        else
357        {
358            LuoKentta2();
359            LuoElamaLaskuri2();
360        }
361        LisaaNappaimet();
362        LuoElamaLaskuri();
363        LuoPistelaskuri();
364        LuoAaltoPalkki();
365        AaltoLoppui();
366
367        LuoMenu();
368        LuoAseNappula(new Vector(80, (Screen.Bottom + 35)), 40, 40, flamerkuva, 200, 100);
369        LuoTykkiNappula(new Vector(-80, (Screen.Bottom + 35)), 40, 40, Automaattikuva, 300, 100);
370
371        Camera.Follow(pelaaja1);
372        Camera.ZoomFactor = 1.2;
373        Camera.StayInLevel = true;
374
375        Mouse.ListenMovement(1.0, HiirenLiikutus, null);
376
377        Mouse.Listen(MouseButton.Left, ButtonState.Pressed, HiirenKlikkaus, null);
378        Mouse.ListenMovement(1.0, delegate
379        {
380            if (!Mouse.IsCursorOn(menuNappi))
381                menuHelperNaytto.IsVisible = false;
382
383            //    List<Torni> tornit = GetObjectsWithTag("torni").Cast<Torni>().ToList();
384            //    foreach (Torni torni in tornit)
385            //    {
386            //        if (Mouse.IsCursorOn(torni))
387            //        {
388            //            menuHelperNaytto.IsVisible = true;
389            //            menuHelperNaytto.Text = "Torni, " + torni.taso;
390            //            menuHelperNaytto.Position = Mouse.PositionOnScreen + new Vector(menuHelperNaytto.Width / 2 + 10, 0);
391            //        }
392            //    }
393        }, null);
394    }
395
396    void LuoMenu()
397    {
398        menuHelperNaytto = new Label("");
399        menuHelperNaytto.XMargin = 7.0;
400        menuHelperNaytto.YMargin = 7.0;
401        menuHelperNaytto.Color = new Color(0, 0, 0, 100);
402        menuHelperNaytto.TextColor = Color.White;
403        menuHelperNaytto.IsVisible = false;
404        Add(menuHelperNaytto);
405    }
406
407    void LuoKentta()
408    {
409        TileMap kentta = TileMap.FromLevelAsset("kentta1");
410        kentta.SetTileMethod('#', LisaaTaso);
411
412
413        kentta.SetTileMethod('N', LisaaPelaaja);
414        kentta.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
415        Level.CreateBorders();
416        Level.Background.Image = taustakuva;
417        Level.Background.ScaleToLevelByHeight();
418    }
419    void LuoKentta2()
420    {
421        TileMap kentta = TileMap.FromLevelAsset("kentta1");
422        kentta.SetTileMethod('#', LisaaTaso);
423
424        kentta.SetTileMethod('M', LisaaPelaaja2);
425        kentta.SetTileMethod('N', LisaaPelaaja);
426        kentta.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
427        Level.CreateBorders();
428        Level.Background.Image = taustakuva;
429        Level.Background.ScaleToLevelByHeight();
430    }
431    void LisaaTaso(Vector paikka, double leveys, double korkeus)
432    {
433        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
434        taso.Position = paikka;
435        taso.Color = Color.Transparent;
436        Add(taso);
437    }
438
439
440
441    void LisaaPelaaja(Vector paikka, double leveys, double korkeus)
442    {
443        pelaaja1 = new PlatformCharacter(leveys * 3, korkeus * 3);
444        pelaaja1.Position = paikka;
445        pelaaja1.Mass = 4.0;
446        pelaaja1.Image = pelaajanKuva;
447        Add(pelaaja1);
448        AddCollisionHandler(pelaaja1, "vihollinen", Tormaaviholliseen);
449
450        pelaaja1.CollisionIgnoreGroup = 3;
451
452        pelaaja1.AnimWalk = new Animation(Avaruuskävely);
453        pelaaja1.AnimIdle = new Animation(pelaajanKuva);
454        pelaaja1.AnimWalk.FPS = 5;
455
456        //inventory = new Inventory();
457        //inventory.Y = Screen.Bottom+50;
458        //Add(inventory);
459
460        //inventory.AddItem(null, );
461        //inventory.AddItem(null, flamerkuva);
462
463        pelaaja1.Weapon = new AssaultRifle(30, 10);
464        pelaaja1.Weapon.Ammo.Value = 100000;
465        pelaaja1.Weapon.ProjectileCollision = AmmusOsui;
466
467        //inventory.AddItem(, flamerkuva);
468
469    }
470    void LisaaPelaaja2(Vector paikka, double leveys, double korkeus)
471    {
472        pelaaja2 = new PlatformCharacter(leveys * 3, korkeus * 3);
473        pelaaja2.Position = paikka;
474        pelaaja2.Mass = 4.0;
475        pelaaja2.Image = pelaajanKuva;
476        Add(pelaaja2);
477        AddCollisionHandler(pelaaja2, "vihollinen", Tormaaviholliseen);
478
479        pelaaja2.CollisionIgnoreGroup = 3;
480
481        pelaaja2.AnimWalk = new Animation(Avaruuskävely);
482        pelaaja2.AnimIdle = new Animation(pelaajanKuva);
483        pelaaja2.AnimWalk.FPS = 5;
484
485        pelaaja2.Weapon = new AssaultRifle(30, 10);
486        pelaaja2.Weapon.Ammo.Value = 1000;
487        pelaaja2.Weapon.ProjectileCollision = AmmusOsui;
488    }
489
490    void AmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
491    {
492        ammus.Destroy();
493        if (kohde.Tag.Equals("vihollinen"))
494        {
495            (kohde as Vihu).ElamaLaskuri.Value--;
496            osumisaani.Play();
497
498        }
499    }
500
501    void AmmuAseella(PlatformCharacter pelaaja)
502    {
503        if (!pelaaja.IsDestroyed)
504        {
505            PhysicsObject ammus = pelaaja.Weapon.Shoot();
506
507            if (ammus != null)
508            {
509                //ammus.Size *= 3;
510                //ammus.Image = ...
511                ammus.CollisionIgnoreGroup = 3;
512                ammus.MaximumLifetime = TimeSpan.FromSeconds(2.0);
513            }
514        }
515    }
516
517
518    void LisaaNappaimet()
519    {
520        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
521        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
522
523        Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, -nopeus);
524        Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, nopeus);
525
526        Keyboard.Listen(Key.Up, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
527        Keyboard.Listen(Key.Space, ButtonState.Down, AmmuAseella, "Ammu", pelaaja1);
528
529        if (pelaaja2 != null)
530        {
531            Keyboard.Listen(Key.A, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja2, -nopeus);
532            Keyboard.Listen(Key.D, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja2, nopeus);
533
534            Keyboard.Listen(Key.W, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja2, hyppyNopeus);
535            Keyboard.Listen(Key.LeftShift, ButtonState.Down, AmmuAseella, "Ammu", pelaaja2);
536        }
537
538        ControllerOne.Listen(Button.Back, ButtonState.Pressed, Exit, "Poistu pelistä");
539
540        ControllerOne.Listen(Button.DPadLeft, ButtonState.Down, Liikuta, "Pelaaja liikkuu vasemmalle", pelaaja1, -nopeus);
541        ControllerOne.Listen(Button.DPadRight, ButtonState.Down, Liikuta, "Pelaaja liikkuu oikealle", pelaaja1, nopeus);
542        ControllerOne.Listen(Button.A, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
543
544        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
545    }
546
547    void Liikuta(PlatformCharacter hahmo, double nopeus)
548    {
549        hahmo.Walk(nopeus);
550    }
551
552
553
554    void Hyppaa(PlatformCharacter hahmo, double nopeus)
555    {
556        hahmo.Jump(nopeus);
557    }
558
559
560    void Tormaaviholliseen(PhysicsObject hahmo, PhysicsObject vihollinen)
561    {
562        if (hahmo == pelaaja1)
563        {
564            elamaLaskuri.Value--;
565        }
566        else
567        {
568            elamaLaskuri2.Value--;
569        }
570
571        osumisaani.Play();
572    }
573
574
575    void LuoAlien()
576    {
577        Vihu vihollinen = new Vihu(20, 100, 120);
578        vihollinen.ElamaLaskuri.LowerLimit += delegate
579        {
580            vihollinen.Destroy();
581            vihut.Remove(vihollinen as Vihu);
582            pisteLaskuri.Value += 20;
583        };
584        vihollinen.Image = AlienKuva;
585        vihollinen.CollisionIgnoreGroup = 1;
586        vihollinen.X = Level.Right - 100;
587        vihollinen.Tag = "vihollinen";
588        Add(vihollinen, 3);
589
590        vihut.Add(vihollinen);
591
592        vihollinen.Animation = AlienKavely;
593        vihollinen.Animation.FPS = 5;
594        vihollinen.Animation.Start();
595        //vihollinen.AnimWalk = OrkinKavely;
596        //vihollinen.PlayAnimation(OrkinKavely);
597
598        PlatformWandererBrain tasoAivot = new PlatformWandererBrain();
599        tasoAivot.Speed = 100;
600        tasoAivot.FallsOffPlatforms = true;
601        tasoAivot.TriesToJump = true;
602
603        vihollinen.Brain = tasoAivot;
604    }
605
606
607    void LuoOrkki()
608    {
609        Vihu vihollinen = new Vihu(12, 200, 200);
610        vihollinen.ElamaLaskuri.LowerLimit += delegate
611        {
612            vihollinen.Destroy();
613            vihut.Remove(vihollinen as Vihu);
614            pisteLaskuri.Value += 10;
615        };
616        vihollinen.Image = Orkkikuva;
617        vihollinen.CollisionIgnoreGroup = 1;
618        vihollinen.X = Level.Right - 100;
619        vihollinen.Tag = "vihollinen";
620        Add(vihollinen, 2);
621
622        vihut.Add(vihollinen);
623
624        vihollinen.Animation = OrkinKavely;
625        vihollinen.Animation.FPS = 5;
626        vihollinen.Animation.Start();
627        //vihollinen.AnimWalk = OrkinKavely;
628        //vihollinen.PlayAnimation(OrkinKavely);
629
630        PlatformWandererBrain tasoAivot = new PlatformWandererBrain();
631        tasoAivot.Speed = 100;
632        tasoAivot.FallsOffPlatforms = true;
633        tasoAivot.TriesToJump = true;
634
635        vihollinen.Brain = tasoAivot;
636    }
637    void Luovihollinen()
638    {
639        Vihu vihollinen = new Vihu(6, 100, 100);
640        vihollinen.ElamaLaskuri.LowerLimit += delegate
641        {
642            vihollinen.Destroy();
643            vihut.Remove(vihollinen as Vihu);
644            pisteLaskuri.Value += 5;
645        };
646        vihollinen.Image = monsteri;
647        vihollinen.CollisionIgnoreGroup = 1;
648        vihollinen.X = Level.Right - 40;
649        vihollinen.Tag = "vihollinen";
650        Add(vihollinen);
651
652        vihut.Add(vihollinen);
653
654        vihollinen.Animation = MonsteriKavely;
655        vihollinen.Animation.FPS = 5;
656        vihollinen.Animation.Start();
657
658        PlatformWandererBrain tasoAivot = new PlatformWandererBrain();
659        tasoAivot.Speed = 100;
660        tasoAivot.FallsOffPlatforms = true;
661        tasoAivot.TriesToJump = true;
662
663        vihollinen.Brain = tasoAivot;
664    }
665    void LuoElamaLaskuri()
666    {
667        elamaLaskuri = new DoubleMeter(20);
668        elamaLaskuri.MaxValue = 20;
669        elamaLaskuri.LowerLimit += ElamaLoppui;
670
671        ProgressBar elamaPalkki = new ProgressBar(150, 20);
672        elamaPalkki.X = Screen.Left + 150;
673        elamaPalkki.Y = Screen.Top - 20;
674        elamaPalkki.BindTo(elamaLaskuri);
675        Add(elamaPalkki);
676    }
677    void LuoElamaLaskuri2()
678    {
679        elamaLaskuri2 = new DoubleMeter(20);
680        elamaLaskuri2.MaxValue = 20;
681        elamaLaskuri2.LowerLimit += ElamaLoppui2;
682
683        ProgressBar elamaPalkki = new ProgressBar(150, 20);
684        elamaPalkki.X = Screen.Right - 150;
685        elamaPalkki.Y = Screen.Top - 20;
686        elamaPalkki.BindTo(elamaLaskuri2);
687        Add(elamaPalkki);
688    }
689
690
691    void ElamaLoppui()
692    {
693        MessageDisplay.Add("Elämät loppuivat.");
694        pelaaja1.Destroy();
695    }
696
697    void ElamaLoppui2()
698    {
699        MessageDisplay.Add("Elämät loppuivat.");
700        pelaaja2.Destroy();
701    }
702
703    IntMeter pisteLaskuri;
704
705    void LuoPistelaskuri()
706    {
707        pisteLaskuri = new IntMeter(500);
708
709        Label pisteNaytto = new Label();
710        pisteNaytto.X = Screen.Left + 100;
711        pisteNaytto.Y = Screen.Top - 100;
712        pisteNaytto.TextColor = Color.Black;
713        pisteNaytto.Color = Color.White;
714
715        pisteNaytto.BindTo(pisteLaskuri);
716        Add(pisteNaytto);
717    }
718
719    void AloitaAalto()
720    {
721        foreach (Timer aika in aseidenAjastimet)
722        {
723            aika.Start();
724        }
725
726        Timer ajastin = new Timer();
727        ajastin.Interval = RandomGen.NextDouble(3.0, 5.0);
728        ajastin.Timeout += Luovihollinen;
729        ajastin.Start();
730
731        Timer ajastin2 = new Timer();
732        ajastin2.Interval = RandomGen.NextDouble(6.0, 8.0);
733        ajastin2.Timeout += LuoOrkki;
734        ajastin2.Start();
735
736        Timer ajastin3 = new Timer();
737        ajastin3.Interval = RandomGen.NextDouble(9.0, 12.0);
738        ajastin3.Timeout += LuoAlien;
739        ajastin3.Start();
740
741        if (alaspainLaskuri == null) LuoAaltoAikaLaskuri();
742        else
743        {
744            alaspainLaskuri.Value = MAX_KIERROSAIKA / kieorrokset;
745            aaltoAikaLaskuri.Start();
746        }
747        Timer.SingleShot(MAX_KIERROSAIKA / kieorrokset, delegate { ajastin.Stop(); ajastin2.Stop(); ajastin3.Stop(); TarkistaLoppu(); });
748    }
749
750
751    void LuoAaltoPalkki()
752    {
753        aaltoPalkki = new DoubleMeter(20);
754        aaltoPalkki.MaxValue = 20;
755        aaltoPalkki.LowerLimit += AloitaAalto;
756
757        aaltoNaytto = new ProgressBar(150, 20);
758        aaltoNaytto.X = 0;
759        aaltoNaytto.Y = Screen.Top - 20;
760        aaltoNaytto.BindTo(aaltoPalkki);
761        Add(aaltoNaytto);
762    }
763
764    void LuoAaltoAikaLaskuri()
765    {
766        alaspainLaskuri = new DoubleMeter(MAX_KIERROSAIKA / kieorrokset);
767
768        aaltoAikaLaskuri = new Timer();
769        aaltoAikaLaskuri.Interval = 0.1;
770        aaltoAikaLaskuri.Timeout += LaskeAlaspain;
771        aaltoAikaLaskuri.Start();
772
773        Label aikaNaytto = new Label();
774        aikaNaytto.TextColor = Color.White;
775        aikaNaytto.DecimalPlaces = 1;
776        aikaNaytto.X = 0;
777        aikaNaytto.Y = Screen.Top - 50;
778        aikaNaytto.BindTo(alaspainLaskuri);
779        Add(aikaNaytto);
780    }
781
782    void LaskeAlaspain()
783    {
784        alaspainLaskuri.Value -= 0.1;
785
786        if (alaspainLaskuri.Value <= 0)
787        {
788            MessageDisplay.Add("Aika loppui...");
789            aaltoAikaLaskuri.Stop();
790
791            // täydennä mitä tapahtuu, kun aika loppuu
792        }
793    }
794
795
796    void TarkistaLoppu()
797    {
798        Timer tarkistaja = new Timer();
799        tarkistaja.Interval = 0.5;
800        tarkistaja.Timeout += delegate { if (vihut.Count <= 0) { tarkistaja.Stop(); AaltoLoppui(); } };
801        tarkistaja.Start();
802    }
803
804
805    void AaltoLoppui()
806    {
807        foreach (Timer ajastin in aseidenAjastimet)
808        {
809            ajastin.Pause();
810        }
811
812        kieorrokset--;
813        aaltoPalkki.Value = 20;
814        Timer aaltoLaskuri = new Timer();
815        aaltoLaskuri.Interval = 0.1;
816        aaltoLaskuri.Timeout += delegate { aaltoPalkki.Value--; };
817        aaltoLaskuri.Start(20);
818    }
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842}
Note: See TracBrowser for help on using the repository browser.