source: 2011/23/iltakuop/Blocks/Blocks/Blocks/Lisättävä.cs @ 1795

Revision 1795, 20.3 KB checked in by tipan, 12 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
10class Taso2 : PhysicsObject
11{
12    public int hitPoints = 2;
13    public Taso2()
14        : base(40, 10)
15    {
16        MakeStatic();
17    }
18
19
20}
21
22//Lisättävänä pallon uudistukset, loadimage ja palloimaget sekä uudet kentät
23
24
25
26
27public class Peli : PhysicsGame
28{
29    int mailanNopeus = 600;
30    int pallonNopeus = 300;
31    int äläLuoPalloa = 0;
32    //Vector nopeusVasen = new Vector(-600, 0);
33
34    PhysicsObject pallo;
35    PhysicsObject maila;
36    PhysicsObject tnt;
37
38    PhysicsObject alaReuna;
39    int kenttäNro = 1;
40    int kenttäMäärä = 5;
41
42    int palloolemassa;
43    const int RUUDUN_KOKO = 5;
44
45    Image palloKuva = LoadImage("Pallo");
46    Image tntKuva = LoadImage("TNT");
47    Image tasoKuva = LoadImage("Palikka");
48    Image taso2Kuva = LoadImage("Vahvistettu palikka");
49    Image taso2Kuva2 = LoadImage("Vahvistettu palikka2");
50    Image tasoTuhoutumatonKuva = LoadImage("Tuhoutumaton");
51    Image tasoTuhoutumatonKuvaPysty = LoadImage("TuhoutumatonPysty");
52    Image taustaKuva = LoadImage("Taustakuva1");
53    Image taustaKuva2 = LoadImage("Taustakuva2");
54    Image taustaKuva3 = LoadImage("Taustakuva3");
55    Image mailanKuva = LoadImage("Maila");
56    int pisteet;
57    int elämät = 3;
58    int randomKentät = 0;
59    IntMeter pisteetL;
60    IntMeter elämätL;
61
62    Label päälläPois;
63
64    List<Label> valikonKohdat;
65    List<PhysicsObject> tasot = new List<PhysicsObject>();
66    List<PhysicsObject> taso2t = new List<PhysicsObject>();
67    List<PhysicsObject> tntt = new List<PhysicsObject>();
68    List<PhysicsObject> tasoTuhoutumatont = new List<PhysicsObject>();
69
70    public override void Begin()
71    {
72        Valikko();
73    }
74
75    void Valikko()
76    {
77        äläLuoPalloa = 1;
78        ClearAll();
79        Level.Background.Image = taustaKuva3;
80        Level.Background.Size = new Vector(Screen.Width, Screen.Height);
81        Camera.ZoomToLevel(1);
82
83        valikonKohdat = new List<Label>();
84
85        Label kohta1 = new Label("Aloita uusi peli");
86        kohta1.Position = new Vector(-80, 40);
87        valikonKohdat.Add(kohta1);
88
89        Label kohta2 = new Label("Asetukset");
90        kohta2.Position = new Vector(-80, -40);
91        valikonKohdat.Add(kohta2);
92
93        Label kohta3 = new Label("Lopeta");
94        kohta3.Position = new Vector(80, -40);
95        valikonKohdat.Add(kohta3);
96
97        Label kohta4 = new Label("Ohjeet");
98        kohta4.Position = new Vector(80, 40);
99        valikonKohdat.Add(kohta4);
100
101        foreach (Label valikonKohta in valikonKohdat)
102        {
103            Add(valikonKohta);
104        }
105
106        Mouse.ListenOn(kohta1, MouseButton.Left, ButtonState.Pressed, AloitaPeli, null);
107        Mouse.ListenOn(kohta2, MouseButton.Left, ButtonState.Pressed, Asetukset, null);
108        Mouse.ListenOn(kohta3, MouseButton.Left, ButtonState.Pressed, Lopeta, null);
109        Mouse.ListenOn(kohta4, MouseButton.Left, ButtonState.Pressed, Ohjeet, null);
110
111        Mouse.IsCursorVisible = true;
112        Mouse.ListenMovement(1.0, ValikossaLiikkuminen, null);
113        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Lopeta, "");
114    }
115
116    void ValikossaLiikkuminen(AnalogState hiirenTila)
117    {
118        foreach (Label kohta in valikonKohdat)
119        {
120            if (Mouse.IsCursorOn(kohta))
121            {
122                kohta.TextColor = Color.Red;
123            }
124            else
125            {
126                kohta.TextColor = Color.Black;
127            }
128
129        }
130    }
131
132    void ValikossaLiikkuminen2(AnalogState hiirenTila)
133    {
134        foreach (Label kohta in valikonKohdat)
135        {
136            if (Mouse.IsCursorOn(kohta))
137            {
138                kohta.TextColor = Color.Red;
139            }
140            else
141            {
142                kohta.TextColor = Color.White;
143            }
144
145        }
146    }
147
148
149    void AloitaPeli()
150    {
151        ClearAll();
152        äläLuoPalloa = 0;
153        nollaaPisteet();
154        LuoKenttä(1);
155        AsetaOhjaimet();
156        LisääLaskurit(3, 0);
157        AloitaPeliUudestaan();
158    }
159
160    void nollaaPisteet()
161    {
162        kenttäNro = 1;
163        pisteet = 0;
164        elämät = 3;
165    }
166
167    void Lopeta()
168    {
169        Exit();
170    }
171
172    void Ohjeet()
173    {
174
175    }
176
177    void Asetukset()
178    {
179        ClearAll();
180
181        Level.Background.Image = taustaKuva2;
182        Level.Background.Size = new Vector(Screen.Width, Screen.Height);
183        Camera.ZoomToLevel(1);
184
185        valikonKohdat = new List<Label>();
186
187        Label kohta1 = new Label("Pallon nopeus");
188        kohta1.Position = new Vector(-80, 40);
189        valikonKohdat.Add(kohta1);
190        kohta1.TextColor = Color.White;
191
192        Label kohta2 = new Label("Mailan nopeus");
193        kohta2.Position = new Vector(-80, -40);
194        valikonKohdat.Add(kohta2);
195        kohta2.TextColor = Color.White;
196
197        Label kohta3 = new Label("Takaisin");
198        kohta3.Position = new Vector(80, -40);
199        valikonKohdat.Add(kohta3);
200        kohta3.TextColor = Color.White;
201
202        Label kohta4 = new Label("Satunaiset kentät");
203        kohta4.TextColor = Color.White;
204
205        if (randomKentät == 1)
206        {
207            päälläPois = new Label("Päällä");
208        }
209        else { päälläPois = new Label("Pois päältä"); }
210        kohta4.Position = new Vector(100, 40);
211        päälläPois.Position = new Vector(70, 15);
212        päälläPois.TextColor = Color.White;
213        valikonKohdat.Add(päälläPois);
214        Add(kohta4);
215
216        foreach (Label valikonKohta in valikonKohdat)
217        {
218            Add(valikonKohta);
219        }
220
221        Mouse.ListenOn(kohta1, MouseButton.Left, ButtonState.Pressed, AsetaPallonNopeus, null);
222        Mouse.ListenOn(kohta2, MouseButton.Left, ButtonState.Pressed, AsetaMailanNopeus, null);
223        Mouse.ListenOn(kohta3, MouseButton.Left, ButtonState.Pressed, Valikko, null);
224        Mouse.ListenOn(päälläPois, MouseButton.Left, ButtonState.Pressed, satunaisetKentät, null);
225
226        Mouse.IsCursorVisible = true;
227        Mouse.ListenMovement(1.0, ValikossaLiikkuminen2, null);
228        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Lopeta, "");
229    }
230
231    void satunaisetKentät()
232    {
233        if (randomKentät == 1)
234        {
235            randomKentät = 0;
236        }
237        else
238        {
239            randomKentät = 1;
240        }
241        Asetukset();
242    }
243
244    void AsetaPallonNopeus()
245    {
246        InputWindow kysymysIkkuna = new InputWindow("Pallon nopeus", "Oletus on 300");
247        kysymysIkkuna.TextEntered += KäsitteleAsetukset;
248        Add(kysymysIkkuna);
249
250    }
251
252    void AsetaMailanNopeus()
253    {
254        InputWindow kysymysIkkuna = new InputWindow("Mailan nopeus", "Oletus on 600");
255        kysymysIkkuna.TextEntered += KäsitteleAsetukset2;
256        Add(kysymysIkkuna);
257    }
258
259    void KäsitteleAsetukset(InputWindow ikkuna)
260    {
261        try
262        {
263            int vastaus = int.Parse(ikkuna.InputBox.Text);
264            pallonNopeus = vastaus;
265        }
266        catch (FormatException)
267        {
268            ClearAll();
269            Label tekstikentta = new Label("Anna luku!");
270            Add(tekstikentta);
271            Timer.SingleShot(2, ClearAll);
272            Timer.SingleShot(2.01, Asetukset);
273        }
274    }
275
276    void KäsitteleAsetukset2(InputWindow ikkuna)
277    {
278        try
279        {
280            int vastaus = int.Parse(ikkuna.InputBox.Text);
281            mailanNopeus = vastaus;
282        }
283        catch (FormatException)
284        {
285            ClearAll();
286            Label tekstikentta = new Label("Anna luku!");
287            Add(tekstikentta);
288            Timer.SingleShot(2, ClearAll);
289            Timer.SingleShot(2.01, Asetukset);
290        }
291    }
292
293    PhysicsObject LuoPallo() //-170
294    {
295        PhysicsObject pallo1 = new PhysicsObject(18.0, 18.0);
296        pallo1.Image = palloKuva;
297        pallo1.Shape = Shape.Circle;
298        pallo1.Color = Color.LightGreen;
299        pallo1.Tag = "pallo";
300        pallo1.Restitution = 1.0;
301        pallo1.X = 0;
302        pallo1.Y = -168;
303        pallo1.CanRotate = false;
304        palloolemassa = 1;
305        return pallo1;
306    }
307
308    void LuoKenttä(int a)
309    {
310
311        LuoPalikat(a);
312        Level.Background.Image = taustaKuva;
313        Level.Background.Size = new Vector(Screen.Width, Screen.Height);
314
315        Camera.ZoomToLevel(1);
316    }
317
318    void AloitaPeliUudestaan()
319    {
320        maila.X = 0;
321        if (palloolemassa == 1)
322        {
323            pallo.Destroy();
324        }
325        if (äläLuoPalloa == 0)
326        {
327            pallo = LuoPallo();
328            AddCollisionHandler(pallo, KäsittelePallonTörmäys);
329            Add(pallo);
330        }
331    }
332
333    void AsetaOhjaimet()
334    {
335        Vector nopeusVasen = new Vector(-mailanNopeus, 0);
336        Vector nopeusOikea = new Vector(mailanNopeus, 0);
337        Keyboard.Listen(Key.Right, ButtonState.Down, AsetaNopeus, "Liikuta mailaa oikealle", maila, nopeusOikea);
338        Keyboard.Listen(Key.Right, ButtonState.Released, AsetaNopeus, null, maila, Vector.Zero);
339        Keyboard.Listen(Key.Left, ButtonState.Down, AsetaNopeus, "Liikuta mailaa vasemmalle", maila, nopeusVasen);
340        Keyboard.Listen(Key.Left, ButtonState.Released, AsetaNopeus, null, maila, Vector.Zero);
341
342        Keyboard.Listen(Key.T, ButtonState.Pressed, AloitaPeliUudestaan, "Liikuta mailaa vasemmalle");
343        Keyboard.Listen(Key.R, ButtonState.Pressed, DebugRäjäytys, "Liikuta mailaa vasemmalle");
344
345        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
346        Keyboard.Listen(Key.F2, ButtonState.Pressed, SeuraavaTaso, "Näytä ohjeet");
347
348        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Valikko, "Palaa valikkoon");
349
350
351    }
352
353    void DebugRäjäytys() { Räjähdys(tnt.Position); }
354
355    void LisääLaskurit(int elämät, int pisteet)
356    {
357        pisteetL = LuoPisteLaskuri(Screen.Left + 180.0, Screen.Top - 80.0, pisteet);
358        elämätL = LuoPisteLaskuri(Screen.Right - 100.0, Screen.Top - 80.0, elämät);
359        Label tekstikentta = new Label("Palloja jäljellä: ");
360        tekstikentta.X = Screen.Right - 180;
361        tekstikentta.Y = Screen.Top - 80;
362        tekstikentta.TextColor = Color.White;
363        Label tekstikentta2 = new Label("Pisteet: ");
364        tekstikentta2.X = Screen.Left + 100.0;
365        tekstikentta2.Y = Screen.Top - 80;
366        tekstikentta2.TextColor = Color.White;
367
368        Add(tekstikentta2);
369        Add(tekstikentta);
370    }
371
372    IntMeter LuoPisteLaskuri(double x, double y, int määrä)
373    {
374        IntMeter laskuri = new IntMeter(määrä);
375        Label näyttö = new Label();
376        näyttö.BindTo(laskuri);
377        näyttö.X = x;
378        näyttö.Y = y;
379        näyttö.TextColor = Color.White;
380        Add(näyttö);
381        return laskuri;
382    }
383
384    void KäsittelePallonTörmäys(PhysicsObject pallo, PhysicsObject kohde)
385    {
386        if (kohde == alaReuna)
387        {
388            pallo.Destroy();
389            palloolemassa = 0;
390            elämät -= 1;
391            if (elämät == 0)
392            {
393                HävisitPelin();
394            }
395            else Timer.SingleShot(1, AloitaPeliUudestaan);
396        }
397        if (kohde.Tag.ToString() == "taso")
398        {
399            pisteet += 100;
400            Timer.SingleShot(0.01, kohde.Destroy);
401            tasot.Remove(kohde);
402            TarkistaVoitto();
403        }
404        if (kohde.Tag.ToString() == "taso2")
405        {
406            Taso2 taso2 = (Taso2)kohde;
407            taso2.hitPoints--;
408            if (taso2.hitPoints == 1)
409            { taso2.Image = taso2Kuva2; }
410            else if (taso2.hitPoints == 0)
411            {
412                Timer.SingleShot(0.01, kohde.Destroy);
413                pisteet += 300;
414            }
415            taso2t.Remove(kohde);
416            TarkistaVoitto();
417        }
418        if (kohde.Tag.ToString() == "TNT")
419        {
420            pisteet += 100;
421            Räjähdys(kohde.Position);
422            Timer.SingleShot(0.01, kohde.Destroy);
423            TarkistaVoitto();
424        }
425        pisteetL.Value = pisteet;
426        elämätL.Value = elämät;
427
428    }
429
430    void TarkistaVoitto()
431    {
432        if ((tasot.Count == 0) && (taso2t.Count == 0) && (tntt.Count == 0))
433        {
434            SeuraavaTaso();
435        }
436
437    }
438
439    void SeuraavaTaso()
440    {
441        tasot.Clear();
442        tntt.Clear();
443        taso2t.Clear();
444        kenttäNro += 1;
445        if (kenttäNro > kenttäMäärä)
446        {
447            ClearAll();
448            Label tekstikentta = new Label("Voitit, onneksi olkoon! Sait " + pisteet + " pistettä!");
449            Add(tekstikentta);
450            Timer.SingleShot(2, Exit);
451        }
452        else
453        {
454            ClearAll();
455            Label tekstikentta = new Label("Pääsit seuraavaan tasoon");
456            Add(tekstikentta);
457            Timer.SingleShot(1.5, SeuraavaTaso2);
458        }
459
460    }
461
462    void SeuraavaTaso2()
463    {
464        ClearAll();
465        LuoKenttä(kenttäNro);
466        AsetaOhjaimet();
467        LisääLaskurit(elämät, pisteet);
468        AloitaPeliUudestaan();
469    }
470
471    void Räjähdys(Vector kohde)
472    {
473
474        Explosion rajahdys = new Explosion(10);
475        rajahdys.Position = kohde;
476        rajahdys.Force = 0;
477        Add(rajahdys);
478
479        //foreach (PhysicsObject taso in tasot)
480        //for(int i = 0; i<tasot.Count; i++)
481        int i = 0;
482        while (i < tasot.Count)
483        {
484            if (((tasot[i].X - kohde.X) < 100) && ((tasot[i].X - kohde.X) > -100)
485                && ((tasot[i].Y - kohde.Y) < 80) && ((tasot[i].Y - kohde.Y) > -80))
486            {
487                tasot[i].Destroy();
488                tasot.RemoveAt(i);
489                pisteet += 100;
490                pisteetL.Value = pisteet;
491            }
492            else
493            {
494                i++;
495            }
496        }
497        int w = 0;
498        while (w < taso2t.Count)
499        {
500            if (((taso2t[w].X - kohde.X) < 100) && ((taso2t[w].X - kohde.X) > -100)
501                && ((taso2t[w].Y - kohde.Y) < 80) && ((taso2t[w].Y - kohde.Y) > -80))
502            {
503                taso2t[w].Destroy();
504                taso2t.RemoveAt(w);
505                pisteet += 300;
506                pisteetL.Value = pisteet;
507            }
508            else
509            {
510                w++;
511            }
512        }
513        int o = 0;
514        while (o < tntt.Count)
515        {
516            if (((tntt[o].X - kohde.X) < 100) && ((tntt[o].X - kohde.X) > -100)
517                && ((tntt[o].Y - kohde.Y) < 80) && ((tntt[o].Y - kohde.Y) > -80))
518            {
519                Vector räjähdysPaikka = tntt[o].Position;
520                tntt[o].Destroy();
521                tntt.RemoveAt(o);
522                pisteet += 100;
523                pisteetL.Value = pisteet;
524                Räjähdys(räjähdysPaikka);
525
526            }
527            else
528            {
529                o++;
530            }
531        }
532    }
533
534    void LuoPalikat(int x)
535    {
536
537        if (randomKentät == 0)
538        {
539            TileMap kentta = TileMap.FromFile("kentta" + x + ".txt");
540            kentta['#'] = lisaaTaso;
541            kentta['!'] = lisaaTaso2;
542            kentta['p'] = lisaaPystyTaso;
543            kentta['P'] = lisaaPystyTasoTuhoutumaton;
544            kentta['*'] = lisaaTNT;
545            kentta['T'] = lisaaTasoTuhoutumaton;
546            kentta['m'] = LuoMaila;
547            kentta['-'] = LuoReunat;
548            kentta['_'] = LuoAlaReuna;
549            kentta['y'] = LuoYläReuna;
550            kentta.Insert(20, 20);
551        }
552        else
553        {
554            TileMap kentta = TileMap.FromFile("kenttarandom.txt");
555            kentta['#'] = lisaaRandomTaso;
556            kentta['m'] = LuoMaila;
557            kentta['-'] = LuoReunat;
558            kentta['_'] = LuoAlaReuna;
559            kentta['y'] = LuoYläReuna;
560            kentta.Insert(40, 40);
561        }
562    }
563
564    PhysicsObject lisaaTaso()
565    {
566        PhysicsObject taso = PhysicsObject.CreateStaticObject(40, 10);
567        taso.Tag = "taso";
568        taso.Image = tasoKuva;
569        taso.Restitution = 1.0;
570        tasot.Add(taso);
571        return taso;
572    }
573
574    PhysicsObject lisaaTasoTuhoutumaton()
575    {
576        PhysicsObject tasoTuhoutumaton = PhysicsObject.CreateStaticObject(40, 10);
577        //tasoTuhoutumaton.Tag = "taso";
578        tasoTuhoutumaton.Image = tasoTuhoutumatonKuva;
579        tasoTuhoutumaton.Restitution = 1.0;
580        return tasoTuhoutumaton;
581    }
582
583    PhysicsObject lisaaPystyTaso()
584    {
585        PhysicsObject taso = PhysicsObject.CreateStaticObject(10, 40);
586        taso.Tag = "taso";
587        taso.Image = tasoKuva;
588        taso.Restitution = 1.0;
589        tasot.Add(taso);
590        return taso;
591    }
592
593    PhysicsObject lisaaPystyTasoTuhoutumaton()
594    {
595        PhysicsObject tasoTuhoutumaton = PhysicsObject.CreateStaticObject(10, 40);
596        //tasoTuhoutumaton.Tag = "taso";
597        tasoTuhoutumaton.Image = tasoTuhoutumatonKuvaPysty;
598        tasoTuhoutumaton.Restitution = 1.0;
599        return tasoTuhoutumaton;
600    }
601
602    PhysicsObject lisaaTaso2()
603    {
604        Taso2 taso2 = new Taso2();
605        taso2.Tag = "taso2";
606        taso2.Image = taso2Kuva;
607        taso2.Restitution = 1.0;
608        taso2t.Add(taso2);
609        return taso2;
610    }
611
612    PhysicsObject lisaaTNT()
613    {
614        tnt = PhysicsObject.CreateStaticObject(40, 10);
615        tnt.Image = tntKuva;
616        tnt.Restitution = 1;
617        tntt.Add(tnt);
618        tnt.Tag = "TNT";
619
620        return tnt;
621    }
622
623    PhysicsObject LuoMaila()
624    {
625        maila = PhysicsObject.CreateStaticObject(60.0, 10);
626        maila.Shape = Shape.Rectangle;
627        maila.Image = mailanKuva;
628        maila.Restitution = 0.5;
629        maila.Color = Color.Green;
630        return maila;
631    }
632
633    PhysicsObject lisaaRandomTaso()
634    {
635        int tasonTyyppi = RandomGen.NextInt(1, 4);
636        PhysicsObject taso;
637
638        if (tasonTyyppi == 1)
639        {
640            taso = lisaaTaso();
641        }
642        else if (tasonTyyppi == 2)
643        {
644            taso = lisaaTaso2();
645        }
646        else if (tasonTyyppi == 3)
647        {
648            taso = lisaaTNT();
649        }
650        else if (tasonTyyppi == 4)
651        {
652            MessageDisplay.Add("tuli nelonen");
653            taso = lisaaTaso();
654        }
655        else
656        {
657            taso = lisaaTaso();
658        }
659
660
661        return taso;
662    }
663
664    PhysicsObject LuoReunat()
665    {
666        PhysicsObject reuna = PhysicsObject.CreateStaticObject(40, 800);
667        reuna.IsVisible = false;
668        reuna.Restitution = 1.0;
669        return reuna;
670    }
671
672    PhysicsObject LuoAlaReuna()
673    {
674        alaReuna = PhysicsObject.CreateStaticObject(800, 40);
675        alaReuna.Color = Color.Black;
676        alaReuna.IsVisible = false;
677        alaReuna.Restitution = 1.0;
678        return alaReuna;
679    }
680
681    PhysicsObject LuoYläReuna()
682    {
683        PhysicsObject yläReuna = PhysicsObject.CreateStaticObject(800, 40);
684        yläReuna.Color = Color.Black;
685        yläReuna.IsVisible = false;
686        yläReuna.Restitution = 1.0;
687        return yläReuna;
688    }
689
690    void AsetaNopeus(PhysicsObject maila, Vector nopeus)
691    {
692        if ((nopeus.X < 0) && (maila.Left < Level.Left + 40))
693        {
694            maila.Velocity = Vector.Zero;
695            return;
696        }
697
698        if ((nopeus.X > 0) && (maila.Right > Level.Right - 40))
699        {
700            maila.Velocity = Vector.Zero;
701            return;
702        }
703        maila.Velocity = nopeus;
704    }
705
706    void HävisitPelin()
707    {
708        ClearAll();
709        Label tekstikentta = new Label("Hävisit. Sait " + pisteet + " pistettä");
710        Add(tekstikentta);
711        Timer.SingleShot(3, Valikko);
712    }
713
714    protected override void Update(Time time)
715    {
716        if (pallo != null && Math.Abs(pallo.Velocity.Y) < pallonNopeus)
717        {
718            pallo.Velocity = new Vector(pallo.Velocity.X, pallo.Velocity.Y * 1.1);
719
720        }
721        if (pallo != null && Math.Abs(pallo.Velocity.X) < pallonNopeus)
722        {
723            pallo.Velocity = new Vector(pallo.Velocity.X * 1.1, pallo.Velocity.Y);
724
725        }
726        base.Update(time);
727
728    }
729
730
731}
Note: See TracBrowser for help on using the repository browser.