source: 2011/24/VeikkaH/Pallopeli/Pallopeli/Pallopeli/Peli.cs @ 2101

Revision 2101, 17.3 KB checked in by veilhalo, 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//
10//
11//  0.333333333333333   to 0.333 !!!!!!!!!!!!
12//  VAALIKKKOOOO pelitilasta
13//
14//
15//
16public class Peli : PhysicsGame
17{
18    /*
19    Äänet: maali, keraa, syo
20     */
21    #region esittelyt
22
23    SoundEffect tahtiAani = LoadSoundEffect("maali");
24    SoundEffect keraaAani = LoadSoundEffect("keraa");
25    SoundEffect syoAani = LoadSoundEffect("syo");
26   
27    Image hahmoKuva = LoadImage("hahmo");
28    Image hahmo2Kuva = LoadImage("hahmo2");
29    Image palloKuva = LoadImage("pallo");
30    Image tahtiKuva = LoadImage("tahti");
31    Image kuutioKuva = LoadImage("kuutio");
32    Image eriKuutioKuva = LoadImage("erikuutio");
33    Image eriStopKuva = LoadImage("eristop");
34   
35    double alkuLiike = 1000;
36    int palloLaskuri = 1;
37    bool onKuutioita = false;
38    double aika = 0;
39    int pahikset = 100;
40
41    ScoreList topLista = new ScoreList(10, true, -0);
42   
43    Timer kuutioAika = new Timer();
44    Timer aikaTimer = new Timer();
45
46    PhysicsObject hahmo;
47    PhysicsObject hahmo2;
48    PhysicsObject taulu;
49    PhysicsObject kuutio;
50   
51    IntMeter pisteLaskuri1;
52    IntMeter pisteLaskuri2;
53
54    FollowerBrain kuutionAivot = new FollowerBrain();
55
56    List<PhysicsObject> pallot = new List<PhysicsObject>();
57    List<PhysicsObject> kaikki = new List<PhysicsObject>();
58    List<PhysicsObject> ihanKaikki = new List<PhysicsObject>();
59    List<Label> valikonKohdat;
60    #endregion
61
62    public override void Begin()
63    {
64        IsFullScreen = true;
65        if (DataStorage.Exists("parhaat_pisteet.xml"))
66            topLista = DataStorage.Load<ScoreList>(topLista, "parhaat_pisteet.xml");
67        Level.Height -= 60;
68        Valikko();
69    }
70    void AloitaPeli(int pelaajat)
71    {
72        ClearAll();
73        onKuutioita = false;
74        Level.CreateBorders(1, true);
75        Camera.ZoomToLevel();
76        Level.BackgroundColor = Color.Black;
77        MessageDisplay.TextColor = Color.White;
78        luoTaulu();
79        luoHahmo(pelaajat);
80        if (pelaajat == 2)
81        {
82            luoHahmo2();
83        }
84        luoLaskurit(pelaajat);
85        for (int i = 0; i < pahikset; i++)
86        {
87            luoPallo();
88            luoTahti();
89        }
90        for (int k = 0; k < 1; k++)
91        {
92            luoErikoisuus("kuutio");
93            luoErikoisuus("stop");
94        }
95        pisteLaskuri1.Reset();
96        aikaTimer.Interval = 1;
97        aikaTimer.Trigger += lisaaAikaa;
98        aikaTimer.Start();
99        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Valikko, "Palaa valikkoon");
100    }
101    void luoLaskurit(int pelaajat)
102    {
103        pisteLaskuri1 = new IntMeter(0);
104        pisteLaskuri1.MaxValue = pahikset;
105        pisteLaskuri1.UpperLimit += tahdetKeratty;
106
107        Label pisteNaytto = new Label();
108        pisteNaytto.X = 0;
109        pisteNaytto.Y = Screen.Bottom + 20;
110        pisteNaytto.TextColor = Color.Red;
111        pisteNaytto.HorizontalAlignment = HorizontalAlignment.Left;
112        pisteNaytto.Title = "Tähtiä kerätty";
113        pisteNaytto.BindTo(pisteLaskuri1);
114        Add(pisteNaytto);
115        if (pelaajat == 2)
116        {
117            pisteLaskuri2 = new IntMeter(0);
118            pisteLaskuri2.MaxValue = pahikset;
119            pisteLaskuri2.UpperLimit += tahdetKeratty;
120
121            Label pisteNaytto2 = new Label();
122            pisteNaytto2.X = 100;
123            pisteNaytto.X = -100;
124            pisteNaytto2.Y = Screen.Bottom + 20;
125            pisteNaytto2.TextColor = Color.Red;
126            pisteNaytto2.HorizontalAlignment = HorizontalAlignment.Left;
127            pisteNaytto2.Title = "Pelaaja 2";
128            pisteNaytto.Title = "Pelaaja 1";
129            pisteNaytto2.BindTo(pisteLaskuri1);
130            Add(pisteNaytto2);
131        }
132    }
133    void tahdetKeratty(int arvo)
134    {
135        foreach (PhysicsObject kaikkiOb in ihanKaikki)
136        {
137            kaikkiOb.Destroy();
138        }
139        aikaTimer.Stop();
140        HighScoreWindow topIkkuna = new HighScoreWindow("Parhaat pisteet",
141                     "Tähteä minuutissa",
142                     "Onneksi olkoon, pääsit listalle pisteillä %p! Syötä nimesi:",
143                     topLista, aika);
144        topIkkuna.Closed += TallennaPisteet;
145        Add(topIkkuna);
146    }
147    void luoPallo()
148    {
149        PhysicsObject pallo;
150        pallo = new PhysicsObject(RandomGen.NextDouble(10, 100), RandomGen.NextDouble(10, 100), Shape.Circle, CollisionShapeQuality.Best);
151        pallo.X = RandomGen.NextDouble(Level.Left + pallo.Width, Level.Right - pallo.Width);
152        pallo.Y = RandomGen.NextDouble(Level.Bottom + pallo.Height, Level.Top - pallo.Height);
153        pallo.Restitution = 1;
154        pallo.KineticFriction = 0;
155        pallo.Color = Color.Red;
156        pallo.Image = palloKuva;
157        pallo.Tag = "pallo" + palloLaskuri;
158        Add(pallo);
159        pallo.Hit((new Vector(RandomGen.NextDouble(-1, 1), RandomGen.NextDouble(-1, 1)).Normalize()) * RandomGen.NextDouble(0, alkuLiike));
160        palloLaskuri++;
161        pallot.Add(pallo);
162        kaikki.Add(pallo);
163        ihanKaikki.Add(pallo);
164    }
165    void luoTahti()
166    {
167        PhysicsObject tahti;
168        tahti = new PhysicsObject(10, 10);
169        tahti.X = RandomGen.NextDouble(Level.Left + tahti.Width, Level.Right - tahti.Width);
170        tahti.Y = RandomGen.NextDouble(Level.Bottom + tahti.Height, Level.Top - tahti.Height);
171        tahti.Restitution = 1;
172        tahti.KineticFriction = 0;
173        tahti.Color = Color.Yellow;
174        tahti.Image = tahtiKuva;
175        tahti.Tag = "tahti";
176        tahti.Mass = 0.1;
177        Add(tahti);
178        kaikki.Add(tahti);
179        ihanKaikki.Add(tahti);
180    }
181    void luoHahmo(int pelaajat)
182    {
183        hahmo = new PhysicsObject(50, 50, Shape.Circle, CollisionShapeQuality.Best);
184        hahmo.X = 0;
185        if (pelaajat == 2)
186        {
187            hahmo.X -= 100;
188        }
189        hahmo.Y = 0;
190        hahmo.Restitution = 1;
191        hahmo.KineticFriction = 0;
192        hahmo.Color = Color.Blue;
193        hahmo.Image = hahmoKuva;
194        hahmo.Mass = 1;
195        hahmo.LinearDamping = 0.9;
196        AddCollisionHandler(hahmo, osu);
197        Add(hahmo);
198        ihanKaikki.Add(hahmo);
199
200        Vector ylos = new Vector(0, 1000);
201        Vector alas = new Vector(0, -1000);
202        Vector oikealle = new Vector(1000, 0);
203        Vector vasemmalle = new Vector(-1000, 0);
204
205        Keyboard.Listen(Key.Up, ButtonState.Down, aseta, "Liiku ylös", hahmo, ylos);
206        Keyboard.Listen(Key.Up, ButtonState.Released, aseta, null, hahmo, Vector.Zero);
207        Keyboard.Listen(Key.Down, ButtonState.Down, aseta, "Liiku alas", hahmo, alas);
208        Keyboard.Listen(Key.Down, ButtonState.Released, aseta, null, hahmo, Vector.Zero);
209        Keyboard.Listen(Key.Right, ButtonState.Down, aseta, "Liiku oikealle", hahmo, oikealle);
210        Keyboard.Listen(Key.Right, ButtonState.Released, aseta, null, hahmo, Vector.Zero);
211        Keyboard.Listen(Key.Left, ButtonState.Down, aseta, "Liiku vasemmalle", hahmo, vasemmalle);
212        Keyboard.Listen(Key.Left, ButtonState.Released, aseta, null, hahmo, Vector.Zero);
213
214        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohje");
215        }
216    void luoHahmo2()
217    {
218        hahmo2 = new PhysicsObject(50, 50, Shape.Circle, CollisionShapeQuality.Best);
219        hahmo2.X = 100;
220        hahmo2.Y = 0;
221        hahmo2.Restitution = 1;
222        hahmo2.KineticFriction = 0;
223        hahmo2.Color = Color.Green;
224        hahmo2.Image = hahmo2Kuva;
225        hahmo2.Mass = 1;
226        hahmo2.LinearDamping = 0.9;
227        AddCollisionHandler(hahmo2, osu);
228        Add(hahmo2);
229        ihanKaikki.Add(hahmo2);
230
231        Vector ylos = new Vector(0, 1000);
232        Vector alas = new Vector(0, -1000);
233        Vector oikealle = new Vector(1000, 0);
234        Vector vasemmalle = new Vector(-1000, 0);
235
236        Keyboard.Listen(Key.W, ButtonState.Down, aseta, "Liiku ylös", hahmo2, ylos);
237        Keyboard.Listen(Key.W, ButtonState.Released, aseta, null, hahmo2, Vector.Zero);
238        Keyboard.Listen(Key.S, ButtonState.Down, aseta, "Liiku alas", hahmo2, alas);
239        Keyboard.Listen(Key.S, ButtonState.Released, aseta, null, hahmo2, Vector.Zero);
240        Keyboard.Listen(Key.D, ButtonState.Down, aseta, "Liiku oikealle", hahmo2, oikealle);
241        Keyboard.Listen(Key.D, ButtonState.Released, aseta, null, hahmo2, Vector.Zero);
242        Keyboard.Listen(Key.A, ButtonState.Down, aseta, "Liiku vasemmalle", hahmo2, vasemmalle);
243        Keyboard.Listen(Key.A, ButtonState.Released, aseta, null, hahmo2, Vector.Zero);
244    }
245    void luoErikoisuus(string tyyppi)
246    {
247        if (tyyppi == "kuutio")
248        {
249            PhysicsObject eriKuutio;
250            eriKuutio = new PhysicsObject(50, 50, Shape.Circle);
251            eriKuutio.X = RandomGen.NextDouble(Level.Left + eriKuutio.Width, Level.Right - eriKuutio.Width);
252            eriKuutio.Y = RandomGen.NextDouble(Level.Bottom + eriKuutio.Height, Level.Top - eriKuutio.Height);
253            eriKuutio.Restitution = 1;
254            eriKuutio.KineticFriction = 0;
255            eriKuutio.Color = Color.Cyan;
256            eriKuutio.Image = eriKuutioKuva;
257            eriKuutio.Tag = "erikuutio";
258            eriKuutio.Mass = 0.1;
259            Add(eriKuutio);
260            kaikki.Add(eriKuutio);
261            ihanKaikki.Add(eriKuutio);
262        }
263        else if (tyyppi == "stop")
264        {
265            PhysicsObject eriStop;
266            eriStop = new PhysicsObject(50, 50, Shape.Circle);
267            eriStop.X = RandomGen.NextDouble(Level.Left + eriStop.Width, Level.Right - eriStop.Width);
268            eriStop.Y = RandomGen.NextDouble(Level.Bottom + eriStop.Height, Level.Top - eriStop.Height);
269            eriStop.Restitution = 1;
270            eriStop.KineticFriction = 0;
271            eriStop.Color = Color.Red;
272            eriStop.Image = eriStopKuva;
273            eriStop.Tag = "eristop";
274            eriStop.Mass = 0.1;
275            Add(eriStop);
276            kaikki.Add(eriStop);
277            ihanKaikki.Add(eriStop);
278        }
279    }
280    void luoKuutio()
281   {
282        onKuutioita = true;
283        kuutio = new PhysicsObject(100, 100, Shape.Rectangle, CollisionShapeQuality.Best);
284        kuutio.X = RandomGen.NextDouble(Level.Left + kuutio.Width, Level.Right - kuutio.Width);
285        kuutio.Y = RandomGen.NextDouble(Level.Bottom + kuutio.Height, Level.Top - kuutio.Height);
286        kuutio.Restitution = 1;
287        kuutio.KineticFriction = 0;
288        kuutio.Color = Color.Cyan;
289        kuutio.Image = kuutioKuva;
290        kuutio.Mass = 50;
291        kuutio.Brain = kuutionAivot;
292        kuutionAivot.Active = true;
293        kuutioAika.Interval = 60;
294        kuutioAika.Trigger += poistaKuutio;
295        kuutioAika.Start();
296        kuutionAivot.Speed = 200;
297        uusiKohde();
298
299        AddCollisionHandler(kuutio, syo);
300        Add(kuutio);
301        ihanKaikki.Add(kuutio);
302    }
303    void poistaKuutio(Timer sender)
304    {
305        kuutio.Destroy();
306        onKuutioita = false;
307    }
308    void aseta (PhysicsObject hahmoAseta, Vector liike2)
309    {
310        hahmoAseta.Push(liike2);
311    }
312    void osu(PhysicsObject objekti, PhysicsObject kohde)
313    {
314        bool a1 = false;
315        bool a2 = false;
316
317        if (Keyboard.GetKeyState(Key.Up) == ButtonState.Down ||
318            Keyboard.GetKeyState(Key.Down) == ButtonState.Down ||
319            Keyboard.GetKeyState(Key.Left) == ButtonState.Down ||
320            Keyboard.GetKeyState(Key.Right) == ButtonState.Down)
321        {
322            a1 = true;
323        }
324        else
325        {
326            a1 = false;
327        }
328
329        if (Keyboard.GetKeyState(Key.W) == ButtonState.Down ||
330            Keyboard.GetKeyState(Key.S) == ButtonState.Down ||
331            Keyboard.GetKeyState(Key.A) == ButtonState.Down ||
332            Keyboard.GetKeyState(Key.D) == ButtonState.Down)
333        {
334            a2 = true;
335        }
336        else
337        {
338            a2 = false;
339        }
340
341        switch (kohde.Tag.ToString())
342        {
343            case "tahti":
344                if ((objekti == hahmo) && (a1 == true))
345                {
346                    tahtiAani.Play();
347                    kohde.Destroy();
348                    pisteLaskuri1.Value++;
349                }
350                if ((objekti == hahmo2) && (a2 == true))
351                {
352                    tahtiAani.Play();
353                    kohde.Destroy();
354                    pisteLaskuri2.Value++;
355                }
356                break;
357
358            case "erikuutio":
359
360                if (onKuutioita == false)
361                {
362                    //keraaAani.Play();
363                    kohde.Destroy();
364                    luoKuutio();
365                    return;
366                }
367                else
368                {
369                    MessageDisplay.Add("Odota ensin edellisen Rohmukuution poistumista");
370                }
371                break;
372            case "eristop":
373                foreach (PhysicsObject kaikkiOb in kaikki)
374                {
375                    kaikkiOb.Stop();
376                }
377                kohde.Destroy();
378                break;
379            default:
380                break;
381        }
382    }
383    void luoTaulu ()
384    {
385        taulu = PhysicsObject.CreateStaticObject(Level.Width, 30, Shape.Rectangle, CollisionShapeQuality.Best);
386        taulu.Restitution = 1;
387        taulu.KineticFriction = 0;
388        taulu.X = 0;
389        taulu.Y = Level.Bottom - 15;
390        taulu.Color = Color.DarkGray;
391        Add(taulu);
392    }
393    void syo(PhysicsObject kuutio, PhysicsObject ruoka)
394    {
395        if ((ruoka == kuutionAivot.Target))
396        {
397            //syoAani.Play();
398            ruoka.Destroy();
399            uusiKohde();
400        }
401    }
402    void uusiKohde()
403    {
404        if (pallot.Count == 0)
405        {
406            kuutio.Destroy();
407            onKuutioita = false;
408            return;
409        }
410        kuutionAivot.Target = pallot[pallot.Count - 1];
411        pallot.RemoveAt(pallot.Count - 1);
412    }
413    void Valikko()
414    {
415        ClearAll();
416        Level.BackgroundColor = Color.Black;
417        valikonKohdat = new List<Label>();
418
419        Label kohta1 = new Label("Pelaa");
420        kohta1.Position = new Vector(0, 90);
421        valikonKohdat.Add(kohta1);
422
423        Label kohta2 = new Label("Ohjeet");
424        kohta2.Position = new Vector(0, 30);
425        valikonKohdat.Add(kohta2);
426
427        Label kohta3 = new Label("Parhaat pisteet");
428        kohta3.Position = new Vector(0, -30);
429        valikonKohdat.Add(kohta3);
430
431        Label kohta4 = new Label("Sulje");
432        kohta4.Position = new Vector(0, -90);
433        valikonKohdat.Add(kohta4);
434
435        foreach (Label valikonKohta in valikonKohdat)
436        {
437            Add(valikonKohta);
438        }
439
440        Mouse.ListenOn(kohta1, MouseButton.Left, ButtonState.Pressed, maara, null);
441        Mouse.ListenOn(kohta2, MouseButton.Left, ButtonState.Pressed, ohjeet, null);
442        Mouse.ListenOn(kohta3, MouseButton.Left, ButtonState.Pressed, pisteet, null);
443        Mouse.ListenOn(kohta4, MouseButton.Left, ButtonState.Pressed, Exit, null);
444
445        Mouse.IsCursorVisible = true;
446        Mouse.ListenMovement(1.0, ValikossaLiikkuminen, null);
447    }
448    void ValikossaLiikkuminen(AnalogState hiirenTila)
449    {
450        foreach (Label kohta in valikonKohdat)
451        {
452            if (Mouse.IsCursorOn(kohta))
453            {
454                kohta.TextColor = Color.Lime;
455            }
456            else
457            {
458                kohta.TextColor = Color.White;
459            }
460
461        }
462    }
463    void ohjeet()
464    {
465        Window ohjeIkkuna = new Window();
466        ohjeIkkuna.Title.Text = "Ohjeet";
467        Add(ohjeIkkuna);
468
469        Label tarina = new Label("Pelaaja 1: Oikea nuoli - Liiku oikealle");
470        tarina.Width = 300;
471        tarina.SizeMode = TextSizeMode.Wrapped;
472        ohjeIkkuna.ClientArea.Add(tarina);
473    }
474    void pisteet()
475    {
476        HighScoreWindow topIkkuna = new HighScoreWindow("Parhaat pisteet",
477                              "Tähteä minuutissa",
478                              topLista);
479        topIkkuna.Closed += TallennaPisteet;
480        Add(topIkkuna);
481    }
482    void lisaaAikaa(Timer sender)
483    {
484        aika++;
485    }
486    void maara()
487    {
488        InputWindow kysymysIkkuna = new InputWindow("Pelaa", "Kuinka monta pelaajaa? (1-2)");
489        kysymysIkkuna.TextEntered += kasitteleMaara;
490        Add(kysymysIkkuna);
491    }
492    void kasitteleMaara(InputWindow ikkuna)
493    {
494        string vastaus = ikkuna.InputBox.Text;
495        if (vastaus == "1")
496        {
497            AloitaPeli(1);
498        }
499        if (vastaus == "2")
500        {
501            AloitaPeli(2);
502        }
503        if ((vastaus != "1") && (vastaus != "2"))
504        {
505             maara();
506            Window virheIkkuna = new Window();
507            virheIkkuna.Title.Text = "Virhe";
508            Add(virheIkkuna);
509
510            Label tarina = new Label("Kirjoita 1 tai 2");
511            tarina.Width = 300;
512            tarina.SizeMode = TextSizeMode.Wrapped;
513            virheIkkuna.ClientArea.Add(tarina);
514        }
515    }
516    void TallennaPisteet(Window sender)
517    {
518        DataStorage.Save<ScoreList>(topLista, "parhaat_pisteet.xml");
519        Valikko();
520    }
521
522}
Note: See TracBrowser for help on using the repository browser.