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

Revision 1615, 8.0 KB checked in by anlakane, 9 years ago (diff)

Lisää kerättäviä kuvia yms.

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
14    int ruutujaVaakasuunnassa;
15    int ruutujaPystysuunnassa;
16    List<GameObject> mato = new List<GameObject>();
17    List<GameObject> kerattavat = new List<GameObject>();
18    Direction liikkumissuunta;
19    Direction viimesuunta;
20    Timer liikutusajastin;
21    Timer kerattavienLisaysAjastin;
22    IntMeter pistelaskuri;
23
24    String[] kerattavienVaihtoehdot = new String[] {"nopeus", "omena"};
25    Image nopeusKuva = LoadImage("nopeus");
26    Image omenaKuva = LoadImage("omena");
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        mato.Insert(0, new GameObject(ruudunKoko - 1, ruudunKoko - 1));
57        mato[0].Tag = "matopala";
58        Add(mato[0], 1);
59
60    }
61
62    void LisaaPalaMatoon()
63    {
64        GameObject pala = new GameObject(ruudunKoko - 1, ruudunKoko - 1);
65        pala.Tag = "matopala";
66        if(mato.Count>0) pala.Position = mato[mato.Count - 1].Position;
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 += LisaaSatunnainenKerattava;
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    void LisaaSatunnainenKerattava(Timer ajastin)
151    {
152        int arvottavaIndeksi = RandomGen.NextInt(0, kerattavienVaihtoehdot.Length - 1);
153        LisaaKerattava(kerattavienVaihtoehdot[arvottavaIndeksi]);
154    }
155
156    /// <summary>
157    /// Lisää kerättävän esineen satunnaiseen paikkaan pelikentällä.
158    /// Ei lisätä kentällä jo olemassa olevien kamojen päälle.
159    /// </summary>
160    /// <param name="ajastin"></param>
161    void LisaaKerattava(String kerattavanNimi)
162    {
163        double kerattavanX = RandomGen.NextInt(-ruutujaVaakasuunnassa/2, ruutujaVaakasuunnassa/2) * ruudunKoko;
164        double kerattavanY = RandomGen.NextInt(-ruutujaPystysuunnassa/2, ruutujaPystysuunnassa/2) * ruudunKoko;
165        MessageDisplay.Add(kerattavat.Count.ToString());
166        if (kerattavat.Count >= ruutujaVaakasuunnassa * ruutujaPystysuunnassa - madonPituus) return;
167
168        while (MitaSisaltaa(new Vector(kerattavanX, kerattavanY)) != null)
169        {
170            kerattavanX = RandomGen.NextInt(-ruutujaVaakasuunnassa / 2, ruutujaVaakasuunnassa / 2) * ruudunKoko;
171            kerattavanY = RandomGen.NextInt(-ruutujaPystysuunnassa / 2, ruutujaPystysuunnassa / 2) * ruudunKoko;
172        }
173
174               
175        GameObject kerattava = new GameObject(ruudunKoko, ruudunKoko, Shapes.Rectangle);
176        Add(kerattava);
177        kerattava.X = kerattavanX;
178        kerattava.Y = kerattavanY;
179        kerattava.Tag = "kerattava_" + kerattavanNimi;
180        Image kerattavanKuva = Image.FromColor((int)ruudunKoko, (int)ruudunKoko, Color.White);
181        switch (kerattavanNimi)
182        {
183            case "nopeus":
184                kerattavanKuva = nopeusKuva;
185                break;
186            case "omena":
187                kerattavanKuva = omenaKuva;
188                break;
189        }
190        kerattava.Image = kerattavanKuva;
191        kerattavat.Add(kerattava);
192    }
193
194    /// <summary>
195    /// Palauttaa annetun koordinaatin sisällön
196    ///
197    /// Etsii ainoastaan kerättävistä, madosta ja seinistä.
198    ///
199    /// Seinien peliobjektin tag on "seina"
200    /// </summary>
201    /// <param name="paikka">Tarkistettava paikka</param>
202    /// <returns>Ruudun sisältämä GameObject. Palauttaa null, jos paikasta ei löydy mitään.</returns>
203    GameObject MitaSisaltaa(Vector paikka)
204    {
205        double puskuri = ruudunKoko / 2;
206
207        //Tarkistaa, onko annettu paikka madon sisällä
208        foreach (GameObject matopala in mato)
209        {
210            if (Vector.Distance(paikka, matopala.Position) < puskuri)
211            {
212                return matopala;
213            }
214        }
215
216        foreach (GameObject kerattava in kerattavat)
217        {
218            if (Vector.Distance(paikka, kerattava.Position) < puskuri)
219            {
220                return kerattava;
221            }
222        }
223
224        //Tarkistaa, onko paikka pelialueen ulkopuolella
225        GameObject seina = new GameObject(1, 1);
226        seina.Tag = "seina";
227        if (paikka.X < Level.Left || paikka.X > Level.Right) return seina;
228        if (paikka.Y < Level.Bottom || paikka.Y > Level.Top) return seina;
229
230        return null;
231    }
232
233    void AloitaPeli()
234    {
235        liikkumissuunta = Direction.Right;
236        liikutusajastin.Start();
237        kerattavienLisaysAjastin.Start();
238    }
239}
Note: See TracBrowser for help on using the repository browser.