source: 2011/23/iltakuop/Blocks/Blocks/Blocks/Peli.cs @ 1791

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