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

Revision 1614, 7.3 KB checked in by anlakane, 11 years ago (diff)

Pistelaskuri.

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