source: aleksi_h/Pallopeli/Peli.cs @ 162

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