source: kyosti_s/Sokkelopeli/Peli.cs @ 425

Revision 425, 19.6 KB checked in by kykasalo, 10 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;
12using System.Collections.Generic;
13
14
15namespace Sokkelopeli
16{
17    // Maailman mahtavin peli.
18    class Tasohyppely : PhysicsGame
19    {
20        #region Muuttujat
21
22        const double liikeVoima = 2000;
23        const double hyppyVoima = 2500;
24        const int kenttienMaara = 5;
25
26        double vesiHeight;
27        List<PhysicsObject> vesiOliot;
28        Level kentta;
29
30        PlatformCharacter pelaaja1;
31        PhysicsObject maali;
32        PhysicsObject piikit;
33        Timer ajastin;
34        HighScoreList lista;
35
36        TextDisplay gameOverTeksti;
37
38        Timer aikaLaskuri;          // laskee aikaa
39        ValueDisplay aikaNaytto;    // näyttää ajan
40
41        int kenttaNro; // monesko kenttä on menossa
42
43        #endregion
44
45
46        #region Alustukset
47        protected override void LoadContent()
48        {
49            SplashScreen aloitusruutu = new SplashScreen(this);
50            aloitusruutu.GameName = "RunAway";
51            aloitusruutu.Authors = "Tekijä: Kyösti Salonen";
52            aloitusruutu.TextBody = "Maailma täyttyy vedestä. Sinun täytyy paeta vettä norsullasi, sillä se ei osaa uida. Varo myös kaikenlaisia ansoja, ne eivät ole hyväksi norsuille.";
53            aloitusruutu.GameStarted += new EventHandler<EventArgs>(ContinueLoadContent);
54            aloitusruutu.Show();
55        }
56
57        void ContinueLoadContent(object sender, EventArgs e)
58        {
59            Camera.StayInLevel = true;
60            vesiOliot = new List<PhysicsObject>();
61
62            gameOverTeksti = new TextDisplay(this);
63            gameOverTeksti.Text = "Game Over";
64            Add(gameOverTeksti);
65
66            lista = HighScoreList.LoadOrCreate(this, "topten.dat", 10);
67            lista.ReverseOrder = true;
68           
69            // Asetetaan kentän numero nollaksi, jota kasvatetaan kentän latauksessa (aina siis vähintään 1)
70            kenttaNro = 0;
71
72            DrawPerimeter = false; // ei haluta piirtää kentän reunoja
73
74            //Lisätään ajastin
75            ajastin = new Timer();
76            ajastin.Interval = 1;
77            ajastin.Trigger += new Timer.TriggerHandler(korotaVetta);
78            AddTimer(ajastin);
79
80            aikaLaskuri = new Timer();                     // luodaan uusi ajastin, nimeltä aikaLaskuri
81            aikaLaskuri.Interval = 1000;                      // ajastukseksi...ÄÄRETÖN           
82            AddTimer(aikaLaskuri);                       // lisätään aikaLaskuri peliin
83
84            aikaNaytto = new ValueDisplay(this);         // luo uuden aikaNayton
85            aikaNaytto.Text = "Aikaa kulunut: ";          // laitetaan näytöllä näkyvä teksti
86            aikaNaytto.TextColor = Color.Crimson;          // vaihdetaan tekstin väriä
87            aikaNaytto.FormatDouble(0, true);            // asetetaan näyttämään aika siten, ettei siinä näy yhtään (0) desimaalia
88            aikaNaytto.BindTo(aikaLaskuri.SecondCounter); // liitetään aikaNaytto aikaLaskuriin
89            aikaNaytto.X = Screen.Right - 100;
90            aikaNaytto.Y = Screen.Top - 10;
91            Add(aikaNaytto);                             // lisätään aikaNaytto peliin
92
93           
94
95            // Asetetaan painovoima
96            Gravity = new Vector2D(0, -1000);
97
98            // Zoomataan lähemmäksi
99            Camera.ZoomFactor = 2.0;           
100
101            aloitaUusiPeli();
102
103        }
104
105        void aloitaUusiPeli()
106        {
107            MessageDisplay.Clear();
108            lista.Hide();
109            kenttaNro = 0;           
110           
111            vesiHeight = 20;
112
113            // Laitetaan peliohje näyttöön
114            MessageDisplay.Add("Vesi nousee ja sinun on paettava");
115            MessageDisplay.Add("ennen kuin hukut!");
116
117            ajastin.Start();
118            aikaLaskuri.Start();
119
120            // ladataan kenttä
121            Level = seuraavaKentta();           
122        }
123        #endregion
124
125
126        #region KentanLataus
127        Level seuraavaKentta()
128        {
129            Level seuraava;
130            gameOverTeksti.Visible = false;           
131            kenttaNro += 1; // lisätään kenttänumeroa yhdellä
132            MessageDisplay.Add("Kenttä " + kenttaNro);
133
134            seuraava = ValitseKentta();
135
136            lisaaNappaimet();
137            Camera.Follow(pelaaja1);
138            return seuraava;
139        }
140
141        Level ValitseKentta()
142        {
143            Level seuraava;
144            if (kenttaNro == 1)
145            {
146                seuraava = luoKentta();
147            }
148            else if (kenttaNro == 2)
149            {
150                seuraava = luoKentta2();
151            }
152            else if (kenttaNro == 3)
153            {
154                seuraava = luoKentta3();
155            }
156            else if (kenttaNro == 4)
157            {
158                seuraava = luoKentta4();
159            }
160            else if (kenttaNro == 5)
161            {
162                seuraava = luoKentta5();
163            }
164
165            else
166            {
167                seuraava = null;
168            }
169            return seuraava;
170        }
171
172
173        Level luoKentta()
174        {
175            kentta = new Level(this, 2000, 1000);
176            kentta.CreateBorder();
177            kentta.Borders.Visible = false;
178            kentta.Background.CreateGradient(Color.White, Color.SkyBlue);
179
180            Platform alusta = new Platform(kentta.Width, 300, Color.LightGreen);
181            alusta.X = 0;
182            alusta.Y = kentta.Bottom - alusta.Height / 2 + 10;
183            kentta.Objects.Add(alusta);           
184
185            lisaaPieniTaso(kentta, 900, -150, 100, 30);
186            lisaaPieniTaso(kentta, 900, -475, 100, 30);
187            lisaaPieniTaso(kentta, 700, -350, 100, 30);
188            lisaaPieniTaso(kentta, 700, 20, 100, 30);
189            lisaaPieniTaso(kentta, 500, -170, 100, 30);
190            lisaaPieniTaso(kentta, -300, 200, 400, 50);
191
192            lisaaPieniTaso(kentta, 500, 160, 100, 30);
193            lisaaPieniTaso(kentta, 200, 250, 100, 30);
194
195           
196
197            lisaaMaali(kentta);
198            lisaaPelaajat(kentta);
199
200            luoVesi(kentta);
201
202            return kentta;
203        }
204
205        Level luoKentta2()
206        {
207            kentta = new Level(this, 2000, 1000);
208            kentta.CreateBorder();
209            kentta.Borders.Visible = false;
210            kentta.Background.CreateGradient(Color.White, Color.LightBlue);
211
212            Platform alusta = new Platform(kentta.Width, 300, Color.LightGreen);
213            alusta.X = 0;
214            alusta.Y = kentta.Bottom - alusta.Height / 2 + 10;
215            kentta.Objects.Add(alusta);
216
217            lisaaPieniTaso(kentta, 800, -475, 300, 30);             //alotus taso
218            lisaaPieniTaso(kentta, 600, -350, 90, 30);
219            lisaaPieniTaso(kentta, 750, -200, 90, 30);
220            lisaaPieniTaso(kentta, 900, -20, 90, 30);
221            lisaaPieniTaso(kentta, 780, 150, 90, 30);
222            lisaaPieniTaso(kentta, 300, 200, 90, 30);
223            lisaaPieniTaso(kentta, 500, 10, 90, 30);
224            lisaaPieniTaso(kentta, -230, 90, 140, 30);
225            lisaaPieniTaso(kentta, -400, 200, 80, 50);
226
227            lisaaMiina(kentta, -210, 140);
228
229            lisaaMaali(kentta);
230            lisaaPelaajat(kentta);
231
232            luoVesi(kentta);
233
234            return kentta;
235        }
236
237        Level luoKentta3()
238        {
239            kentta = new Level(this, 2000, 1000);
240            kentta.CreateBorder();
241            kentta.Borders.Visible = false;
242            kentta.Background.CreateGradient(Color.White, Color.Blue);
243
244            Platform alusta = new Platform(kentta.Width, 300, Color.LightGreen);
245            alusta.X = 0;
246            alusta.Y = kentta.Bottom - alusta.Height / 2 + 10;
247            kentta.Objects.Add(alusta);
248
249            lisaaPieniTaso(kentta, 800, -475, 280, 30);             //alotus taso
250
251            lisaaPieniTaso(kentta, 580, -300, 80, 30);
252            lisaaPieniTaso(kentta, 320, -230, 120, 30);
253            lisaaPieniTaso(kentta, 200, -45, 80, 30);
254            lisaaPieniTaso(kentta, 500, 0, 80, 30);
255            lisaaPieniTaso(kentta, 600, 180, 80, 30);
256            lisaaPieniTaso(kentta, 350, 280, 250, 30);
257            lisaaPieniTaso(kentta, 60, 160, 80, 30);
258            lisaaPieniTaso(kentta, -320, 200, 280, 50);
259
260            lisaaMiina(kentta, 300, -200);
261
262            lisaaPiikit(kentta, 350, 310);
263
264            lisaaMaali(kentta);
265            lisaaPelaajat(kentta);
266
267            luoVesi(kentta);
268
269            return kentta;
270        }
271
272        Level luoKentta4()
273        {
274            kentta = new Level(this, 2000, 1000);
275            kentta.CreateBorder();
276            kentta.Borders.Visible = false;
277            kentta.Background.CreateGradient(Color.White, Color.Orange);
278
279            Platform alusta = new Platform(kentta.Width, 300, Color.LightGreen);
280            alusta.X = 0;
281            alusta.Y = kentta.Bottom - alusta.Height / 2 + 10;
282            kentta.Objects.Add(alusta);
283
284            lisaaPieniTaso(kentta, 900, -475, 200, 30);
285
286            lisaaPieniTaso(kentta, 940, -300, 70, 25);
287            lisaaPieniTaso(kentta, 700, -320, 70, 25);
288            lisaaPieniTaso(kentta, 900, -145, 70, 25);
289            lisaaPieniTaso(kentta, 820, 45, 100, 25);
290            lisaaPieniTaso(kentta, 600, 180, 70, 25);
291            lisaaPieniTaso(kentta, 350, 200, 70, 25);
292            lisaaPieniTaso(kentta, 60, 160, 70, 25);
293            lisaaPieniTaso(kentta, -320, 220, 280, 50);
294
295            lisaaPieniTaso(kentta, 480, -300, 70, 25);
296            lisaaPieniTaso(kentta, 280, -200, 100, 25);
297            lisaaPieniTaso(kentta, 0, -200, 70, 25);
298            lisaaPieniTaso(kentta, -100, -45, 70, 25);
299            lisaaPieniTaso(kentta, -280, 0, 70, 25);
300            lisaaPieniTaso(kentta, -350, -100, 120, 25);
301            lisaaPieniTaso(kentta, -460, 10, 70, 25);
302            lisaaPieniTaso(kentta, -590, 150, 70, 25);
303
304            lisaaPiikit(kentta, 810, 70);
305            lisaaPiikit(kentta, -360, -75);
306
307            lisaaMiina(kentta, 260, -175);
308
309            lisaaMaali(kentta);
310            lisaaPelaajat(kentta);
311
312            luoVesi(kentta);
313
314            return kentta;
315        }
316
317        Level luoKentta5()
318        {
319            kentta = new Level(this, 2000, 1000);
320            kentta.CreateBorder();
321            kentta.Borders.Visible = false;
322            kentta.Background.CreateGradient(Color.White, Color.Black);
323
324            Platform alusta = new Platform(kentta.Width, 300, Color.LightGreen);
325            alusta.X = 0;
326            alusta.Y = kentta.Bottom - alusta.Height / 2 + 10;
327            kentta.Objects.Add(alusta);
328
329            lisaaPieniTaso(kentta, 900, -475, 100, 30);
330
331            lisaaPieniTaso(kentta, 960, -300, 80, 25);
332            lisaaPieniTaso(kentta, 700, -230, 80, 25);
333            lisaaPieniTaso(kentta, 500, -145, 80, 25);
334            lisaaPieniTaso(kentta, 300, -45, 100, 25);
335            lisaaPieniTaso(kentta, 150, 100, 70, 25);
336            lisaaPieniTaso(kentta, 0, 200, 70, 25);
337            lisaaPieniTaso(kentta, -420, 110, 200, 40);
338
339            lisaaMiina(kentta, 690, -205);
340            lisaaMiina(kentta, 980, -275);
341            lisaaMiina(kentta, 280, -20);
342
343            lisaaPiikit(kentta, 140, 126);
344            lisaaPiikit(kentta, 260, -20);
345
346            lisaaMaali(kentta);
347            lisaaPelaajat(kentta);
348
349            luoVesi(kentta);
350
351            return kentta;
352        }
353
354        void luoVesi(Level kentta)
355        {
356            PhysicsObject vesi = new PhysicsObject(4000, Shapes.CreateRectangle(kentta.Width, 20));
357            vesi.X = 0;
358            vesi.Y = kentta.Bottom;
359            vesi.Color = Color.Blue;
360            AddCollisionHandler(vesi, tuuppaa);
361            kentta.Objects.Add(vesi);
362        }
363
364        void korotaVetta(Timer sender)
365        {
366            PhysicsObject vesi = new PhysicsObject(4000, Shapes.CreateRectangle(2000, vesiHeight));
367            vesiHeight = vesiHeight + 100;
368            vesi.X = 0;
369            vesi.Y = -490;
370            vesi.Color = Color.Blue;
371            AddCollisionHandler(vesi, tuuppaa);
372            Objects.Add(vesi);
373            vesiOliot.Add(vesi);
374        }
375
376        void PoistaVedet()
377        {
378            vesiHeight = 20;
379            foreach (var vesi in vesiOliot)
380            {
381                vesi.Destroy();
382                Level.Objects.Remove(vesi);               
383            }
384            vesiOliot.Clear();
385        }
386
387        void lisaaPieniTaso(Level kentta, double x, double y, double leveys, double korkeus)
388        {
389            Platform taso = new Platform(leveys, korkeus, Color.Green);
390            taso.X = x;
391            taso.Y = y;
392
393            if (kenttaNro == 1)
394            {
395                taso.Color = Color.Green;
396            }
397            else if (kenttaNro == 2)
398            {
399                taso.Color = Color.Brown;
400            }
401            else if (kenttaNro == 3)
402            {
403                taso.Color = Color.LightGreen;
404            }
405            else if (kenttaNro == 4)
406            {
407                taso.Color = Color.White;
408            }
409            else if (kenttaNro == 5)
410            {
411                taso.Color = Color.Black;
412            }
413            else
414            {
415                taso.Color = Color.Green;
416            }
417            kentta.Objects.Add(taso);
418        }
419
420        void lisaaMiina(Level kentta, double x, double y)
421        {
422            PhysicsObject miina = new PhysicsObject(1000, Shapes.CreateRectangle(20, 20));
423            miina.X = x;
424            miina.Y = y;
425            miina.Texture = Content.Load<Texture2D>("miina");
426            AddCollisionHandler(miina, astuiMiinaan);           
427            kentta.Objects.Add(miina);
428        }
429
430        void lisaaPiikit(Level kentta, double x, double y)
431        {
432            piikit = new PhysicsObject(10000, Shapes.CreateRectangle(40, 20));
433            piikit.X = x;
434            piikit.Y = y;
435            piikit.Texture = Content.Load<Texture2D>("piikit");
436            AddCollisionHandler(piikit, piikkiTuuppaus);
437            kentta.Objects.Add(piikit);
438        }
439
440        void lisaaPelaajat(Level kentta)
441        {
442            pelaaja1 = new PlatformCharacter(4, Shapes.CreateCircle(20));
443            pelaaja1.Texture = Content.Load<Texture2D>("norsu");
444            pelaaja1.X = 900;
445            pelaaja1.Y = kentta.Bottom + 60;
446
447            AddCollisionHandler(pelaaja1, osuiMaaliin);
448
449            kentta.Objects.Add(pelaaja1);
450        }
451
452        void lisaaMaali(Level kentta)
453        {
454            maali = PhysicsObject.CreateStaticObject(Shapes.CreateCircle(25));
455            maali.Tag = "maali";
456            maali.IgnoresCollisionResponse = true;
457            maali.X = -400;
458            maali.Y = 275;
459            maali.Texture = Content.Load<Texture2D>("tahti");
460            kentta.Objects.Add(maali);
461        }
462        #endregion
463
464
465        #region Nappaimet
466        // Lisää peliin kaikki näppäimet
467        void lisaaNappaimet()
468        {
469            ClearControls();
470            //Yleiset näppäimet
471            Controls.Listen(Keys.Enter, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
472
473            // Pelaajan näppäimet
474            Controls.Listen(Keys.Left, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector2D(-liikeVoima, 0));
475            Controls.Listen(Keys.Right, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja1, new Vector2D(liikeVoima, 0));
476            Controls.Listen(Keys.Up, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja1, hyppyVoima);
477
478            lisaaGamePadNappaimet(PlayerIndex.One, pelaaja1);
479        }
480
481        void lisaaGamePadNappaimet(PlayerIndex pelaajaNro, PlatformCharacter pelaaja)
482        {
483            //Yleiset näppäimet
484            Controls.Listen(pelaajaNro, Buttons.Start, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
485
486            Controls.Listen(pelaajaNro, Buttons.DPadLeft, ButtonPosition.Down, liikuta, "Pelaaja liikkuu vasemmalle", pelaaja, new Vector2D(-liikeVoima, 0));
487            Controls.Listen(pelaajaNro, Buttons.DPadRight, ButtonPosition.Down, liikuta, "Pelaaja liikkuu oikealle", pelaaja, new Vector2D(liikeVoima, 0));
488            Controls.Listen(pelaajaNro, Buttons.A, ButtonPosition.Pressed, hyppaa, "Pelaaja hyppää", pelaaja, hyppyVoima);
489        }
490
491        // Näppäimiin liitetyt toiminnot alkavat tästä -->
492        bool liikuta(ControlEvent e)
493        {
494            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
495            Vector2D voima = e.Parameter1.ToVector2D();
496            hahmo.Walk(e.Time, voima);
497            return false;
498        }
499
500        bool hyppaa(ControlEvent e)
501        {
502            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
503            double voima = e.Parameter1.ToDouble();
504
505            if (hahmo.Jump(voima))
506            {
507                this.PlaySound("hyppays");
508            }
509            return false;
510        }
511
512        bool uusiPeli(ControlEvent e)
513        {
514            PoistaVedet();
515            aikaLaskuri.Reset();
516            aloitaUusiPeli();         
517            return true;
518        }
519        #endregion
520
521
522        #region Tapahtumat
523        // Kun osutaan maaliin
524        void osuiMaaliin(Collision collision)
525        {
526            if (collision.Other.Tag == "maali")
527            {
528                this.PlaySound("maali");
529                MessageDisplay.Add("Pääsit läpi kentän " + kenttaNro);
530                PoistaVedet();
531
532                if (kenttaNro == kenttienMaara)
533                {
534                    pelaaja1.Velocity = Vector2D.Zero;
535                    ClearControls();
536                    ajastin.Stop();
537                    aikaLaskuri.Pause();
538                    lista.Show((int)aikaLaskuri.SecondCounter.Value);
539                }
540
541                else
542                {
543                    Level = seuraavaKentta();
544                }
545            }
546        }
547
548        void tuuppaa(Collision collision)
549        {           
550            if (collision.Other == pelaaja1)
551            {
552                ajastin.Stop();
553                aikaLaskuri.Pause();
554                pelaaja1.Destroy();
555                gameOverTeksti.Visible = true;
556                PoistaVedet();
557            }
558        }
559
560        void astuiMiinaan(Collision collision)
561        {
562            if (collision.Other == pelaaja1)
563            {
564                Controls.GameControllers[PlayerIndex.One].Vibrate(1000.0, 1000.0, 100.0, 100.0, 1.8);
565                ajastin.Stop();
566                aikaLaskuri.Pause();
567                Explosion rajahdys = new Explosion(400, 250, 50000);
568                rajahdys.Position = collision.Obj.Position;
569                Level.Objects.Add(rajahdys);
570                pelaaja1.Destroy();
571                collision.Obj.Destroy();
572                gameOverTeksti.Visible = true;
573                PoistaVedet();
574            }
575        }
576
577        void piikkiTuuppaus(Collision collision)
578        {
579            if (collision.Other == pelaaja1)
580            {
581                double luku1 = RandomGen.NextDoubleRange(-20000, -15000, 15000, 20000);
582                double luku2 = RandomGen.NextDoubleRange(-20000, -15000, 15000, 20000);
583
584                this.PlaySound("tuuppaus");
585                collision.Other.Hit(new Vector2D(luku1, luku2));
586            }
587        }
588        #endregion
589    }
590}
Note: See TracBrowser for help on using the repository browser.