source: 2009/sarita_p/Tasohyppely1/Peli.cs @ 460

Revision 173, 14.6 KB checked in by sajupaan, 11 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 Tasohyppely1
15{
16    // Yksinkertainen tasohyppely.
17    class Tasohyppely : PhysicsGame
18    {
19        #region Muuttujat
20
21        const double liikeVoima = 4000;
22        const double hyppyVoima = 2500;
23
24        Meter<int> pisteLaskuri;
25        Meter<int> pisteLaskuri2;
26        ValueDisplay pisteNaytto;
27        ValueDisplay pisteNaytto2;
28
29        PlatformCharacter pelaaja1;
30        PlatformCharacter pelaaja2;
31        PhysicsObject maali;
32        Song taustamusiikki;
33
34        int kenttaNro = 3; // monesko kenttä on menossa
35
36        #endregion
37
38
39        #region Alustukset
40        protected override void LoadContent()
41        {
42
43            // Asetetaan kentän numero nollaksi, jota kasvatetaan kentän latauksessa (aina siis vähintään 1)
44            kenttaNro = 0;
45
46            DrawPerimeter = false; // ei haluta piirtää kentän reunoja
47
48            // Luodaan pistelaskuri
49            pisteLaskuri = new Meter<int>(0, 0, 1000000);
50            pisteLaskuri2 = new Meter<int>(0, 0, 1000000);
51
52            // luodaan pistelaskunäyttö
53            pisteNaytto = new ValueDisplay(this);
54            pisteNaytto.Text = "Pisteitä: ";
55            pisteNaytto.X = Screen.RightSafe - 250;
56            pisteNaytto.Y = Screen.TopSafe - 50;
57            pisteNaytto.BindTo(pisteLaskuri);
58            Add(pisteNaytto);
59
60            pisteNaytto2 = new ValueDisplay(this);
61            pisteNaytto2.Text = "Pisteitä: ";
62            pisteNaytto2.X = Screen.RightSafe  -450;
63            pisteNaytto2.Y = Screen.TopSafe - 50;
64            pisteNaytto2.BindTo(pisteLaskuri2);
65            Add(pisteNaytto2); // lisätään peliin
66
67            // Asetetaan painovoima
68            Gravity = new Vector2D(0, -1000);
69
70            // Zoomataan lähemmäksi
71            Camera.ZoomFactor = 1.0;
72
73            aloitaUusiPeli();
74
75        }
76
77        void aloitaUusiPeli()
78        {                               
79            MessageDisplay.Clear();
80
81            //kenttaNro = 0;
82
83            // ladataan kenttä
84            Level = seuraavaKentta();
85
86            // Laitetaan peliohje näyttöön
87            MessageDisplay.Add("Etsi ovi!");
88            MessageDisplay.Add("Mutta varo vihollisia...");
89        }
90        #endregion
91
92
93        #region KentanLataus
94        Level seuraavaKentta()
95        {
96            //pisteLaskuri.Reset();
97            kenttaNro += 1; // lisätään kenttänumeroa yhdellä
98            MessageDisplay.Add("Kenttä " + kenttaNro);
99            Level seuraava = luoKentta();
100            lisaaNappaimet();
101            return seuraava;
102        }
103
104        Level luoKentta()
105        {
106            Level kentta = new Level(this, 1200, 1000);
107            kentta.CreateBorder();
108            kentta.Borders.Visible = false;
109            kentta.Background.CreateGradient(Color.White, Color.Pink);
110
111            Platform alusta = new Platform(kentta.Width, 300, Color.White);
112            alusta.X = 0;
113            alusta.Y = kentta.Bottom - alusta.Height / 2;
114            kentta.Objects.Add(alusta);
115
116            if (kenttaNro == 1)
117            {
118                taustamusiikki = Content.Load<Song>("Supermario");
119                MediaPlayer.Play(taustamusiikki);
120                lisaaPieniTaso(kentta, -200, -350);
121                lisaaPieniTaso(kentta, 0, -200);
122                lisaaPieniTaso(kentta, 400, -150);
123                lisaaPieniTaso(kentta, -400, 150);
124                lisaaPieniTaso(kentta, -200, 250);
125                lisaaPieniTaso(kentta, -450, -10);
126                lisaaPieniTaso(kentta, -500, -200);
127                lisaaPieniTaso(kentta, 500, 0);
128                lisaaPieniTaso(kentta, 400, 100);
129            }
130
131            if (kenttaNro == 2)
132            {
133                taustamusiikki = Content.Load<Song>("Supermario");
134               
135                lisaaPieniTaso(kentta, -450, -10);
136                lisaaPieniTaso(kentta, -200, -150);
137                lisaaPieniTaso(kentta, -100, 100);
138                lisaaPieniTaso(kentta, 500, 0);
139                lisaaPieniTaso(kentta, 200, -10);
140                lisaaPieniTaso(kentta, 300, -410);
141                lisaaPieniTaso(kentta, 200, -250);
142
143            }
144            if (kenttaNro == 3)
145            {
146                taustamusiikki = Content.Load<Song>("Supermario");
147               
148                lisaaPieniTaso(kentta, -450, -10);
149                lisaaPieniTaso(kentta, -250, -150);
150                lisaaPieniTaso(kentta, -300, 100);
151               
152                lisaaPieniTaso(kentta, 200, -10);
153                lisaaPieniTaso(kentta, 300, -410);
154                lisaaPieniTaso(kentta, 200, -250);
155
156            }
157            if (kenttaNro == 4)
158            {
159                taustamusiikki = Content.Load<Song>("Supermario");
160
161                lisaaPieniTaso(kentta, 150, -10);
162                lisaaPieniTaso(kentta, -150, -200);
163                lisaaPieniTaso(kentta, -150, 200);
164
165                lisaaPieniTaso(kentta, -100, 10);
166
167                lisaaPieniTaso(kentta, -100, -350);
168
169            }
170            if (kenttaNro == 5)
171            {
172                taustamusiikki = Content.Load<Song>("Supermario");
173
174                lisaaPieniTaso(kentta, 150, -10);
175                lisaaPieniTaso(kentta, -150, -200);
176                lisaaPieniTaso(kentta, -100, 150);
177
178                lisaaPieniTaso(kentta, -500, -20);
179
180                lisaaPieniTaso(kentta, -100, -350);
181
182            }
183            if (kenttaNro == 6)
184            {
185                taustamusiikki = Content.Load<Song>("Supermario");
186
187                lisaaPieniTaso(kentta, 150, -10);
188                lisaaPieniTaso(kentta, -250, -200);
189                lisaaPieniTaso(kentta, 100, 200);
190
191                lisaaPieniTaso(kentta, 500, 20);
192
193                lisaaPieniTaso(kentta, -100, -350);
194
195            }
196           
197
198            lisaaMaali(kentta);
199            lisaaPelaajat(kentta);
200            lisaaTahdet(kentta);
201
202            int vihollistenMaara = kenttaNro;
203            lisaaViholliset(kentta, vihollistenMaara);
204
205            return kentta;
206        }
207
208        void lisaaPieniTaso(Level kentta, double x, double y)
209        {
210            Platform taso = new Platform(100, 30, Color.Pink);
211            taso.X = x;
212            taso.Y = y;
213            kentta.Objects.Add(taso);
214        }
215
216        void lisaaPelaajat(Level kentta)
217        {
218            pelaaja1 = new PlatformCharacter(4, Shapes.CreateCircle(20));
219            pelaaja1.Texture = Content.Load<Texture2D>("luigi");
220            pelaaja1.X = 0;
221            pelaaja1.Y = kentta.Bottom + 120;
222
223            pelaaja2 = new PlatformCharacter(4, Shapes.CreateCircle(20));
224            pelaaja2.Texture = Content.Load<Texture2D>("mario");
225            pelaaja2.X = 0;
226            pelaaja2.Y = kentta.Bottom + 120;
227
228            AddCollisionHandler(pelaaja1, osuiMaaliin);
229            AddCollisionHandler(pelaaja2, osuiMaaliin);
230
231            kentta.Objects.Add(pelaaja1);
232            kentta.Objects.Add(pelaaja2);
233        }
234
235        void lisaaTahdet(Level kentta)
236        {
237            for (int i = 0; i < 50; i++)
238            {
239                PhysicsObject tahti = new PhysicsObject(0.005, Shapes.CreateCircle(12));
240                tahti.X = RandomGen.NextDouble(-475.0, 475.0);
241                tahti.Y = 400.0;
242                tahti.Restitution = 1.0;
243                tahti.Texture = Content.Load<Texture2D>("sieni");
244                AddCollisionHandler(tahti, keraa);
245                kentta.Objects.Add(tahti);
246
247            }
248        }
249
250        void lisaaMaali(Level kentta)
251        {
252            maali = PhysicsObject.CreateStaticObject(Shapes.CreateCircle(25));
253            maali.Tag = "maali";
254            maali.IgnoresCollisionResponse = true;
255            maali.X = 0;
256            maali.Y = 325;
257            maali.Texture = Content.Load<Texture2D>("ovi");
258            kentta.Objects.Add(maali);
259        }
260
261        void lisaaViholliset(Level kentta, int kpl)
262        {
263            for (int i = 0; i < kpl; i++)
264            {
265                PlatformCharacter vihollinen = new PlatformCharacter(100, Shapes.CreateCircle(30));
266                vihollinen.Brain = new RandomMoverBrain();
267                vihollinen.X = maali.X;
268                vihollinen.Y = maali.Y;
269                vihollinen.IgnoresGravity = true;
270                vihollinen.Texture = Content.Load<Texture2D>("evilmushroom");
271                AddCollisionHandler(vihollinen, tuuppaa);
272                kentta.Objects.Add(vihollinen);
273            }
274        }
275        #endregion
276
277
278        #region Nappaimet
279        // Lisää peliin kaikki näppäimet
280        void lisaaNappaimet()
281        {
282            //Yleiset näppäimet
283            Controls.Listen(Keys.Enter, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
284
285            // Pelaajan näppäimet
286            Controls.Listen(Keys.Left, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector2D(-liikeVoima, 0));
287            Controls.Listen(Keys.Right, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja1, new Vector2D(liikeVoima, 0));
288            Controls.Listen(Keys.Up, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja1, hyppyVoima);
289
290            Controls.Listen(Keys.F7, ButtonPosition.Pressed, vaihdaHahmo, "Vaihda hahmo luigi", pelaaja1, "toad");
291            Controls.Listen(Keys.F8, ButtonPosition.Pressed, vaihdaHahmo, "Vaihda hahmo toad", pelaaja1, "toadette");
292            Controls.Listen(Keys.F9, ButtonPosition.Pressed, vaihdaHahmo, "Vaihda hahmo toadette", pelaaja1, "yoshi");
293            Controls.Listen(Keys.F10, ButtonPosition.Pressed, vaihdaHahmo, "Vaihda hahmo yoshi", pelaaja1, "mario");
294
295
296            lisaaGamePadNappaimet(PlayerIndex.One, pelaaja1);
297           
298            Controls.Listen(Keys.A, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja2, new Vector2D(-liikeVoima, 0));
299            Controls.Listen(Keys.D, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja2, new Vector2D(liikeVoima, 0));
300            Controls.Listen(Keys.S, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja2, hyppyVoima);
301
302            Controls.Listen(Keys.F11, ButtonPosition.Pressed, vaihdaHahmo, "Vaihda hahmo mario", pelaaja2, "yoshi");
303            Controls.Listen(Keys.F12, ButtonPosition.Pressed, vaihdaHahmo, "Vaihda hahmo yoshi", pelaaja2, "toadette");
304            Controls.Listen(Keys.W, ButtonPosition.Pressed, vaihdaHahmo, "Vaihda hahmo toadette", pelaaja2, "toad");
305            Controls.Listen(Keys.E, ButtonPosition.Pressed, vaihdaHahmo, "Vaihda hahmo toad", pelaaja2, "luigi");
306
307            lisaaGamePadNappaimet(PlayerIndex.Two, pelaaja2);
308        }
309
310        void lisaaGamePadNappaimet(PlayerIndex pelaajaNro, PlatformCharacter pelaaja)
311        {
312            //Yleiset näppäimet
313            Controls.Listen(pelaajaNro, Buttons.Start, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
314
315            Controls.Listen(pelaajaNro, Buttons.DPadLeft, ButtonPosition.Down, liikuta, "Pelaaja liikkuu vasemmalle", pelaaja, new Vector2D(-liikeVoima, 0));
316            Controls.Listen(pelaajaNro, Buttons.DPadRight, ButtonPosition.Down, liikuta, "Pelaaja liikkuu oikealle", pelaaja, new Vector2D(liikeVoima, 0));
317            Controls.Listen(pelaajaNro, Buttons.A, ButtonPosition.Pressed, hyppaa, "Pelaaja hyppää", pelaaja, hyppyVoima);
318        }
319
320        // Näppäimiin liitetyt toiminnot alkavat tästä -->
321        bool liikuta(ControlEvent e)
322        {
323            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
324            Vector2D voima = e.Parameter1.ToVector2D();
325            hahmo.Walk(e.Time, voima);
326            return false;
327        }
328
329        bool hyppaa(ControlEvent e)
330        {
331            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
332            double voima = e.Parameter1.ToDouble();
333
334            if (hahmo.Jump(voima))
335            {
336                this.PlaySound("hyppays");
337            }
338            return false;
339        }
340
341        bool vaihdaHahmo(ControlEvent e)
342        {
343            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
344            String nimi = e.Parameter1.ToString();
345            hahmo.Texture = Content.Load<Texture2D>(nimi);
346           
347
348            return false;
349        }
350
351        bool uusiPeli(ControlEvent e)
352        {
353            aloitaUusiPeli();
354            return true;
355        }
356        #endregion
357
358
359        #region Tapahtumat
360        // Kun osutaan maaliin
361        void osuiMaaliin(Collision collision)
362        {
363            if (collision.Other.Tag == "maali")
364            {
365                this.PlaySound("maali");
366                int edellisenKentanPisteet = pisteLaskuri.Value;
367                int edellisenKentanPisteet2 = pisteLaskuri2.Value;
368                Level = seuraavaKentta();
369                MessageDisplay.Add("Pääsit läpi kentän " + kenttaNro + ". Pisteitä Luigille: " + edellisenKentanPisteet + ", Pisteitä Mariolle: " + edellisenKentanPisteet2);
370            }
371        }
372
373        // Kerää tähden ja antaa pisteen
374        void keraa(Collision collision)
375        {
376            if (collision.Other.Equals(pelaaja1))
377            {
378                PhysicsObject tahti = collision.Obj;
379                tahti.Lifetime.IsExpired = true;
380
381                this.PlaySound("kerays", -0.5, 0.5);
382                pisteLaskuri.Value += 1;
383            }
384
385            if (collision.Other.Equals(pelaaja2) )
386            {
387                PhysicsObject tahti = collision.Obj;
388                tahti.Lifetime.IsExpired = true;
389
390                this.PlaySound("kerays", -0.5, 0.5);
391                pisteLaskuri2.Value += 1;
392            }
393        }
394
395        // Haamu tuuppaa pelaajaa
396        void tuuppaa(Collision collision)
397        {
398            if (collision.Other is PlatformCharacter)
399            {
400                double luku1 = RandomGen.NextIntRange(-10000, -8000, 8000, 10000);
401                double luku2 = RandomGen.NextIntRange(-10000, -8000, 8000, 10000);
402
403                if (collision.Other == pelaaja1)
404                {
405                    // pieni värinä törmäyksestä
406                    Controls.GameControllers[PlayerIndex.One].Vibrate(0.5, 0.5, 0.0, 0.0, 0.1);
407                }
408                this.PlaySound("tuuppaus");
409                collision.Other.Hit(new Vector2D(luku1, luku2));
410            }
411        }
412        #endregion
413    }
414}
Note: See TracBrowser for help on using the repository browser.