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

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