source: aleksi_h/Pallopeli/Peli.cs @ 136

Revision 136, 11.1 KB checked in by aledhiet, 10 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using Microsoft.Xna.Framework;
5using Microsoft.Xna.Framework.Audio;
6using Microsoft.Xna.Framework.Content;
7using Microsoft.Xna.Framework.Graphics;
8using Microsoft.Xna.Framework.Input;
9using Microsoft.Xna.Framework.Media;
10using Jypeli;
11using Jypeli.ScreenObjects;
12using Jypeli.Assets;
13using AdvanceMath;
14using Physics2DDotNet;
15using Physics2DDotNet.Shapes;
16
17namespace Pallopeli
18{
19    // Yksinkertainen tasohyppely.
20    class Tasohyppely : PhysicsGame
21    {
22        #region Muuttujat
23
24        const double liikeVoima = 4000;
25        const double hyppyVoima = 2500;
26
27        Meter<int> elamaLaskuri;
28        ValueDisplay elamaNaytto;
29
30        PlatformCharacter pelaaja1;
31        PhysicsObject maali;
32
33        Timer sekuntiKello = new Timer();
34
35        int kenttaNro;
36        int keratytTahdet = 0;
37        int sekunnit;
38
39        // monesko kenttä on menossa
40        #endregion
41
42
43        #region Alustukset
44        protected override void LoadContent()
45        {
46            SetWindowSize(true);
47
48            // Asetetaan kentän numero nollaksi, jota kasvatetaan kentän latauksessa (aina siis vähintään 1)
49            kenttaNro = 0;
50
51            DrawPerimeter = false; // ei haluta piirtää kentän reunoja
52
53            // Luodaan pistelaskuri
54            elamaLaskuri = new Meter<int>(3, 0, 3);
55
56            // Asetetaan painovoima
57            Gravity = new Vector2D(0, -500);
58
59            // Zoomataan lähemmäksi
60            Camera.ZoomFactor = 2.0;
61
62            aloitaUusiPeli();
63
64        }
65
66        void aloitaUusiPeli()
67        {
68            MessageDisplay.Clear();
69
70            kenttaNro = 0;
71            keratytTahdet = 0;
72
73            Level = seuraavaKentta();
74
75            sekuntiKello.Interval = 1;
76            sekuntiKello.Trigger += new Timer.TriggerHandler(paivita);
77            AddTimer(sekuntiKello);
78            sekuntiKello.Start();
79            sekunnit = 0;
80
81            // Laitetaan peliohje näyttöön
82            MessageDisplay.TextColor = Color.White;
83            MessageDisplay.Add("Kerää kaikki kultakimpaleet ja mene maaliin");
84            MessageDisplay.Add("Mutta varo kiviä...");
85            MessageDisplay.Add("Peliohjeet F1");
86
87            elamaNaytto = new ValueDisplay(this);
88            elamaNaytto.TextColor = Color.White;
89            elamaNaytto.ValueColor = Color.White;
90            elamaNaytto.Text = "Elämät: ";
91            elamaNaytto.X = Screen.RightSafe - 250;
92            elamaNaytto.Y = Screen.TopSafe - 50;
93            elamaNaytto.BindTo(elamaLaskuri);
94            Add(elamaNaytto);
95
96        }
97
98        void paivita(Timer sender)
99        {
100            ++sekunnit;
101        }
102
103        #endregion
104
105
106        #region KentanLataus
107
108        Level seuraavaKentta()
109        {
110            elamaLaskuri.Reset();
111            kenttaNro += 1; // lisätään kenttänumeroa yhdellä
112            Level seuraava = luoKentta();
113            lisaaNappaimet();
114            Camera.Follow(pelaaja1);
115            return seuraava;
116        }
117
118        Level luoKentta()
119        {
120            Level kentta = new Level(this, 2000, 1000);
121            kentta.CreateBorder();
122            kentta.Borders.Visible = false;
123            kentta.BackgroundColor = Color.Black;
124
125            Platform alusta = new Platform(kentta.Width, 300, Color.Brown);
126            alusta.X = 0;
127            alusta.Y = kentta.Bottom - alusta.Height / 2;
128            kentta.Objects.Add(alusta);
129
130            lisaaPieniTaso(kentta, -200, -350);
131            lisaaPieniTaso(kentta, 0, -200);
132            lisaaPieniTaso(kentta, 400, -150);
133
134            lisaaPieniTaso(kentta, 200, -340);
135
136            lisaaPieniTaso(kentta, 600, 0);
137            lisaaPieniTaso(kentta, 400, 100);
138            lisaaPieniTaso(kentta, 0, 300);
139
140            lisaaMaali(kentta);
141            lisaaPelaaja(kentta);
142            lisaaTahdet(kentta);
143
144            lisaaViholliset(kentta, 5);
145
146            return kentta;
147        }
148
149        void lisaaPieniTaso(Level kentta, double x, double y)
150        {
151            Platform taso = new Platform(100, 30, Color.Brown);
152            taso.X = x;
153            taso.Y = y;
154            kentta.Objects.Add(taso);
155        }
156
157        void lisaaPelaaja(Level kentta)
158        {
159            pelaaja1 = new PlatformCharacter(4, Shapes.CreateCircle(20));
160            pelaaja1.X = 0;
161            pelaaja1.Y = kentta.Bottom + 120;
162
163            AddCollisionHandler(pelaaja1, osuiMaaliin);
164
165            kentta.Objects.Add(pelaaja1);
166        }
167
168        void lisaaTahdet(Level kentta)
169        {
170            for (int i = 0; i < 20; i++)
171            {
172                PhysicsObject tahti = new PhysicsObject(0.005, Shapes.CreateCircle(12));
173                tahti.X = RandomGen.NextDouble(-475.0, 475.0);
174                tahti.Y = 400.0;
175                tahti.Restitution = 1.0;
176                tahti.Texture = Content.Load<Texture2D>("kultakimpale");
177                AddCollisionHandler(tahti, keraa);
178                kentta.Objects.Add(tahti);
179
180            }
181        }
182
183        void lisaaMaali(Level kentta)
184        {
185            maali = PhysicsObject.CreateStaticObject(Shapes.CreateCircle(25));
186            maali.Tag = "maali";
187            maali.IgnoresCollisionResponse = true;
188            maali.X = 0;
189            maali.Y = 325;
190            maali.Texture = Content.Load<Texture2D>("maali");
191            maali.Visible = false;
192            kentta.Objects.Add(maali);
193        }
194
195        void lisaaViholliset(Level kentta, int kpl)
196        {
197            for (int i = 0; i < kpl; i++)
198            {
199                PlatformCharacter vihollinen = new PlatformCharacter(100, Shapes.CreateCircle(30));
200                vihollinen.Texture = Content.Load<Texture2D>("vihollinen");
201                vihollinen.Brain = new RandomMoverBrain();
202                vihollinen.X = maali.X;
203                vihollinen.Y = maali.Y;
204                vihollinen.IgnoresGravity = true;
205                AddCollisionHandler(vihollinen, tuuppaa);
206                kentta.Objects.Add(vihollinen);
207            }
208        }
209        #endregion
210
211
212        #region Nappaimet
213        // Lisää peliin kaikki näppäimet
214        void lisaaNappaimet()
215        {
216            //Yleiset näppäimet
217            Controls.Listen(Keys.Enter, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
218
219            // Pelaajan näppäimet
220            Controls.Listen(Keys.Left, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector2D(-liikeVoima, 0));
221            Controls.Listen(Keys.Right, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja1, new Vector2D(liikeVoima, 0));
222            Controls.Listen(Keys.Up, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja1, hyppyVoima);
223            Controls.Listen(Keys.F1, ButtonPosition.Pressed, ohjeet);
224        }
225
226        bool ohjeet(ControlEvent e)
227        {
228            MessageDisplay.Clear();
229            MessageDisplay.Add("Poistu painamalla ESC");
230            return false;
231        }
232
233        bool liikuta(ControlEvent e)
234        {
235            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
236            Vector2D voima = e.Parameter1.ToVector2D();
237            hahmo.Walk(e.Time, voima);
238            return false;
239        }
240
241        bool hyppaa(ControlEvent e)
242        {
243            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
244            double voima = e.Parameter1.ToDouble();
245
246            if (hahmo.Jump(voima))
247            {
248                this.PlaySound("hyppays");
249            }
250            return false;
251        }
252
253        bool uusiPeli(ControlEvent e)
254        {
255            aloitaUusiPeli();
256            return true;
257        }
258        #endregion
259
260
261        #region Tapahtumat
262        // Kun osutaan maaliin
263        void osuiMaaliin(Collision collision)
264        {
265            if (maali.Visible == true)
266            {
267                if (collision.Other.Tag == "maali")
268                {
269                    if (keratytTahdet == 20)
270                    {
271                        this.PlaySound("maali");
272                        Level.Clear();
273                        elamaNaytto.Visible = false;
274
275                        MessageDisplay.TextColor = Color.White;
276                        MessageDisplay.Add("Voitit pelin");
277                        MessageDisplay.Add("Sekunteja kului: " + sekunnit.ToString());
278                        MessageDisplay.Add("Uusi peli painamalla Enter");
279                        MessageDisplay.Add("Poistu painamalla ESC");
280                    }
281                }
282            }
283        }
284
285        // Kerää tähden ja antaa pisteen
286        void keraa(Collision collision)
287        {
288            if (collision.Other.Equals(pelaaja1))
289            {
290                PhysicsObject tahti = collision.Obj;
291                tahti.Lifetime.IsExpired = true;
292
293                this.PlaySound("kerays", -0.5, 0.5);
294                ++keratytTahdet;
295
296                if (keratytTahdet == 20)
297                {
298                    maali.Visible = true;
299                    MessageDisplay.Clear();
300                    MessageDisplay.Add("Voit nyt mennä maaliin!");
301                }
302            }
303        }
304
305        // Haamu tuuppaa pelaajaa
306        void tuuppaa(Collision collision)
307        {
308                if (collision.Other == pelaaja1)
309                {
310                    // pieni värinä törmäyksestä
311                    Controls.GameControllers[PlayerIndex.One].Vibrate(0.5, 0.5, 0.0, 0.0, 0.1);
312
313                    elamaLaskuri.Value -= 1;
314
315                    double x = RandomGen.NextDouble(-10000, 10000);
316                    double y = RandomGen.NextDouble(-10000, 10000);
317
318                    Vector2D vektori = new Vector2D(x, y);
319                    pelaaja1.Hit(vektori);
320
321                    elamaNaytto.TextColor = Color.White;
322                    elamaNaytto.X = Screen.RightSafe - 250;
323                    elamaNaytto.Y = Screen.TopSafe - 50;
324                    elamaNaytto.BindTo(elamaLaskuri);
325                    Add(elamaNaytto);
326
327                    if (elamaLaskuri.Value == 0)
328                    {
329                        MessageDisplay.Clear();
330                        Level.Clear();
331
332                        MessageDisplay.Add("Pallo puhkesi");
333                        MessageDisplay.Add("Sekunteja kului: " + sekunnit.ToString());
334                        MessageDisplay.Add("Uusi peli painamalla Enter");
335                        MessageDisplay.Add("Poistu painamalla ESC");
336
337                        IShape ympyra = Shapes.CreateCircle(20.0);
338                        PhysicsObject pallo = new PhysicsObject(10.0, ympyra);
339                        pallo.Texture = Content.Load<Texture2D>("pallo");
340                        pallo.X = 0;
341                        pallo.Y = 0;
342                        Level.Objects.Add(pallo);
343                        Camera.Follow(pallo);
344                    }
345                }
346                this.PlaySound("tuuppaus");
347            }
348        }
349        #endregion
350    }
Note: See TracBrowser for help on using the repository browser.