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

Revision 427, 15.2 KB checked in by rejulein, 10 years ago (diff)

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