source: 2010/23/hniemi/JyTris/JyTris/Peli.cs @ 1478

Revision 1478, 6.6 KB checked in by hniemi, 11 years ago (diff)

Tiedostot lisätty.

Toimiva pitkä palikka, jota voidaan liikuttaa ja joka tippuu.

Line 
1using System;
2using Jypeli;
3using Jypeli.ScreenObjects;
4using Jypeli.Assets;
5
6namespace JyTris
7{
8    public class Peli : Game
9    {
10        const int leveys = 10;
11        const int korkeus = 26;
12        const int palikkojenSivu = 30;
13
14        GameObject[][] pelikentta;
15        ITetrispalikka aktiivinenPalikka;
16
17        Timer tiputusajastin;
18        double vaikeusaste = 0.2;
19
20        protected override void Begin()
21        {
22            LuoPelikentta();
23            AsetaNappaimet();
24            KaynnistaPeli();
25            //pelikentta[9][5].Color = Color.Turquoise;
26        }
27
28        void KaynnistaPeli()
29        {
30            LuoPalikka();
31
32            tiputusajastin = new Timer();
33            tiputusajastin.Interval = vaikeusaste;
34            tiputusajastin.Trigger += Laske;
35            tiputusajastin.Start();
36        }
37
38        void TuhoaTaydet()
39        {
40            bool tyhjia;
41
42            for (int i = 0; i < pelikentta.Length; i++)
43            {
44                tyhjia = false;
45                for (int j = 0; j < pelikentta[i].Length; j++)
46                {
47                    if (pelikentta[i][j].Color == Color.TransparentWhite) tyhjia = true;
48                }
49
50                if (!tyhjia)
51                {
52                    TuhoaRivi(i);
53                }
54            }
55        }
56
57        void TuhoaKaikki()
58        {
59            //Tässä käydään lävitse kaikki laatikot ja asetetaan ne läpinäkyviksi.
60            for (int i = 0; i < pelikentta.Length; i++)
61            {
62                for (int j = 0; j < pelikentta[i].Length; j++)
63                {
64                    pelikentta[i][j].Color = Color.TransparentWhite;
65                }
66            }
67        }
68
69        void TuhoaRivi(int rivinIndeksi)
70        {
71            if (rivinIndeksi > pelikentta.Length || rivinIndeksi < 0) return;
72
73            for (int i = rivinIndeksi; i > 0; i--)
74            {
75                for (int j = 0; j < pelikentta[i].Length; j++)
76                {
77                    pelikentta[i][j].Color = pelikentta[i - 1][j].Color;
78                }
79            }
80
81            for (int i = 0; i < pelikentta[0].Length; i++)
82            {
83                pelikentta[0][i].Color = Color.TransparentWhite;
84            }
85        }
86
87        void LuoPelikentta()
88        {
89            //Tässä säädetään pelialueen koko, jotta seinät tulevat oikeille kohdille
90            Level.Width = leveys * palikkojenSivu + leveys;
91            Level.Height = korkeus * palikkojenSivu + korkeus;
92            Level.CreateBorders(true);
93
94            /*
95             * Koska pelikenttä on kaksiulotteinen taulukko, joudumme luomaan
96             * ensiksi taulukon sarakkeet, jotta voimme luoda rivit.
97             */
98            pelikentta = new GameObject[korkeus][];
99            for (int i = 0; i < pelikentta.Length; i++)
100            {
101                pelikentta[i] = new GameObject[leveys];
102            }
103
104            //Tässä luodaan pelikentän "laatiko" ja sijoitetaan ne oikeille kohdilleen.
105            for (int i = 0; i < pelikentta.Length; i++)
106            {
107                for (int j = 0; j < pelikentta[i].Length; j++)
108                {
109                    pelikentta[i][j] = new GameObject(palikkojenSivu, palikkojenSivu, Shapes.Rectangle);
110                    pelikentta[i][j].Color = Color.TransparentWhite;
111                    pelikentta[i][j].X = Level.Left + (palikkojenSivu / 2) + j * (palikkojenSivu + 1);
112                    pelikentta[i][j].Y = Level.Top - (palikkojenSivu / 2) - i * (palikkojenSivu + 1);
113                    Add(pelikentta[i][j]);
114                }
115            }
116        }
117
118        void AsetaNappaimet()
119        {
120            Vector vasemmalle = new Vector(-1, 0);
121            Vector oikealle = new Vector(1, 0);
122            Vector alas = new Vector(0, 1);
123
124            Keyboard.Listen(Key.Left, ButtonState.Pressed, Liikuta, "Liikuttaa palikkaa vasemmalle", vasemmalle);
125            Keyboard.Listen(Key.Right, ButtonState.Pressed, Liikuta, "Liikuttaa palikkaa oikealle", oikealle);
126            Keyboard.Listen(Key.Down, ButtonState.Pressed, Laske, "Liikuttaa palikkaa alas", tiputusajastin);
127            Keyboard.Listen(Key.Space, ButtonState.Pressed, Tiputa, "Tiputtaa palikan");
128        }
129
130        void Liikuta(Vector suunta)
131        {
132            PaivitaPalikka(aktiivinenPalikka, Color.TransparentWhite);
133
134            if (VoikoSiirtaa(suunta, aktiivinenPalikka))
135            {
136                aktiivinenPalikka.Liikuta(suunta);
137            }
138           
139            PaivitaPalikka(aktiivinenPalikka, aktiivinenPalikka.Vari());
140        }
141
142        void Laske(Timer timer)
143        {
144            PaivitaPalikka(aktiivinenPalikka, Color.TransparentWhite);
145
146            if (!VoikoSiirtaa(new Vector(0,1), aktiivinenPalikka))
147            {
148                PaivitaPalikka(aktiivinenPalikka, aktiivinenPalikka.Vari());
149                LuoPalikka();
150                return;
151            }
152            aktiivinenPalikka.Liikuta(new Vector(0, 1));
153            PaivitaPalikka(aktiivinenPalikka, aktiivinenPalikka.Vari());
154        }
155
156        void Tiputa()
157        {
158
159        }
160
161        bool VoikoSiirtaa(Vector[] siirrot, ITetrispalikka palikka)
162        {
163            Vector[] sijainnit = palikka.Sijainti();
164
165            for (int i = 0; i < siirrot.Length; i++)
166            {
167                if (!OnkoTyhja(sijainnit[i] + siirrot[i])) return false;
168            }
169            return true;
170        }
171
172        bool VoikoSiirtaa(Vector siirto, ITetrispalikka palikka)
173        {
174            Vector[] siirrot = new Vector[4];
175            for (int i = 0; i < siirrot.Length; i++)
176            {
177                siirrot[i] = siirto;
178            }
179            return VoikoSiirtaa(siirrot, palikka);
180        }
181
182        bool OnkoTyhja(Vector paikka)
183        {
184            if (paikka.X > leveys-1 || paikka.X < 0) return false;
185            if (paikka.Y > korkeus-1 || paikka.Y < 0) return false;
186
187            if (pelikentta[(int)paikka.Y][(int)paikka.X].Color == Color.TransparentWhite) return true;
188            return false;
189        }
190
191        void PaivitaPalikka(ITetrispalikka palikka, Color vari)
192        {
193            Vector[] sijainnit = palikka.Sijainti();
194
195            for (int i = 0; i < sijainnit.Length; i++)
196            {
197                pelikentta[(int)sijainnit[i].Y][(int)sijainnit[i].X].Color = vari;
198            }
199        }
200
201        void LuoPalikka()
202        {
203            aktiivinenPalikka = new Pitka(leveys / 2);
204            PaivitaPalikka(aktiivinenPalikka, aktiivinenPalikka.Vari());
205        }
206
207    }
208}
Note: See TracBrowser for help on using the repository browser.