source: renne_l/Zombi tasohyppely/Peli.cs @ 393

Revision 393, 14.0 KB checked in by rejulein, 10 years ago (diff)

peli melkein valmis

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 Zombi_tasohyppely
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        ValueDisplay pisteNaytto;
26
27        PlatformCharacter pelaaja1;
28        PhysicsObject maali;
29        PhysicsObject avain;
30        Platform muuuritaso;
31       
32       
33
34        int kenttaNro; // monesko kenttä on menossa
35
36        HighScoreList lista;
37
38        #endregion
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
47            DrawPerimeter = false; // ei haluta piirtää kentän reunoja
48
49            // Luodaan pistelaskuri
50            pisteLaskuri = new Meter<int>(0, 0, 1000000);
51
52            lista = HighScoreList.LoadOrCreate(this, "topten.dat", 10);
53
54            Camera.StayInLevel = true;
55
56           
57            // luodaan pistelaskunäyttö
58            pisteNaytto = new ValueDisplay(this);
59            pisteNaytto.Text = "Pisteitä: ";
60            pisteNaytto.X = Screen.RightSafe - 250;
61            pisteNaytto.Y = Screen.TopSafe - 50;
62            pisteNaytto.BindTo(pisteLaskuri);
63            Add(pisteNaytto);    // lisätään peliin
64
65
66            // Asetetaan painovoima
67            Gravity = new Vector2D(0, -1000);
68
69            // Zoomataan lähemmäksi
70            Camera.ZoomFactor = 2.3;
71
72            aikaLaskuri = new Meter<double>(60, 0, 60);  // aikaLaskurin oletuksena on 30 sekuntia, minimiarvona 0 sekuntia ja maksimiarvona 30 sekuntia
73            aikaNaytto = new ValueDisplay(this);         // luo uuden aikaNayton
74            aikaNaytto.Text = "Aikaa jäljellä: ";          // laitetaan näytöllä näkyvä teksti
75            aikaNaytto.TextColor = Color.Blue;          // vaihdetaan tekstin väriä
76            aikaNaytto.FormatDouble(0, true);            // asetetaan näyttämään aika siten, ettei siinä näy yhtään (0) desimaalia
77            aikaNaytto.BindTo(aikaLaskuri);              // liitetään aikaNaytto aikaLaskuriin
78            aikaLaskuri.LowerLimit += new Meter<double>.OnLimitHandler(AikaLoppui);  // asetetaan tapahtuma, kun aikaLaskurin arvona on 0.
79            Add(aikaNaytto);
80            aloitaUusiPeli();
81            aikaNaytto.X = -550;
82            aikaNaytto.Y = 400;
83
84        }
85        private void AikaLoppui(Meter<double> sender)
86        {
87            MessageDisplay.Add("Aika loppui...");  // näytetään viestinäytöllä teksti
88
89            aloitaUusiPeli();
90
91            aikaLaskuri.Reset();  // nollataan aikalaskuri oletusarvoonsa, joka oli 0.
92        }
93        protected override void OnUpdate(GameTime time)
94        {
95            aikaLaskuri.Value -= time.ElapsedGameTime.TotalSeconds;  // päivittää aikalaskuria siten, että arvosta vähennetään kulunut aika
96            base.OnUpdate(time);                                   // tämä rivi tarvitsee myös olla tässä. selitys: päivittää myös kantaluokan, josta peli on peritty.
97        }
98        Meter<double> aikaLaskuri;
99        ValueDisplay aikaNaytto;
100
101
102        void aloitaUusiPeli()
103        {
104            MessageDisplay.Clear();
105
106            kenttaNro = 0;
107
108            // ladataan kenttä
109            Level = seuraavaKentta();
110
111            // Laitetaan peliohje näyttöön
112            MessageDisplay.Add("Etsi avain ja pääset sen jälkeen rokotteen luo");
113            MessageDisplay.Add("Mutta varo zombeja...");
114        }
115        #endregion
116
117
118
119
120
121
122
123        #region KentanLataus
124        Level seuraavaKentta()
125        {
126
127            pisteLaskuri.Reset();
128            kenttaNro += 1; // lisätään kenttänumeroa yhdellä
129            MessageDisplay.Add("Kenttä " + kenttaNro);
130            Level seuraava = luoKentta();
131            lisaaNappaimet();
132            Camera.Follow(pelaaja1);
133            return seuraava;
134        }
135
136        Level luoKentta()
137        {
138            Level kentta = new Level(this, 2000, 1000);
139            kentta.CreateBorder();
140            kentta.Borders.Visible = false;
141            kentta.Background.CreateGradient(Color.FloralWhite, Color.SkyBlue);
142
143            Platform alusta = new Platform(kentta.Width, 300, Color.SeaGreen);
144            alusta.X = 0;
145            alusta.Y = kentta.Bottom - alusta.Height / 2+30;
146            kentta.Objects.Add(alusta);
147
148            lisaaPieniTaso(kentta, -200, -400);
149            lisaaPieniTaso(kentta, -10, -250);
150            lisaaPieniTaso(kentta, 300, -230);
151            lisaaPieniTaso(kentta, 500, 200);
152            lisaaPieniTaso(kentta, 500, -180);
153            lisaaPieniTaso(kentta, 200, 320);
154            lisaaPieniTaso(kentta, 100, 320);
155            lisaaPieniTaso(kentta, -10, 320);
156            lisaaPieniTaso(kentta, 50, 150);
157            lisaaisotaso(kentta, -500, 300);
158            lisaakorkeataso(kentta, -750, 160);
159            lisaaPieniTaso(kentta, -70, 140);
160            lisaaPieniTaso(kentta, 750, -30);
161            lisaaPieniTaso(kentta, 600, 150);
162            lisaaPieniTaso(kentta, 600, -50);
163            lisaaPieniTaso(kentta, -170, 58);
164            lisaaPieniTaso(kentta, -300, 54);
165            lisaakeskitaso(kentta, -650, 50);
166            lisaamuuritaso(kentta, -600, 165);
167           
168            lisaaMaali(kentta);
169            lisaaPelaajat(kentta);
170            lisaaavain(kentta);
171           
172
173
174            int vihollistenMaara = kenttaNro;
175            lisaaViholliset(kentta, vihollistenMaara);
176
177            return kentta;
178        }
179
180
181        void lisaamuuritaso(Level kentta,double x, double y)
182        {
183            Platform taso = new Platform(20, 220, Color.Gray);
184            taso.X = x;
185            taso.Y = y;
186            kentta.Objects.Add(taso);
187            muuuritaso= taso;
188
189 }
190        void lisaaPieniTaso(Level kentta, double x, double y)
191        {
192            Platform taso = new Platform(65, 30, Color.BurlyWood);
193            taso.Texture = Content.Load<Texture2D>("tiili2");
194            taso.X = x;
195            taso.Y = y;
196            kentta.Objects.Add(taso);
197        }
198        void lisaaisotaso(Level kentta, double x, double y)
199        {
200            Platform taso = new Platform(700, 30, Color.Green);
201            taso.Texture = Content.Load<Texture2D>("tiili");
202            taso.X = x;
203            taso.Y = y;
204            kentta.Objects.Add(taso);
205        }
206        void lisaakorkeataso(Level kentta, double x, double y)
207        {
208            Platform taso = new Platform(30, 400, Color.BurlyWood);
209            taso.X = x;
210            taso.Y = y;
211            kentta.Objects.Add(taso);
212        }
213
214        void lisaakeskitaso(Level kentta, double x, double y)
215        {
216            Platform taso = new Platform(140, 30, Color.BurlyWood);
217            taso.Texture = Content.Load<Texture2D>("tiili3");
218            taso.X = x;
219            taso.Y = y;
220            kentta.Objects.Add(taso);
221        }
222
223        void lisaaPelaajat(Level kentta)
224        {
225            pelaaja1 = new PlatformCharacter(4, Shapes.CreateCircle(20));
226            pelaaja1.Texture = Content.Load<Texture2D>("linkk");
227            pelaaja1.X = 0;
228            pelaaja1.Y = kentta.Bottom + 120;
229
230            AddCollisionHandler(pelaaja1, osuiMaaliin);
231
232            kentta.Objects.Add(pelaaja1);
233        }
234
235        void lisaaTahdet(Level kentta)
236        {
237            for (int i = 0; i < 20; 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>("tahti");
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 = -700;
256            maali.Y = 120;
257            maali.Texture = Content.Load<Texture2D>("risti");
258            kentta.Objects.Add(maali);
259
260        }
261
262        void lisaaavain(Level kentta)
263        {
264            avain = PhysicsObject.CreateStaticObject(Shapes.CreateCircle(25));
265            avain.Tag = "avain";
266            avain.IgnoresCollisionResponse = true;
267            avain.X = -890;
268            avain.Y = 120;
269            avain.Texture = Content.Load<Texture2D>("avain");
270            kentta.Objects.Add(avain);
271            AddCollisionHandler(avain, osuiavaimeen);
272
273
274
275        }
276
277
278        void lisaaViholliset(Level kentta, int kpl)
279        {
280            for (int i = 0; i < 6; i++)
281            {
282                PlatformCharacter vihollinen = new PlatformCharacter(100, Shapes.CreateCircle(30));
283                vihollinen.Brain = new RandomMoverBrain();
284                vihollinen.X = 120;
285                vihollinen.Y = 120;
286                vihollinen.IgnoresGravity = true;
287                vihollinen.Texture = Content.Load<Texture2D>("skeleton");
288                AddCollisionHandler(vihollinen, alkuun);
289                kentta.Objects.Add(vihollinen);
290            }
291        }
292        #endregion
293        void alkuun(Collision collision)
294        {
295            if (collision.Other == pelaaja1)
296            {
297                pelaaja1.X = 0;
298                pelaaja1.Y = -430;
299            }
300        }
301        #region Nappaimet
302        // Lisää peliin kaikki näppäimet
303        void lisaaNappaimet()
304        {
305            ClearControls();
306            //Yleiset näppäimet
307            Controls.Listen(Keys.Enter, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
308
309            // Pelaajan näppäimet
310            Controls.Listen(Keys.Left, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector2D(-liikeVoima, 0));
311            Controls.Listen(Keys.Right, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja1, new Vector2D(liikeVoima, 0));
312            Controls.Listen(Keys.Up, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja1, hyppyVoima);
313
314            lisaaGamePadNappaimet(PlayerIndex.One, pelaaja1);
315        }
316
317        void lisaaGamePadNappaimet(PlayerIndex pelaajaNro, PlatformCharacter pelaaja)
318        {
319            //Yleiset näppäimet
320            Controls.Listen(pelaajaNro, Buttons.Start, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
321
322            Controls.Listen(pelaajaNro, Buttons.DPadLeft, ButtonPosition.Down, liikuta, "Pelaaja liikkuu vasemmalle", pelaaja, new Vector2D(-liikeVoima, 0));
323            Controls.Listen(pelaajaNro, Buttons.DPadRight, ButtonPosition.Down, liikuta, "Pelaaja liikkuu oikealle", pelaaja, new Vector2D(liikeVoima, 0));
324            Controls.Listen(pelaajaNro, Buttons.A, ButtonPosition.Pressed, hyppaa, "Pelaaja hyppää", pelaaja, hyppyVoima);
325        }
326
327        // Näppäimiin liitetyt toiminnot alkavat tästä -->
328        bool liikuta(ControlEvent e)
329        {
330            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
331            Vector2D voima = e.Parameter1.ToVector2D();
332            hahmo.Walk(e.Time, voima);
333            return false;
334        }
335
336        bool hyppaa(ControlEvent e)
337        {
338            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
339            double voima = e.Parameter1.ToDouble();
340
341            if (hahmo.Jump(voima))
342            {
343                this.PlaySound("hyppays");
344            }
345            return false;
346        }
347
348        bool uusiPeli(ControlEvent e)
349        {
350            aloitaUusiPeli();
351            return true;
352        }
353        #endregion
354
355
356        #region Tapahtumat
357        // Kun osutaan maaliin
358        void osuiMaaliin(Collision collision)
359        {
360
361            if (collision.Other.Tag == "maali")
362            {
363                int edellisenKentanPisteet = (int)aikaLaskuri.Value;
364                lista.Show(edellisenKentanPisteet);
365                this.PlaySound("maali");
366                Level = seuraavaKentta();
367                MessageDisplay.Add("Pääsit läpi kentän " + kenttaNro + ". Pisteitä: " + edellisenKentanPisteet);
368                aikaLaskuri.Reset();
369
370            }
371
372        }
373
374        void osuiavaimeen(Collision collision)
375 { if (collision.Other.Equals(pelaaja1))
376 {
377     PhysicsObject avain = collision.Obj;
378     avain.Destroy();
379     muuuritaso.Destroy();
380     this.PlaySound("kerays", -0.5, 0.5);
381     }
382 }
383
384        // Kerää tähden ja antaa pisteen
385        void keraa(Collision collision)
386        {
387            if (collision.Other.Equals(pelaaja1))
388            {
389                PhysicsObject tahti = collision.Obj;
390                tahti.Destroy();
391
392                this.PlaySound("kerays", -0.5, 0.5);
393                pisteLaskuri.Value += 1;
394            }
395        }
396
397        // Haamu tuuppaa pelaajaa
398        void tuuppaa(Collision collision)
399        {
400            if (collision.Other is PlatformCharacter)
401            {
402                double luku1 = RandomGen.NextIntRange(-10000, -8000, 8000, 10000);
403                double luku2 = RandomGen.NextIntRange(-10000, -8000, 8000, 10000);
404
405                if (collision.Other == pelaaja1)
406                {
407                    // pieni värinä törmäyksestä
408                    Controls.GameControllers[PlayerIndex.One].Vibrate(0.5, 0.5, 0.0, 0.0, 0.1);
409                }
410                this.PlaySound("tuuppaus");
411                collision.Other.Hit(new Vector2D(luku1, luku2));
412            }
413        }
414        #endregion
415    }
416}
Note: See TracBrowser for help on using the repository browser.