source: 2010/23/hniemi/Matopeli/Peli.cs @ 1638

Revision 1638, 8.3 KB checked in by hniemi, 13 years ago (diff)

Pause liässty

Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Widgets;
5using Jypeli.Assets;
6
7public class Peli : Game
8{
9    const double ruudunKoko = 20;
10    int madonPituus = 6;
11    const double vaikeusaste = 0.2;
12    double kerattavienLisaysAikaSek = 1.0;
13    bool peliPysaytetty = false;
14
15    int ruutujaVaakasuunnassa;
16    int ruutujaPystysuunnassa;
17    List<GameObject> mato = new List<GameObject>();
18    List<GameObject> kerattavat = new List<GameObject>();
19    Direction liikkumissuunta;
20    Direction viimesuunta;
21    Timer liikutusajastin;
22    Timer kerattavienLisaysAjastin;
23    IntMeter pistelaskuri;
24
25    String[] kerattavienVaihtoehdot = new String[] {"nopeus", "omena"};
26    Image nopeusKuva = LoadImage("nopeus");
27    Image omenaKuva = LoadImage("omena");
28
29    protected override void Begin()
30    {
31        LuoKentta();
32        LuoAjastimet();
33        LuoMato(madonPituus);
34        LisaaOhjaimet();
35        LisaaPistelaskuri();
36        AloitaPeli();
37    }
38
39    void LuoKentta()
40    {
41        Level.BackgroundColor = new Color(50, 50, 50);
42        Level.Height = 500;
43        Level.Width = 500;
44        Level.CreateBorders(true);
45        ruutujaPystysuunnassa = (int)Math.Floor(Level.Height / ruudunKoko);
46        ruutujaVaakasuunnassa = (int)Math.Floor(Level.Width / ruudunKoko);
47        Camera.ZoomToLevel();
48        Camera.ZoomFactor /= 1.5;
49    }
50
51    void LuoMato(int pituus)
52    {
53        for (int i = 0; i < pituus - 1; i++)
54        {
55            LisaaPalaMatoon();
56        }
57        mato.Insert(0, new GameObject(ruudunKoko - 1, ruudunKoko - 1));
58        mato[0].Tag = "matopala";
59        Add(mato[0], 1);
60
61    }
62
63    void LisaaPalaMatoon()
64    {
65        GameObject pala = new GameObject(ruudunKoko - 1, ruudunKoko - 1);
66        pala.Tag = "matopala";
67        if(mato.Count>0) pala.Position = mato[mato.Count - 1].Position;
68        mato.Add(pala);
69        Add(pala);
70    }
71
72    void LisaaOhjaimet()
73    {
74        Keyboard.Listen(Key.Up, ButtonState.Pressed, AsetaSuunta, "Kääntää ylös", Direction.Up);
75        Keyboard.Listen(Key.Down, ButtonState.Pressed, AsetaSuunta, "Kääntää alas", Direction.Down);
76        Keyboard.Listen(Key.Left, ButtonState.Pressed, AsetaSuunta, "Kääntää vasemmalle", Direction.Left);
77        Keyboard.Listen(Key.Right, ButtonState.Pressed, AsetaSuunta, "Kääntää oikealle", Direction.Right);
78        Keyboard.Listen(Key.P, ButtonState.Pressed, Pause, "Pysäyttää/Jatkaa");
79        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Poistuu pelistä");
80    }
81
82
83    void Pause()
84    {
85
86        liikutusajastin.Enabled = peliPysaytetty;
87        peliPysaytetty = !peliPysaytetty;
88
89    }
90    void LisaaPistelaskuri()
91    {
92        pistelaskuri = new IntMeter(0);
93        Label pisteteksti = new Label("Pisteesi");
94        pisteteksti.Position = new Vector(0, Screen.Top - 45);
95        pisteteksti.Color = Color.White;
96        Add(pisteteksti);
97
98        Label pistenaytto = new Label();
99        pistenaytto.Position = new Vector(0, Screen.Top - 80);
100        pistenaytto.Color = Color.Magenta;
101        pistenaytto.BindTo(pistelaskuri);
102        Add(pistenaytto);
103    }
104
105    /// <summary>
106    /// Asettaa madon liikkumissuunnan
107    ///
108    /// Ei voi asettaa menemään matoa taaksepäin
109    /// </summary>
110    /// <param name="suunta">Asetettava suunta</param>
111    void AsetaSuunta(Direction suunta)
112    {
113        if (Directions.Inverse(suunta) != viimesuunta) liikkumissuunta = suunta;
114    }
115
116    void LuoAjastimet()
117    {
118        liikutusajastin = new Timer();
119        liikutusajastin.Interval = vaikeusaste;
120        liikutusajastin.Trigger += SiirraMatoa;
121
122        kerattavienLisaysAjastin = new Timer();
123        kerattavienLisaysAjastin.Interval = kerattavienLisaysAikaSek;
124        kerattavienLisaysAjastin.Trigger += LisaaSatunnainenKerattava;
125    }
126
127    void SiirraMatoa(Timer ajastin)
128    {
129        Vector suunta = Vector.FromLengthAndAngle(ruudunKoko, Angle.FromDirection(liikkumissuunta));
130
131        for (int i = mato.Count - 1; i > 0; i--)
132        {
133            mato[i].Position = mato[i - 1].Position;
134        }
135
136        GameObject seuraavanRuudunOlio = MitaSisaltaa(mato[0].Position + suunta);
137        mato[0].Position = mato[0].Position + suunta;
138        viimesuunta = liikkumissuunta;
139
140        if (seuraavanRuudunOlio == null)
141        {
142            return;
143        }
144
145        if (seuraavanRuudunOlio.Tag.ToString().Contains("kerattava")) // Siltä varalta Contains-metodi, että tagissa joutuu jatkossa viemään jotain muutakin
146        {
147            seuraavanRuudunOlio.Destroy();
148            kerattavat.Remove(seuraavanRuudunOlio);
149            pistelaskuri.Value++;
150            LisaaPalaMatoon();
151        }
152
153        if (seuraavanRuudunOlio.Tag.ToString() == "seina" || seuraavanRuudunOlio.Tag.ToString() == "matopala")
154        {
155            liikutusajastin.Stop();
156            kerattavienLisaysAjastin.Stop();
157            mato[0].Color = Color.Blue;
158        }
159    }
160
161    void LisaaSatunnainenKerattava(Timer ajastin)
162    {
163        int arvottavaIndeksi = RandomGen.NextInt(0, kerattavienVaihtoehdot.Length - 1);
164        LisaaKerattava(kerattavienVaihtoehdot[arvottavaIndeksi]);
165    }
166
167    /// <summary>
168    /// Lisää kerättävän esineen satunnaiseen paikkaan pelikentällä.
169    /// Ei lisätä kentällä jo olemassa olevien kamojen päälle.
170    /// </summary>
171    /// <param name="ajastin"></param>
172    void LisaaKerattava(String kerattavanNimi)
173    {
174        double kerattavanX = RandomGen.NextInt(-ruutujaVaakasuunnassa/2, ruutujaVaakasuunnassa/2) * ruudunKoko;
175        double kerattavanY = RandomGen.NextInt(-ruutujaPystysuunnassa/2, ruutujaPystysuunnassa/2) * ruudunKoko;
176        MessageDisplay.Add(kerattavat.Count.ToString());
177        if (kerattavat.Count >= ruutujaVaakasuunnassa * ruutujaPystysuunnassa - madonPituus) return;
178
179        while (MitaSisaltaa(new Vector(kerattavanX, kerattavanY)) != null)
180        {
181            kerattavanX = RandomGen.NextInt(-ruutujaVaakasuunnassa / 2, ruutujaVaakasuunnassa / 2) * ruudunKoko;
182            kerattavanY = RandomGen.NextInt(-ruutujaPystysuunnassa / 2, ruutujaPystysuunnassa / 2) * ruudunKoko;
183        }
184
185               
186        GameObject kerattava = new GameObject(ruudunKoko, ruudunKoko, Shapes.Rectangle);
187        Add(kerattava);
188        kerattava.X = kerattavanX;
189        kerattava.Y = kerattavanY;
190        kerattava.Tag = "kerattava_" + kerattavanNimi;
191        Image kerattavanKuva = Image.FromColor((int)ruudunKoko, (int)ruudunKoko, Color.White);
192        switch (kerattavanNimi)
193        {
194            case "nopeus":
195                kerattavanKuva = nopeusKuva;
196                break;
197            case "omena":
198                kerattavanKuva = omenaKuva;
199                break;
200        }
201        kerattava.Image = kerattavanKuva;
202        kerattavat.Add(kerattava);
203    }
204
205    /// <summary>
206    /// Palauttaa annetun koordinaatin sisällön
207    ///
208    /// Etsii ainoastaan kerättävistä, madosta ja seinistä.
209    ///
210    /// Seinien peliobjektin tag on "seina"
211    /// </summary>
212    /// <param name="paikka">Tarkistettava paikka</param>
213    /// <returns>Ruudun sisältämä GameObject. Palauttaa null, jos paikasta ei löydy mitään.</returns>
214    GameObject MitaSisaltaa(Vector paikka)
215    {
216        double puskuri = ruudunKoko / 2;
217
218        //Tarkistaa, onko annettu paikka madon sisällä
219        foreach (GameObject matopala in mato)
220        {
221            if (Vector.Distance(paikka, matopala.Position) < puskuri)
222            {
223                return matopala;
224            }
225        }
226
227        foreach (GameObject kerattava in kerattavat)
228        {
229            if (Vector.Distance(paikka, kerattava.Position) < puskuri)
230            {
231                return kerattava;
232            }
233        }
234
235        //Tarkistaa, onko paikka pelialueen ulkopuolella
236        GameObject seina = new GameObject(1, 1);
237        seina.Tag = "seina";
238        if (paikka.X < Level.Left || paikka.X > Level.Right) return seina;
239        if (paikka.Y < Level.Bottom || paikka.Y > Level.Top) return seina;
240
241        return null;
242    }
243
244    void AloitaPeli()
245    {
246        liikkumissuunta = Direction.Right;
247        liikutusajastin.Start();
248        kerattavienLisaysAjastin.Start();
249    }
250}
Note: See TracBrowser for help on using the repository browser.