source: jaana_j/TaivaanMuna/Peli.cs @ 433

Revision 433, 14.4 KB checked in by jaaannja, 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;
12
13
14namespace TaivaanMuna
15{
16    // Yksinkertainen tasohyppely.
17    class Tasohyppely : PhysicsGame
18    {
19       
20       
21        #region Muuttujat
22
23        const double liikeVoima = 4000;
24        const double hyppyVoima = 2500;
25
26        Meter<int> pisteLaskuri;
27        ValueDisplay pisteNaytto;
28        Meter<int> siemenLaskuri;
29        ValueDisplay siemenNaytto;
30
31        PlatformCharacter pelaaja1;
32        PhysicsObject maali;
33        HighScoreList lista;
34
35        int kenttaNro; // monesko kenttä on menossa
36
37        #endregion
38
39
40
41        #region Alustukset
42        protected override void LoadContent()
43        {
44            // Asetetaan kentän numero nollaksi, jota kasvatetaan kentän latauksessa (aina siis vähintään 1)
45            kenttaNro = 0;
46            DrawPerimeter = false; //ei haluta piirtää kentän reunoja
47            // Luodaan pistelaskuri
48            pisteLaskuri = new Meter<int>(0, 0, 1000000);
49            siemenLaskuri = new Meter<int>(0, 0, 100000);
50
51            // luodaan pistelaskunäyttö
52            pisteNaytto = new ValueDisplay(this);
53            pisteNaytto.Text = "Pisteitä: ";
54            pisteNaytto.X = Screen.RightSafe - 150;
55            pisteNaytto.Y = Screen.TopSafe - 50;
56            pisteNaytto.BindTo(pisteLaskuri);
57            Add(pisteNaytto);    // lisätään peliin
58
59            // luodaan siemennäyttö
60            siemenNaytto = new ValueDisplay(this);
61            siemenNaytto.Text = "Siemeniä: ";
62            siemenNaytto.X = Screen.RightSafe - 150;
63            siemenNaytto.Y = Screen.TopSafe - 950;
64            siemenNaytto.BindTo(siemenLaskuri);
65            Add(siemenNaytto);    // lisätään peliin
66
67            //luodaan top-10 lista
68            lista = HighScoreList.LoadOrCreate(this, "topten.dat", 10);
69
70
71            //Taustamusiikki
72
73            {
74                Song musiikki = Content.Load<Song>("taustamusiikki");
75                MediaPlayer.Play(musiikki);
76            }
77
78
79
80            // Asetetaan painovoima
81            Gravity = new Vector2D(0, -1000);
82
83            // Zoomataan lähemmäksi
84            Camera.ZoomFactor = 2.0;
85
86            aloitaUusiPeli();
87
88        }
89
90        void aloitaUusiPeli()
91        {
92            MessageDisplay.Clear();
93
94            kenttaNro = 0;
95
96            // ladataan kenttä
97            Level = seuraavaKentta();
98
99            // Laitetaan peliohje näyttöön
100            MessageDisplay.Add("Pika ohjeet:");
101            MessageDisplay.Add("1. Etsi koti linna! Pääset maaliin, kun olet saanut 10-pistettä!");
102            MessageDisplay.Add("2. Mutta varo tähtiä! Niillä on ikävät aikomukset...!");
103            MessageDisplay.Add("3. Keräämällä siemenlootia saat ammuksia tähtiä vastaan! Muna ampuu välilyönti-näppäimellä!");
104            MessageDisplay.Add("4. Kun pääset tason 10 läpi, voit päästä ehkäpä top-10 listoille! Onnea!");
105        }
106        #endregion
107
108
109
110        #region KentanLataus
111        Level seuraavaKentta()
112        {
113            pisteLaskuri.Reset();
114            kenttaNro += 1; // lisätään kenttänumeroa yhdellä
115            MessageDisplay.Add("Kenttä " + kenttaNro);
116            Level seuraava = luoKentta();
117            lisaaNappaimet();
118            Camera.Follow(pelaaja1);
119           
120            return seuraava;
121        }
122
123        Level luoKentta()
124        {
125            Level kentta = new Level(this, 1500, 1400); // Tässä määritetään kentän leveys ja korkeus
126            kentta.CreateBorder();
127            kentta.Borders.Visible = false;
128            kentta.Background.CreateGradient(Color.White, Color.SkyBlue);
129
130            Platform alusta = new Platform(kentta.Width, 300, Color.White);
131            alusta.X = 0;
132            alusta.Y = kentta.Bottom - alusta.Height / 2;
133            kentta.Objects.Add(alusta);
134
135            for (int i = 0; i < 55; i++)
136            {
137                lisaaPieniTaso(kentta, 
138                               kentta.Left+RandomGen.NextDouble(0,kentta.Width), 
139                               alusta.Y+RandomGen.NextDouble(0,kentta.Height));
140            }
141
142            int siementenMaara = kenttaNro; 
143            lisaaSiemenet(kentta, siementenMaara);
144            lisaaMaali(kentta);
145            lisaaPelaajat(kentta);
146
147            int vihollistenMaara = kenttaNro * 2;
148            lisaaViholliset(kentta, vihollistenMaara);
149
150            return kentta;
151        }
152
153        void lisaaSiemenet(Level kentta, int siementenMaara)
154        {
155            for (int i = 0; i < siementenMaara; i++)
156            {
157                PhysicsObject Siemen = new PhysicsObject(5, Shapes.CreateRectangle(25, 25));
158                Siemen.X = RandomGen.NextDouble(kentta.Left, kentta.Right);
159                Siemen.Y = RandomGen.NextDouble(200, kentta.Top);
160                kentta.Objects.Add(Siemen);
161                AddCollisionHandler(Siemen, osuttiinSiemenLootaan);
162                Siemen.Texture = Content.Load<Texture2D>("Siemenet");
163             
164            }
165       
166        }
167
168        void lisaaPieniTaso(Level kentta, double x, double y)
169        {
170            Platform taso = new Platform(100, 30, Color.White);
171            taso.Texture = Content.Load<Texture2D>("Pilvi");
172            taso.X = x;
173            taso.Y = y;
174            kentta.Objects.Add(taso);           
175        }
176
177        void lisaaPelaajat(Level kentta)
178        {
179            pelaaja1 = new PlatformCharacter(4, Shapes.CreateCircle(20));
180            pelaaja1.Texture = Content.Load<Texture2D>("Muna");
181            pelaaja1.X = 0;
182            pelaaja1.Y = kentta.Bottom + 120;
183
184            AddCollisionHandler(pelaaja1, osuiMaaliin);
185            AddCollisionHandler(pelaaja1, osuiPilveen);
186
187            kentta.Objects.Add(pelaaja1);
188
189            Texture2D[] munaTex = {    Content.Load<Texture2D>( "Muna" ),
190                                       Content.Load<Texture2D>( "Muna" ),
191                                       Content.Load<Texture2D>( "Muna1" ),
192                                       Content.Load<Texture2D>( "Muna1" ),
193                                       Content.Load<Texture2D>( "Muna2" ), 
194                                       Content.Load<Texture2D>( "Muna2" ),
195                                     
196                                   };
197            pelaaja1.RightIdleTexture = new AnimatedTexture(Content.Load<Texture2D>("Muna"));
198            //pelaaja1.AnimatedTexture = new AnimatedTexture(munaTex);
199            pelaaja1.RightWalkingTexture = new AnimatedTexture(munaTex);
200            pelaaja1.LeftWalkingTexture = new AnimatedTexture(munaTex);
201           
202           
203        }
204
205       
206        void lisaaMaali(Level kentta)
207        {
208            maali = PhysicsObject.CreateStaticObject(Shapes.CreateCircle(60));
209            maali.Tag = "maali";
210            maali.IgnoresCollisionResponse = true;
211            maali.X = 0;
212            maali.Y = 325;
213            maali.Texture = Content.Load<Texture2D>("maali");
214            kentta.Objects.Add(maali);
215        }
216
217        void lisaaViholliset(Level kentta, int kpl)
218        {
219            for (int i = 0; i < kpl; i++)
220            {
221                PlatformCharacter vihollinen = new PlatformCharacter(100, Shapes.CreateCircle(20));
222                vihollinen.Brain = new RandomMoverBrain();
223                vihollinen.X = maali.X;
224                vihollinen.Y = maali.Y;
225                vihollinen.Tag = "pahis";
226                vihollinen.IgnoresGravity = true;
227                vihollinen.Texture = Content.Load<Texture2D>("tahti");
228                AddCollisionHandler(vihollinen, tuuppaa);
229                kentta.Objects.Add(vihollinen);
230            }
231        }
232        #endregion
233
234
235
236        #region Nappaimet
237        // Lisää peliin kaikki näppäimet
238        void lisaaNappaimet()
239        {
240            ClearControls();
241            //Yleiset näppäimet
242            Controls.Listen(Keys.Enter, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
243
244            // Pelaajan näppäimet
245            Controls.Listen(Keys.Left, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector2D(-liikeVoima, 0));
246            Controls.Listen(Keys.Right, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja1, new Vector2D(liikeVoima, 0));
247            Controls.Listen(Keys.Up, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja1, hyppyVoima);
248            Controls.Listen(Keys.Space, ButtonPosition.Pressed, heitaSiemen, "Heitä", pelaaja1);
249
250            lisaaGamePadNappaimet(PlayerIndex.One, pelaaja1);
251        }
252
253        void lisaaGamePadNappaimet(PlayerIndex pelaajaNro, PlatformCharacter pelaaja)
254        {
255            //Yleiset näppäimet
256            Controls.Listen(pelaajaNro, Buttons.Start, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
257
258            Controls.Listen(pelaajaNro, Buttons.DPadLeft, ButtonPosition.Down, liikuta, "Pelaaja liikkuu vasemmalle", pelaaja, new Vector2D(-liikeVoima, 0));
259            Controls.Listen(pelaajaNro, Buttons.DPadRight, ButtonPosition.Down, liikuta, "Pelaaja liikkuu oikealle", pelaaja, new Vector2D(liikeVoima, 0));
260            Controls.Listen(pelaajaNro, Buttons.A, ButtonPosition.Pressed, hyppaa, "Pelaaja hyppää", pelaaja, hyppyVoima);
261        }
262
263        // Näppäimiin liitetyt toiminnot alkavat tästä -->
264        bool liikuta(ControlEvent e)
265        {
266            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
267            Vector2D voima = e.Parameter1.ToVector2D();
268            hahmo.Walk(e.Time, voima);
269            return false;
270        }
271
272        bool hyppaa(ControlEvent e)
273        {
274            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
275            double voima = e.Parameter1.ToDouble();
276
277            if (hahmo.Jump(voima))
278            {
279                this.PlaySound("hyppays");
280            }
281            return false;
282        }
283
284        bool heitaSiemen(ControlEvent e)
285        {
286            if (siemenLaskuri.Value > 0)
287            {
288                //Bullet siemen = new Bullet();
289                //siemen.Texture = Content.Load<Texture2D>("Siemen");
290                PhysicsObject siemen = new PhysicsObject(5, Shapes.CreateCircle(5));
291                Vector2D v = new Vector2D(-3000, 200);
292                siemen.Texture = Content.Load<Texture2D>("Siemen1");
293                Level.Objects.Add(siemen);
294                AddCollisionHandler(siemen, siemenOsui);
295                siemen.X = pelaaja1.X;
296                siemen.Y = pelaaja1.Y;
297                siemen.Hit(v);
298                siemenLaskuri.Value--;
299               
300            }
301            return false;
302        }
303
304         bool uusiPeli(ControlEvent e)
305        {
306            aloitaUusiPeli();
307            return true;
308        }
309        #endregion
310
311
312
313        #region Tapahtumat
314         //Kun osutaan maaliin
315        void osuiMaaliin(Collision collision)
316        {
317            if (collision.Other.Tag == "maali" && pisteLaskuri.Value>19)
318            {
319                if (kenttaNro == 10)
320                {
321                    peliLoppui();
322                }
323
324                maali.Texture = Content.Load<Texture2D>("maali");
325                this.PlaySound("maali");
326                int edellisenKentanPisteet = pisteLaskuri.Value;
327                Level = seuraavaKentta();
328                MessageDisplay.Add("Pääsit läpi kentän " + kenttaNro + ". Pisteitä: " + edellisenKentanPisteet);
329
330            }
331        }
332
333        void peliLoppui()
334        {
335            lista.Show( pisteLaskuri.Value );
336        }
337
338        //Osui Pilveen
339        void osuiPilveen(Collision collision)
340        {
341            if (collision.Other is Platform && collision.Other.Color == Color.White) // Tarkistetaan ettei osuta maahan, koska maan ei tietenkään haluta häviävän
342            { 
343                //Pilvi häviää ja pelaaja ponnahtaa ylöspäin
344                collision.Other.Lifetime.IsExpired = true; //pilvi häviää
345                Vector2D hyppaysvoima = new Vector2D(0, 5000); //luodaan ponnahdusvektori
346                collision.Obj.Hit(hyppaysvoima); //annetaan pelaajalle ponnahdusvoima
347                //Miten tehtäsiin se, että pilvi ilmestyisi takaisin muutaman sekunnin päästä...?
348                pisteLaskuri.Value += 1;
349            }
350        }
351       
352        void keraa(Collision collision)
353        {
354            if (collision.Other.Equals(pelaaja1))
355            {
356                PhysicsObject tahti = collision.Obj;
357                tahti.Destroy();
358                this.PlaySound("kerays", -0.5, 0.5);
359             }
360        }
361
362        // Kerää Siemenen
363        void osuttiinSiemenLootaan(Collision collision)
364        {
365            if (collision.Other.Equals(pelaaja1))
366            {
367                PhysicsObject Siemen = collision.Obj;
368                Siemen.Destroy();
369                this.PlaySound("kerays", -0.5, 0.5);
370                siemenLaskuri.Value += 10; // Lisätään siemenlaskuriin 10 panosta lisää
371            }
372        }
373
374        void siemenOsui(Collision collision)
375        {
376            if (collision.Other is PlatformCharacter)
377            {
378                PlatformCharacter pc = collision.Other as PlatformCharacter;
379                if (pc.Tag == "pahis")
380                {
381                    pc.Destroy();
382                }
383            }
384         
385
386        }
387
388        // Haamu tuuppaa pelaajaa
389        void tuuppaa(Collision collision)
390        {
391            if (collision.Other is PlatformCharacter)
392            {
393                double luku1 = RandomGen.NextIntRange(-10000, -8000, 8000, 10000);
394                double luku2 = RandomGen.NextIntRange(-10000, -8000, 8000, 10000);
395
396                if (collision.Other == pelaaja1)
397                {
398                    // pieni värinä törmäyksestä
399                    Controls.GameControllers[PlayerIndex.One].Vibrate(0.5, 0.5, 0.0, 0.0, 0.1);
400                }
401                this.PlaySound("tuuppaus");
402                collision.Other.Hit(new Vector2D(luku1, luku2));
403            }
404
405
406        }
407
408
409        //Tässä pitäisi olla se, missä tehdään taustamuiikkia
410       
411
412
413        #endregion
414    }
415}
Note: See TracBrowser for help on using the repository browser.