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

Revision 1609, 4.7 KB checked in by hniemi, 10 years ago (diff)

Kääntymistä paranneltu, reunoja säädetty

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    const int madonPituus = 6;
12    const double vaikeusaste = 0.2;
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
22    protected override void Begin()
23    {
24        LuoKentta();
25        LuoLiikutusAjastin();
26        LuoMato(madonPituus);
27        LisaaOhjaimet();
28        AloitaPeli();
29    }
30
31    void LuoKentta()
32    {
33        Level.Height = 500;
34        Level.Width = 500;
35        Level.CreateBorders(true);
36        ruutujaPystysuunnassa = (int)Math.Floor(Level.Height / ruudunKoko);
37        ruutujaVaakasuunnassa = (int)Math.Floor(Level.Width / ruudunKoko);
38    }
39
40    void LuoMato(int pituus)
41    {
42        for (int i = 0; i < pituus-1; i++)
43        {
44            mato.Add(new GameObject(ruudunKoko - 1, ruudunKoko - 1));
45            mato[i].Tag = "matopala";
46            Add(mato[i]);
47        }
48        //Luo madon pään viimeiseksi, jotta sen pään värin muuttaminen näkyy
49        //Aka. Too lazy for layers
50        mato.Insert(0, new GameObject(ruudunKoko - 1, ruudunKoko - 1));
51        mato[0].Tag = "matopala";
52        Add(mato[0]); 
53    }
54
55    void LisaaOhjaimet()
56    {
57        Keyboard.Listen(Key.Up, ButtonState.Pressed, AsetaSuunta, "Kääntää ylös", Direction.Up);
58        Keyboard.Listen(Key.Down, ButtonState.Pressed, AsetaSuunta, "Kääntää alas", Direction.Down);
59        Keyboard.Listen(Key.Left, ButtonState.Pressed, AsetaSuunta, "Kääntää vasemmalle", Direction.Left);
60        Keyboard.Listen(Key.Right, ButtonState.Pressed, AsetaSuunta, "Kääntää oikealle", Direction.Right);
61        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Poistuu pelistä");
62    }
63
64    void LuoKerattava()
65    {
66        GameObject kerattava = new GameObject(ruudunKoko / 2, ruudunKoko / 2, Shapes.Circle);
67       
68        Add(kerattava);
69        kerattavat.Add(kerattava);
70
71    }
72
73    /// <summary>
74    /// Asettaa madon liikkumissuunnan
75    ///
76    /// Ei voi asettaa menemään matoa taaksepäin
77    /// </summary>
78    /// <param name="suunta">Asetettava suunta</param>
79    void AsetaSuunta(Direction suunta)
80    {
81        if (Directions.Inverse(suunta) != viimesuunta) liikkumissuunta = suunta;
82    }
83
84    void LuoLiikutusAjastin()
85    {
86        liikutusajastin = new Timer();
87        liikutusajastin.Interval = vaikeusaste;
88        liikutusajastin.Trigger += SiirraMatoa;
89    }
90
91    void SiirraMatoa(Timer ajastin)
92    {
93        Vector suunta = Vector.FromLengthAndAngle(ruudunKoko, Angle.FromDirection(liikkumissuunta));
94
95        for (int i = mato.Count-1; i > 0; i--)
96        {
97            mato[i].Position = mato[i - 1].Position;
98        }
99
100        GameObject tormasiko = MitaSisaltaa(mato[0].Position + suunta);
101
102        mato[0].Position = mato[0].Position + suunta;
103
104        if (tormasiko != null && (tormasiko.Tag.ToString() == "seina" || tormasiko.Tag.ToString() == "matopala"))
105        {
106            liikutusajastin.Stop();
107            mato[0].Color = Color.Blue;
108        }
109        viimesuunta = liikkumissuunta;
110    }
111
112    /// <summary>
113    /// Palauttaa annetun koordinaatin sisällön
114    ///
115    /// Etsii ainoastaan kerättävistä, madosta ja seinistä.
116    ///
117    /// Seinien peliobjektin tag on "seina"
118    /// </summary>
119    /// <param name="paikka">Tarkistettava paikka</param>
120    /// <returns>null, jos paikasta ei löydy mitään</returns>
121    GameObject MitaSisaltaa(Vector paikka)
122    {
123        double puskuri = ruudunKoko / 5;
124
125        //Tarkistaa, onko annettu paikka madon sisällä
126        foreach (GameObject matopala in mato)
127        {
128            if (Vector.Distance(paikka, matopala.Position) < puskuri)
129            {
130                return matopala;
131            }
132        }
133
134        foreach (GameObject kerattava in kerattavat)
135        {
136            if (Vector.Distance(paikka, kerattava.Position) < puskuri)
137            {
138                return kerattava;
139            }
140        }
141
142        //Tarkistaa, onko paikka pelialueen ulkopuolella
143        GameObject seina = new GameObject(1, 1);
144        seina.Tag = "seina";
145        if (paikka.X < Level.Left || paikka.X > Level.Right) return seina;
146        if (paikka.Y < Level.Bottom || paikka.Y > Level.Top) return seina;
147
148        return null;
149        }
150
151    void AloitaPeli()
152    {
153        liikkumissuunta = Direction.Right;
154        liikutusajastin.Start();
155    }
156}
Note: See TracBrowser for help on using the repository browser.