source: aleksi_o/Omapeli/Peli.cs @ 132

Revision 132, 10.3 KB checked in by alalojap, 12 years ago (diff)
Line 
1using System;
2using Microsoft.Xna.Framework;
3using Microsoft.Xna.Framework.Graphics;
4using Microsoft.Xna.Framework.Input;
5using Microsoft.Xna.Framework.Media;
6
7using Physics2DDotNet;
8using AdvanceMath;
9using Jypeli;
10using Jypeli.ScreenObjects;
11using Jypeli.Assets;
12
13
14namespace Omapeli
15{
16    // Yksinkertainen tasohyppely.
17    class Tasohyppely : PhysicsGame
18    {
19        #region Muuttujat
20
21        const double liikeVoima = 4000;
22        const double hyppyVoima = 1000;
23
24        PlatformCharacter pelaaja1;
25        PhysicsObject maali;
26
27        int kenttaNro; // monesko kenttä on menossa
28
29        #endregion
30
31
32        #region Alustukset
33        protected override void LoadContent()
34        {
35            // Asetetaan kentän numero nollaksi, jota kasvatetaan kentän latauksessa (aina siis vähintään 1)
36            kenttaNro = 0;
37
38            DrawPerimeter = false; // kentän reunat piirretään
39
40            // Asetetaan painovoima
41            Gravity = new Vector2D(0, -500);
42
43            // Zoomataan lähemmäksi
44            Camera.ZoomFactor = 5.0;
45
46            aloitaUusiPeli();
47
48        }
49
50        void aloitaUusiPeli()
51        {
52            MessageDisplay.Clear();
53
54            kenttaNro = 0;
55
56            // ladataan kenttä
57            Level = seuraavaKentta();
58
59            // Laitetaan peliohje näyttöön
60            MessageDisplay.Add("Etsi iso tähti!");
61            MessageDisplay.Add("Mutta varo haamuja...");
62        }
63        #endregion
64
65
66        #region KentanLataus
67        Level seuraavaKentta()
68        {
69
70            kenttaNro += 1; // lisätään kenttänumeroa yhdellä
71            MessageDisplay.Add("Kenttä " + kenttaNro);
72            Level seuraava = luoKentta();
73            lisaaNappaimet();
74            Camera.Follow(pelaaja1);
75            return seuraava;
76        }
77
78        Level luoKentta()
79        {
80            Level kentta = new Level(this, 1500, 1000);
81            kentta.CreateBorder();
82            kentta.Borders.Visible = false;
83            kentta.Background.CreateGradient(Color.White, Color.Blue);
84
85            Platform alusta = new Platform(1750, 300, Color.LightGreen);
86            alusta.X = 0;
87            alusta.Y = kentta.Bottom - alusta.Height / 2;
88            kentta.Objects.Add(alusta);
89
90            //tykkihuoneen lattia & katto
91            lisaaLattia(kentta, -600, -375);
92            lisaaKatto(kentta, -575, -250);
93            //Reunat
94            lisaaSeina(kentta, kentta.Left, -375);
95            lisaaSeina1(kentta, -50, -380);
96            //keskiseinä
97            lisaaSeina2(kentta, -375, -300);
98            //sammutin huoneen lattia & katto
99            lisaaLattia1(kentta, -250, -400);
100            lisaaKatto1(kentta, -225, -275);
101
102            lisaaMaali(kentta);
103            lisaaPelaajat(kentta);
104            lisaaTahdet(kentta);
105
106            int vihollistenMaara = kenttaNro;
107            lisaaViholliset(kentta, vihollistenMaara);
108
109            return kentta;
110        }
111
112        void lisaaLattia(Level kentta, double x, double y)
113        {
114            Platform lattia = new Platform(300, 30, Color.Green);
115            lattia.X = x;
116            lattia.Y = y;
117            kentta.Objects.Add(lattia);
118        }
119
120        void lisaaKatto(Level kentta, double x, double y)
121        {
122            Platform katto = new Platform(375, 30, Color.Green);
123            katto.X = x;
124            katto.Y = y;
125            kentta.Objects.Add(katto);
126        }
127
128        void lisaaKatto1(Level kentta, double x, double y)
129        {
130            Platform katto = new Platform(325, 30, Color.Green);
131            katto.X = x;
132            katto.Y = y;
133            kentta.Objects.Add(katto);
134        }
135
136        void lisaaLattia1(Level kentta, double x, double y)
137        {
138            Platform lattia = new Platform(250, 30, Color.Green);
139            lattia.X = x;
140            lattia.Y = y;
141            kentta.Objects.Add(lattia);
142        }
143
144        //vasen reuna
145        void lisaaSeina(Level kentta, double x, double y)
146        {
147            Platform seina = new Platform(30, 250, Color.Green);
148            seina.X = x;
149            seina.Y = y;
150            kentta.Objects.Add(seina);
151        }
152
153        //oikea reuna
154        void lisaaSeina1(Level kentta, double x, double y)
155        {
156            Platform seina = new Platform(30, 240, Color.Black);
157            seina.X = x;
158            seina.Y = y;
159            kentta.Objects.Add(seina);
160        }
161
162        //keskiseinä
163        void lisaaSeina2(Level kentta, double x, double y)
164        {
165            Platform seina = new Platform(30, 250, Color.Black);
166            seina.X = x;
167            seina.Y = y;
168            kentta.Objects.Add(seina);
169        }
170
171        void lisaaPelaajat(Level kentta)
172        {
173            pelaaja1 = new PlatformCharacter(4, Shapes.CreateCircle(20));
174            pelaaja1.Texture = Content.Load<Texture2D>("norsu");
175            pelaaja1.X = -625;
176            pelaaja1.Y = kentta.Bottom + 50;
177            pelaaja1.Body.LinearDamping = 0.95;
178
179            AddCollisionHandler(pelaaja1, osuiMaaliin);
180
181            kentta.Objects.Add(pelaaja1);
182        }
183
184        void lisaaTahdet(Level kentta)
185        {
186            for (int i = 0; i < 20; i++)
187            {
188                PhysicsObject tahti = new PhysicsObject(0.005, Shapes.CreateCircle(12));
189                tahti.X = RandomGen.NextDouble(-475.0, 475.0);
190                tahti.Y = 400.0;
191                tahti.Restitution = 1.0;
192                tahti.Texture = Content.Load<Texture2D>("tahti");
193                AddCollisionHandler(tahti, keraa);
194                kentta.Objects.Add(tahti);
195
196            }
197        }
198
199        void lisaaMaali(Level kentta)
200        {
201            maali = PhysicsObject.CreateStaticObject(Shapes.CreateCircle(25));
202            maali.Tag = "maali";
203            maali.IgnoresCollisionResponse = true;
204            maali.X = 0;
205            maali.Y = 325;
206            maali.Texture = Content.Load<Texture2D>("tahti");
207            kentta.Objects.Add(maali);
208        }
209
210        void lisaaViholliset(Level kentta, int kpl)
211        {
212            for (int i = 0; i < kpl; i++)
213            {
214                PlatformCharacter vihollinen = new PlatformCharacter(100, Shapes.CreateCircle(30));
215                vihollinen.Brain = new RandomMoverBrain();
216                vihollinen.X = maali.X;
217                vihollinen.Y = maali.Y;
218                vihollinen.IgnoresGravity = true;
219                vihollinen.Texture = Content.Load<Texture2D>("vihollinen");
220                AddCollisionHandler(vihollinen, tuuppaa);
221                kentta.Objects.Add(vihollinen);
222            }
223        }
224        #endregion
225
226
227        #region Nappaimet
228        // Lisää peliin kaikki näppäimet
229        void lisaaNappaimet()
230        {
231            //Yleiset näppäimet
232            Controls.Listen(Keys.Enter, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
233
234            // Pelaajan näppäimet
235            Controls.Listen(Keys.Left, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector2D(-liikeVoima, 0));
236            Controls.Listen(Keys.Right, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja1, new Vector2D(liikeVoima, 0));
237            Controls.Listen(Keys.Up, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja1, hyppyVoima);
238
239            lisaaGamePadNappaimet(PlayerIndex.One, pelaaja1);
240        }
241
242        void lisaaGamePadNappaimet(PlayerIndex pelaajaNro, PlatformCharacter pelaaja)
243        {
244            //Yleiset näppäimet
245            Controls.Listen(pelaajaNro, Buttons.Start, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
246
247            Controls.Listen(pelaajaNro, Buttons.DPadLeft, ButtonPosition.Down, liikuta, "Pelaaja liikkuu vasemmalle", pelaaja, new Vector2D(-liikeVoima, 0));
248            Controls.Listen(pelaajaNro, Buttons.DPadRight, ButtonPosition.Down, liikuta, "Pelaaja liikkuu oikealle", pelaaja, new Vector2D(liikeVoima, 0));
249            Controls.Listen(pelaajaNro, Buttons.A, ButtonPosition.Pressed, hyppaa, "Pelaaja hyppää", pelaaja, hyppyVoima);
250        }
251
252        // Näppäimiin liitetyt toiminnot alkavat tästä -->
253        bool liikuta(ControlEvent e)
254        {
255            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
256            Vector2D voima = e.Parameter1.ToVector2D();
257            hahmo.Walk(e.Time, voima);
258            return false;
259        }
260
261        bool hyppaa(ControlEvent e)
262        {
263            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
264            double voima = e.Parameter1.ToDouble();
265
266            if (hahmo.Jump(voima))
267            {
268                this.PlaySound("hyppays");
269            }
270            return false;
271        }
272
273        bool uusiPeli(ControlEvent e)
274        {
275            aloitaUusiPeli();
276            return true;
277        }
278        #endregion
279
280
281        #region Tapahtumat
282        // Kun osutaan maaliin
283        void osuiMaaliin(Collision collision)
284        {
285            if (collision.Other.Tag == "maali")
286            {
287                this.PlaySound("maali");
288                Level = seuraavaKentta();
289                MessageDisplay.Add("Pääsit läpi kentän " + kenttaNro);
290            }
291        }
292
293        // Kerää tähden ja antaa pisteen
294        void keraa(Collision collision)
295        {
296            if (collision.Other.Equals(pelaaja1))
297            {
298                PhysicsObject tahti = collision.Obj;
299                tahti.Lifetime.IsExpired = true;
300
301                this.PlaySound("kerays", -0.5, 0.5);
302            }
303        }
304
305        // Haamu tuuppaa pelaajaa
306        void tuuppaa(Collision collision)
307        {
308            if (collision.Other is PlatformCharacter)
309            {
310                double luku1 = RandomGen.NextIntRange(-10000, -8000, 8000, 10000);
311                double luku2 = RandomGen.NextIntRange(-10000, -8000, 8000, 10000);
312
313                if (collision.Other == pelaaja1)
314                {
315                    // pieni värinä törmäyksestä
316                    Controls.GameControllers[PlayerIndex.One].Vibrate(0.5, 0.5, 0.0, 0.0, 0.1);
317                }
318                this.PlaySound("tuuppaus");
319                collision.Other.Hit(new Vector2D(luku1, luku2));
320            }
321        }
322        #endregion
323    }
324}
Note: See TracBrowser for help on using the repository browser.