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

Revision 1761, 14.9 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    //Vector nopeusVasen = new Vector(-600, 0);
30
31    PhysicsObject pallo;
32    PhysicsObject maila;
33    PhysicsObject tnt;
34
35    PhysicsObject alaReuna;
36    int kenttäNro = 1;
37    int kenttäMäärä = 3;
38
39    int palloolemassa;
40    const int RUUDUN_KOKO = 5;
41
42    Image tntKuva = LoadImage("TNT");
43    Image tasoKuva = LoadImage("Palikka");
44    Image taso2Kuva = LoadImage("Vahvistettu palikka");
45    Image taso2Kuva2 = LoadImage("Vahvistettu palikka2");
46    Image taustaKuva = LoadImage("taustakuva");
47    int pisteet;
48    int elämät = 3;
49    IntMeter pisteetL;
50    IntMeter elämätL;
51
52    List<Label> valikonKohdat;
53    List<PhysicsObject> tasot = new List<PhysicsObject>();
54    List<PhysicsObject> taso2t = new List<PhysicsObject>();
55    List<PhysicsObject> tntt = new List<PhysicsObject>();
56
57    public override void Begin()
58    {
59        Valikko();
60    }
61
62    void Valikko()
63    {
64        ClearAll();
65        valikonKohdat = new List<Label>();
66
67        Label kohta1 = new Label("Aloita uusi peli");
68        kohta1.Position = new Vector(-80, 40);
69        valikonKohdat.Add(kohta1);
70
71        Label kohta2 = new Label("Asetukset");
72        kohta2.Position = new Vector(-80, -40);
73        valikonKohdat.Add(kohta2);
74
75        Label kohta3 = new Label("Lopeta");
76        kohta3.Position = new Vector(80, -40);
77        valikonKohdat.Add(kohta3);
78
79        foreach (Label valikonKohta in valikonKohdat)
80        {
81            Add(valikonKohta);
82        }
83
84        Mouse.ListenOn(kohta1, MouseButton.Left, ButtonState.Pressed, AloitaPeli, null);
85        Mouse.ListenOn(kohta2, MouseButton.Left, ButtonState.Pressed, Asetukset, null);
86        Mouse.ListenOn(kohta3, MouseButton.Left, ButtonState.Pressed, Lopeta, null);
87
88        Mouse.IsCursorVisible = true;
89        Mouse.ListenMovement(1.0, ValikossaLiikkuminen, null);
90        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Lopeta, "");
91    }
92
93    void ValikossaLiikkuminen(AnalogState hiirenTila)
94    {
95        foreach (Label kohta in valikonKohdat)
96        {
97            if (Mouse.IsCursorOn(kohta))
98            {
99                kohta.TextColor = Color.Red;
100            }
101            else
102            {
103                kohta.TextColor = Color.Black;
104            }
105
106        }
107    }
108
109    void AloitaPeli()
110    {
111        ClearAll();
112        LuoKenttä(1);
113        AsetaOhjaimet();
114        LisääLaskurit(3, 0);
115        AloitaPeliUudestaan();
116    }
117
118    void Lopeta()
119    {
120        Exit();
121    }
122
123    void Asetukset()
124    {
125        ClearAll();
126        valikonKohdat = new List<Label>();
127
128        Label kohta1 = new Label("Pallon nopeus");
129        kohta1.Position = new Vector(-80, 40);
130        valikonKohdat.Add(kohta1);
131
132        Label kohta2 = new Label("Mailan nopeus");
133        kohta2.Position = new Vector(-80, -40);
134        valikonKohdat.Add(kohta2);
135
136        Label kohta3 = new Label("Takaisin");
137        kohta3.Position = new Vector(80, -40);
138        valikonKohdat.Add(kohta3);
139
140        foreach (Label valikonKohta in valikonKohdat)
141        {
142            Add(valikonKohta);
143        }
144
145        Mouse.ListenOn(kohta1, MouseButton.Left, ButtonState.Pressed, AsetaPallonNopeus, null);
146        Mouse.ListenOn(kohta2, MouseButton.Left, ButtonState.Pressed, AsetaMailanNopeus, null);
147        Mouse.ListenOn(kohta3, MouseButton.Left, ButtonState.Pressed, Valikko, null);
148
149        Mouse.IsCursorVisible = true;
150        Mouse.ListenMovement(1.0, ValikossaLiikkuminen, null);
151        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Lopeta, "");
152    }
153
154    void AsetaPallonNopeus()
155    {
156        InputWindow kysymysIkkuna = new InputWindow("Pallon nopeus", "Oletus on 300");
157        kysymysIkkuna.TextEntered += KäsitteleAsetukset;
158        Add(kysymysIkkuna);
159
160    }
161
162
163    void AsetaMailanNopeus()
164    {
165        InputWindow kysymysIkkuna = new InputWindow("Mailan nopeus", "Oletus on 600");
166        kysymysIkkuna.TextEntered += KäsitteleAsetukset2;
167        Add(kysymysIkkuna);
168    }
169   
170    void KäsitteleAsetukset(InputWindow ikkuna)
171    {
172        try
173        {
174            int vastaus = int.Parse(ikkuna.InputBox.Text);
175        }
176        catch (FormatException f)
177        {
178            ClearAll();
179            Label tekstikentta = new Label("Anna luku!");
180            Add(tekstikentta);
181            Timer.SingleShot(2, ClearAll);
182            Timer.SingleShot(2.01, Asetukset);
183        }
184    }
185    void KäsitteleAsetukset2(InputWindow ikkuna)
186    {
187        try
188        {
189            int vastaus = int.Parse(ikkuna.InputBox.Text);
190            mailanNopeus = vastaus;
191        }
192        catch (FormatException f)
193        {
194            ClearAll();
195            Label tekstikentta = new Label("Anna luku!");
196            Add(tekstikentta);
197            Timer.SingleShot(2, ClearAll);
198            Timer.SingleShot(2.01, Asetukset);
199        }
200    }
201
202   
203    PhysicsObject LuoPallo() //-170
204    {
205        PhysicsObject pallo1 = new PhysicsObject(20.0, 20.0);
206        pallo1.Shape = Shape.Circle;
207        pallo1.Color = Color.Blue;
208        pallo1.Tag = "pallo";
209        pallo1.Restitution = 1.0;
210        pallo1.X = 0;
211        pallo1.Y = -170;
212        palloolemassa = 1;
213        return pallo1;
214    }
215   
216   
217    void LuoKenttä(int a)
218    {
219
220        LuoPalikat(a);
221        Level.Background.Image = taustaKuva;
222        Level.Background.FitToLevel();
223
224        Camera.ZoomToLevel(1);
225    }
226
227    void AloitaPeliUudestaan()
228    {
229        maila.X = 0;
230        if (palloolemassa == 1)
231        {
232            pallo.Destroy();
233        }
234        pallo = LuoPallo();
235       
236        AddCollisionHandler(pallo, KäsittelePallonTörmäys);
237        Add(pallo);
238    }
239
240 
241    void AsetaOhjaimet()
242    {
243        Vector nopeusVasen = new Vector(-mailanNopeus, 0);
244        Vector nopeusOikea = new Vector(mailanNopeus, 0);
245        Keyboard.Listen(Key.Right, ButtonState.Down, AsetaNopeus, "Liikuta mailaa oikealle", maila, nopeusOikea);
246        Keyboard.Listen(Key.Right, ButtonState.Released, AsetaNopeus, null, maila, Vector.Zero);
247        Keyboard.Listen(Key.Left, ButtonState.Down, AsetaNopeus, "Liikuta mailaa vasemmalle", maila, nopeusVasen);
248        Keyboard.Listen(Key.Left, ButtonState.Released, AsetaNopeus, null, maila, Vector.Zero);
249
250        Keyboard.Listen(Key.T, ButtonState.Pressed, AloitaPeliUudestaan, "Liikuta mailaa vasemmalle");
251        Keyboard.Listen(Key.R, ButtonState.Pressed, DebugRäjäytys, "Liikuta mailaa vasemmalle");
252       
253        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
254        Keyboard.Listen(Key.F2, ButtonState.Pressed, SeuraavaTaso, "Näytä ohjeet");
255
256        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Poistu");
257
258
259    }
260    void DebugRäjäytys() {  Räjähdys(tnt.Position); }
261
262    void LisääLaskurit(int elämät, int pisteet)
263    {
264        pisteetL = LuoPisteLaskuri(Screen.Left + 100.0, Screen.Top - 80.0, pisteet);
265        elämätL = LuoPisteLaskuri(Screen.Right - 100.0, Screen.Top - 80.0, elämät);
266    }
267
268    IntMeter LuoPisteLaskuri(double x, double y, int määrä)
269    {
270        IntMeter laskuri = new IntMeter(määrä);
271        Label näyttö = new Label();
272        näyttö.BindTo(laskuri);
273        näyttö.X = x;
274        näyttö.Y = y;
275        näyttö.TextColor = Color.White;
276        Add(näyttö);
277        return laskuri;
278    }
279
280
281    void KäsittelePallonTörmäys(PhysicsObject pallo, PhysicsObject kohde)
282    {
283            if (kohde == alaReuna)
284            {
285                pallo.Destroy();
286                palloolemassa = 0;
287                elämät -= 1;
288                if (elämät == 0)
289                {
290                    HävisitPelin();
291                }
292                else Timer.SingleShot(1, AloitaPeliUudestaan);
293            }
294            if (kohde.Tag.ToString() == "taso")
295            {
296                pisteet += 100;
297                Timer.SingleShot(0.01, kohde.Destroy);
298                tasot.Remove(kohde);
299                TarkistaVoitto();
300            }
301            if (kohde.Tag.ToString() == "taso2")
302            {
303                Taso2 taso2 = (Taso2)kohde;
304                taso2.hitPoints--;
305                if (taso2.hitPoints == 1)
306                { taso2.Image = taso2Kuva2; }
307                else if (taso2.hitPoints == 0)
308                {
309                    Timer.SingleShot(0.01, kohde.Destroy);
310                    pisteet += 300;
311                }
312                taso2t.Remove(kohde);
313                TarkistaVoitto();
314            }
315            if (kohde.Tag.ToString() == "TNT")
316            {
317                pisteet += 100;
318                Räjähdys(kohde.Position);
319                Timer.SingleShot(0.01, kohde.Destroy);
320                TarkistaVoitto();
321            }
322            pisteetL.Value = pisteet;
323            elämätL.Value = elämät;
324       
325    }
326    void TarkistaVoitto()
327    {
328        if ((tasot.Count == 0) && (tntt.Count == 0))
329        {
330            Timer.SingleShot(1, SeuraavaTaso);
331        }
332    }
333    void SeuraavaTaso()
334    {
335        tasot.Clear();
336        tntt.Clear();
337        kenttäNro += 1;
338        if (kenttäNro > kenttäMäärä)
339        {
340            ClearAll();
341            Label tekstikentta = new Label("Voitit");
342            Add(tekstikentta);
343            Timer.SingleShot(5, Exit);
344        }
345        else
346        {
347            ClearAll();
348            Label tekstikentta = new Label("Pääsit seuraavaan tasoon");
349            Add(tekstikentta);
350            Timer.SingleShot(2, SeuraavaTaso2);
351        }
352       
353    }
354    void SeuraavaTaso2()
355    {
356        ClearAll();
357        LuoKenttä(kenttäNro);
358        AsetaOhjaimet();
359        LisääLaskurit(elämät, pisteet);
360        AloitaPeliUudestaan();
361    }
362
363    void Räjähdys(Vector kohde)
364    {
365       
366        Explosion rajahdys = new Explosion(10);
367        rajahdys.Position = kohde;
368        rajahdys.Force = 0;
369        Add(rajahdys);
370
371        //foreach (PhysicsObject taso in tasot)
372        //for(int i = 0; i<tasot.Count; i++)
373        int i = 0;
374        while(i<tasot.Count)
375        {
376            if (((tasot[i].X - kohde.X) < 100) && ((tasot[i].X - kohde.X) > -100) 
377                && ((tasot[i].Y - kohde.Y) < 80) && ((tasot[i].Y - kohde.Y) > -80))
378            {
379                tasot[i].Destroy();
380                tasot.RemoveAt(i);
381                pisteet += 100;
382                pisteetL.Value = pisteet;
383            }
384            else
385            {
386                i++;
387            }
388        }
389        int w = 0;
390        while (w < taso2t.Count)
391        {
392            if (((taso2t[w].X - kohde.X) < 100) && ((taso2t[w].X - kohde.X) > -100)
393                && ((taso2t[w].Y - kohde.Y) < 80) && ((taso2t[w].Y - kohde.Y) > -80))
394            {
395                taso2t[w].Destroy();
396                taso2t.RemoveAt(w);
397                pisteet += 300;
398                pisteetL.Value = pisteet;
399            }
400            else
401            {
402                w++;
403            }
404        }
405        int o = 0;
406        while (o<tntt.Count)
407        {
408            if (((tntt[o].X - kohde.X) < 100) && ((tntt[o].X - kohde.X) > -100)
409                && ((tntt[o].Y - kohde.Y) < 80) && ((tntt[o].Y - kohde.Y) > -80))
410            {
411                Vector räjähdysPaikka = tntt[o].Position;
412                tntt[o].Destroy();
413                tntt.RemoveAt(o);
414                pisteet += 100;
415                pisteetL.Value = pisteet;
416                Räjähdys(räjähdysPaikka);
417       
418            }
419            else
420            {
421                o++;
422            }
423        }
424    }
425
426
427 
428    void LuoPalikat(int x)
429    {
430       
431        TileMap kentta = TileMap.FromFile("kentta" + x + ".txt");
432        kentta['#'] = lisaaTaso;
433        kentta['!'] = lisaaTaso2;
434        kentta['*'] = lisaaTNT;
435        kentta['m'] = LuoMaila;
436        kentta['-'] = LuoReunat;
437        kentta['_'] = LuoAlaReuna;
438        kentta['y'] = LuoYläReuna;
439        kentta.Insert(40, 40);
440    }
441
442    PhysicsObject lisaaTaso()
443    {
444        PhysicsObject taso = PhysicsObject.CreateStaticObject(40, 10);
445        taso.Tag = "taso";
446        taso.Image = tasoKuva;
447        taso.Restitution = 1.0;
448        tasot.Add(taso);
449        return taso;
450    }
451
452    PhysicsObject lisaaTaso2()
453    {
454        Taso2 taso2 = new Taso2();
455        taso2.Tag = "taso2";
456        taso2.Image = taso2Kuva;
457        taso2.Restitution = 1.0;
458        taso2t.Add(taso2);
459        return taso2;
460    }
461
462    PhysicsObject lisaaTNT()
463    {
464        tnt = PhysicsObject.CreateStaticObject(40, 10);
465        tnt.Image = tntKuva;
466        tnt.Restitution = 1;
467        tntt.Add(tnt);
468        tnt.Tag = "TNT";
469       
470        return tnt;
471    }
472
473    PhysicsObject LuoMaila()
474    {
475        maila = PhysicsObject.CreateStaticObject(60.0, 10);
476        maila.Shape = Shape.Rectangle;
477        maila.Restitution = 1.0;
478        maila.Color = Color.Green;
479        return maila;
480    }
481
482    PhysicsObject LuoReunat()
483    {
484        PhysicsObject reuna = PhysicsObject.CreateStaticObject(40, 800);
485        reuna.IsVisible = false;
486        reuna.Restitution = 1.0;
487        return reuna;
488    }
489
490    PhysicsObject LuoAlaReuna()
491    {
492        alaReuna = PhysicsObject.CreateStaticObject(800, 40);
493        alaReuna.Color = Color.Black;
494        alaReuna.IsVisible = false;
495        alaReuna.Restitution = 1.0;
496        return alaReuna;
497    }
498    PhysicsObject LuoYläReuna()
499    {
500        PhysicsObject yläReuna = PhysicsObject.CreateStaticObject(800, 40);
501        yläReuna.Color = Color.Black;
502        yläReuna.IsVisible = false;
503        yläReuna.Restitution = 1.0;
504        return yläReuna;
505    }
506
507    void AsetaNopeus(PhysicsObject maila, Vector nopeus)
508    {
509        if ((nopeus.X < 0) && (maila.Left < Level.Left + 40))
510        {
511            maila.Velocity = Vector.Zero;
512            return;
513        }
514
515        if ((nopeus.X > 0) && (maila.Right > Level.Right - 40))
516        {
517            maila.Velocity = Vector.Zero;
518            return;
519        }
520        maila.Velocity = nopeus;
521    }
522
523    void HävisitPelin()
524    {
525        ClearAll();
526        Label tekstikentta = new Label("Hävisit. Sait " + pisteet + " pistettä");
527        Add(tekstikentta);
528        Timer.SingleShot(3, Exit);
529    }
530
531    double PALLON_NOPEUS = 300;
532
533    protected override void Update(Time time)
534    {
535        if (pallo != null && Math.Abs(pallo.Velocity.Y) < PALLON_NOPEUS)
536        {
537            pallo.Velocity = new Vector(pallo.Velocity.X, pallo.Velocity.Y * 1.1);
538
539        }
540        base.Update(time);
541       
542    }
543
544
545}
Note: See TracBrowser for help on using the repository browser.