source: nuutti_m/Tasohyppely2/Peli.cs @ 394

Revision 394, 15.6 KB checked in by nuvamikk, 11 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 Tasohyppely2
15{
16    // Yksinkertainen tasohyppely.
17    class Tasohyppely : PhysicsGame
18    {
19        #region Muuttujat
20
21        const double liikeVoima = 4000;
22        const double hyppyVoima = 2780;
23
24        PlatformCharacter pelaaja1;
25        PlatformCharacter pelaaja2;
26        PhysicsObject maali;
27        TextDisplay loppuviesti;
28
29        Meter<int> pelaajan1Pisteet;
30        Meter<int> pelaajan2Pisteet;
31
32        int kenttaNro; // monesko kenttä on menossa
33
34        Meter<int> LuoPisteLaskuri(double x, double y)
35        {
36            Meter<int> laskuri = new Meter<int>(0, 0, 1000);
37            ValueDisplay naytto = new ValueDisplay(this);
38            naytto.BindTo(laskuri);
39            naytto.X = x;
40            naytto.Y = y;
41            naytto.ValueColor = Color.AliceBlue;
42            Add(naytto);
43            return laskuri;
44        }
45
46        Timer aikaLaskuri;       
47        ValueDisplay aikaNaytto;   
48
49
50        #endregion
51
52     
53        #region Alustukset
54        protected override void LoadContent()
55        {
56            loppuviesti = new TextDisplay(this);
57            loppuviesti.Text = "Aika loppui!";
58            Add(loppuviesti);
59            loppuviesti.Visible = false;
60
61            aikaLaskuri = new Timer();                   
62            aikaLaskuri.Interval = 120;                     
63            aikaLaskuri.Trigger += new Timer.TriggerHandler(aikaLoppui); 
64            AddTimer(aikaLaskuri);                     
65            aikaLaskuri.Start();                         
66
67            aikaNaytto = new ValueDisplay(this);       
68            aikaNaytto.Text = "Aikaa mennyt: ";         
69            aikaNaytto.TextColor = Color.Crimson;         
70            aikaNaytto.FormatDouble(0, true);         
71            aikaNaytto.BindTo(aikaLaskuri.SecondCounter); 
72           
73            // Asetetaan kentän numero nollaksi, jota kasvatetaan kentän latauksessa (aina siis vähintään 1)
74            kenttaNro = 0;
75
76            DrawPerimeter = false; // ei haluta piirtää kentän reunoja
77
78            Timer ajastin = new Timer();
79            ajastin.Interval = 45;
80            ajastin.Trigger += new Timer.TriggerHandler(lisaaTahtia);
81            AddTimer(ajastin);
82
83            Timer ajastin2 = new Timer();
84            ajastin.Interval = 90;
85            ajastin.Trigger += new Timer.TriggerHandler(lisaaTahtia2);
86            AddTimer(ajastin);
87
88            LisaaLaskurit();
89   
90            // Asetetaan painovoima
91            Gravity = new Vector2D(0, -1000);
92
93            // Zoomataan lähemmäksi
94            Camera.ZoomFactor = 0.500;
95
96            aloitaUusiPeli();
97
98            ajastin.Start();
99        }
100        private void aikaLoppui(Timer sender)
101        {
102            MessageDisplay.Add("Aika loppui...");
103
104            if (pelaajan1Pisteet.Value > pelaajan2Pisteet.Value)
105            {
106                loppuviesti.Text = "Pelaaja 1 voitti! Pisteitä: " + pelaajan1Pisteet.Value;
107            }
108            else if (pelaajan1Pisteet.Value < pelaajan2Pisteet.Value)
109            {
110                loppuviesti.Text = "Pelaaja 2 voitti! Pisteitä: " + pelaajan2Pisteet.Value;
111            }
112            else
113            {
114                loppuviesti.Text = "Tasapeli!";
115            }
116
117            loppuviesti.Visible = true;
118            pelaaja1.Destroy();
119            pelaaja2.Destroy();
120
121        }
122
123       
124
125        void LisaaLaskurit()
126        {
127            pelaajan1Pisteet = LuoPisteLaskuri(Screen.Left + 100.0, Screen.Top - 100.0);
128            pelaajan2Pisteet = LuoPisteLaskuri(Screen.Right - 100.0, Screen.Top - 100.0);
129        }
130
131        void aloitaUusiPeli()
132        {
133            MessageDisplay.Clear();
134
135            kenttaNro = 0;
136
137            // ladataan kenttä
138            Level = seuraavaKentta();
139
140            // Laitetaan peliohje näyttöön
141            MessageDisplay.Add("Kerää enemmän tähtiä kuin toinen!");
142            MessageDisplay.Add("Mutta varo haamuja...");
143        }
144        #endregion
145
146
147        #region KentanLataus
148        Level seuraavaKentta()
149        {
150           
151            kenttaNro += 1; // lisätään kenttänumeroa yhdellä
152            MessageDisplay.Add("Kenttä " + kenttaNro);
153            Level seuraava = luoKentta();
154            lisaaNappaimet();
155            Camera.Zoom(1.28);
156            return seuraava;
157        }
158
159
160
161        Level luoKentta()
162        {
163
164           
165            Level kentta = new Level(this, 2000, 1600);
166            kentta.CreateBorder();
167            kentta.Borders.Visible = false;
168            kentta.Background.Image = Content.Load<Texture2D>("Untitled2");
169            kentta.Background.Width = 2000;
170            kentta.Background.Height = 1600;
171
172
173            Platform alusta = new Platform(kentta.Width, 300, Color.Green);
174            alusta.X = 0;
175            alusta.Y = kentta.Bottom - alusta.Height / 2;
176            kentta.Objects.Add(alusta);
177
178            lisaaPieniTaso(kentta, -200, -250);
179            lisaaPieniTaso(kentta, 200, -350);
180            lisaaPieniTaso(kentta, 400, 150);
181            lisaaPieniTaso(kentta, 400, -150);
182            lisaaPieniTaso(kentta, 500, 0);
183            lisaaPieniTaso(kentta, -500, 0);
184            lisaaPieniTaso(kentta, -400, 100);
185            lisaaPieniTaso(kentta, 0, 100);
186            lisaaPieniTaso(kentta, -100, 400);
187            lisaaPieniTaso(kentta, 0, -250);
188            lisaaPieniTaso(kentta, -300, 250);
189            lisaaPieniTaso(kentta, 0, -500);
190            lisaaPieniTaso(kentta, 250, 500);
191            lisaaPieniTaso(kentta, 50, 100);
192            lisaaPieniTaso(kentta, 100, -650);
193            lisaaPieniTaso(kentta, -150, 525);
194           
195            lisaaMaali(kentta);
196            lisaaPelaajat(kentta);
197            lisaaTahdet(kentta);
198
199            int vihollistenMaara = kenttaNro;
200            lisaaViholliset(kentta, vihollistenMaara);
201
202
203           
204            return kentta;
205        }
206        void lisaaTahtia(Timer sender)
207        {
208            for (int i = 0; i < 100; i++)
209            {
210
211                PhysicsObject tahti = new PhysicsObject(0.005, Shapes.CreateCircle(12));
212                tahti.X = RandomGen.NextDouble(-475.0, 475.0);
213                tahti.Y = 700.0;
214                tahti.Restitution = 0.1;
215                tahti.Texture = Content.Load<Texture2D>("banana");
216                AddCollisionHandler(tahti, keraa);
217                Level.Objects.Add(tahti);
218            }
219        }
220
221        void lisaaTahtia2(Timer sender)
222        {
223            for (int i = 0; i < 100; i++)
224            {
225
226                PhysicsObject tahti = new PhysicsObject(0.005, Shapes.CreateCircle(12));
227                tahti.X = RandomGen.NextDouble(-475.0, 475.0);
228                tahti.Y = 700.0;
229                tahti.Restitution = 0.1;
230                tahti.Texture = Content.Load<Texture2D>("banana");
231                AddCollisionHandler(tahti, keraa);
232                Level.Objects.Add(tahti);
233            }
234        }
235
236        void lisaaTahtia3(Timer sender)
237        {
238            for (int i = 0; i < 100; i++)
239            {
240
241                PhysicsObject tahti = new PhysicsObject(0.005, Shapes.CreateCircle(20));
242                tahti.X = RandomGen.NextDouble(-475.0, 475.0);
243                tahti.Y = 700.0;
244                tahti.Restitution = 0.1;
245                tahti.Texture = Content.Load<Texture2D>("banana");
246                AddCollisionHandler(tahti, keraa);
247                Level.Objects.Add(tahti);
248            }
249        }
250
251
252        void lisaaPieniTaso(Level kentta, double x, double y)
253        {
254            Platform taso = new Platform(100, 30, Color.Green);
255            taso.X = x;
256            taso.Y = y;
257            kentta.Objects.Add(taso);
258        }
259
260        void lisaaPelaajat(Level kentta)
261        {
262            pelaaja1 = new PlatformCharacter(4, Shapes.CreateRectangle(70,105));
263            pelaaja1.Texture = Content.Load<Texture2D>("monkey");
264            pelaaja1.X = 0;
265            pelaaja1.Y = kentta.Bottom + 120;
266            pelaaja1.Restitution = 1.0;
267
268            pelaaja2 = new PlatformCharacter(4, Shapes.CreateRectangle(70, 105));
269            pelaaja2.Texture = Content.Load<Texture2D>("monkey2");
270            pelaaja2.X = 100;
271            pelaaja2.Y = kentta.Bottom + 120;
272            pelaaja2.Restitution = 1.0;
273     
274            kentta.Objects.Add(pelaaja1);
275            kentta.Objects.Add(pelaaja2);
276        }
277
278        void lisaaTahdet(Level kentta)
279        {
280            for (int i = 0; i < 100; i++)
281            {
282                PhysicsObject tahti = new PhysicsObject(0.005, Shapes.CreateCircle(12));
283                tahti.X = RandomGen.NextDouble(-475.0, 475.0);
284                tahti.Y = 700.0;
285                tahti.Restitution = 0.1;
286                tahti.Texture = Content.Load<Texture2D>("banana");
287                AddCollisionHandler(tahti, keraa);
288                kentta.Objects.Add(tahti);
289               
290            }
291        }
292
293        void lisaaMaali(Level kentta)
294        {
295            maali = PhysicsObject.CreateStaticObject(Shapes.CreateCircle(25));
296            maali.Tag = "isoBanaani";
297            maali.IgnoresCollisionResponse = true;
298            maali.X = 0;
299            maali.Y = 325;
300            maali.Texture = Content.Load<Texture2D>("banana");
301            kentta.Objects.Add(maali);
302            AddCollisionHandler(maali, lisaabanaaneita);
303        }
304        bool lisaabanaaneita(Collision c)
305        {
306            for (int i2 = 0; i2 < 50; i2++)
307            {
308                PhysicsObject tahti = new PhysicsObject(0.005, Shapes.CreateCircle(12));
309                tahti.X = RandomGen.NextDouble(-475.0, 475.0);
310                tahti.Y = 700.0;
311                tahti.Restitution = 0.1;
312                tahti.Texture = Content.Load<Texture2D>("banana");
313                AddCollisionHandler(tahti, keraa);
314                Level.Objects.Add(tahti);
315
316            }
317        }
318        void lisaaViholliset(Level kentta, int kpl)
319        {
320            for (int i = 0; i < kpl; i++)
321            {
322                PlatformCharacter vihollinen = new PlatformCharacter(100, Shapes.CreateCircle(30));
323                vihollinen.Brain = new RandomMoverBrain();
324                vihollinen.X = maali.X;
325                vihollinen.Y = maali.Y;
326                vihollinen.IgnoresGravity = true;
327                vihollinen.Texture = Content.Load<Texture2D>("vihollinen");
328                AddCollisionHandler(vihollinen, tuuppaa);
329                kentta.Objects.Add(vihollinen);
330
331               
332            }
333        }
334        #endregion
335
336
337        #region Nappaimet
338        // Lisää peliin kaikki näppäimet
339        void lisaaNappaimet()
340        {
341            ClearControls();
342            //Yleiset näppäimet
343            Controls.Listen(Keys.Enter, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
344
345            // Pelaajan näppäimet
346            Controls.Listen(Keys.Left, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector2D(-liikeVoima, 0));
347            Controls.Listen(Keys.Right, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja1, new Vector2D(liikeVoima, 0));
348            Controls.Listen(Keys.Up, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja1, hyppyVoima);
349
350            Controls.Listen(Keys.A, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja2, new Vector2D(-liikeVoima, 0));
351            Controls.Listen(Keys.D, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja2, new Vector2D(liikeVoima, 0));
352            Controls.Listen(Keys.W, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja2, hyppyVoima);
353
354
355            lisaaGamePadNappaimet(PlayerIndex.One, pelaaja1);
356            lisaaGamePadNappaimet(PlayerIndex.One, pelaaja2);
357        }
358
359        void lisaaGamePadNappaimet(PlayerIndex pelaajaNro, PlatformCharacter pelaaja)
360        {
361            //Yleiset näppäimet
362            Controls.Listen(pelaajaNro, Buttons.Start, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
363
364            Controls.Listen(pelaajaNro, Buttons.DPadLeft, ButtonPosition.Down, liikuta, "Pelaaja liikkuu vasemmalle", pelaaja1, new Vector2D(-liikeVoima, 0));
365            Controls.Listen(pelaajaNro, Buttons.DPadRight, ButtonPosition.Down, liikuta, "Pelaaja liikkuu oikealle", pelaaja1, new Vector2D(liikeVoima, 0));
366            Controls.Listen(pelaajaNro, Buttons.A, ButtonPosition.Pressed, hyppaa, "Pelaaja hyppää", pelaaja1, hyppyVoima);
367
368        }
369
370        // Näppäimiin liitetyt toiminnot alkavat tästä -->
371        bool liikuta(ControlEvent e)
372        {
373            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
374            Vector2D voima = e.Parameter1.ToVector2D();
375            hahmo.Walk(e.Time, voima);
376            return false;
377        }
378
379        bool hyppaa(ControlEvent e)
380        {
381            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
382            double voima = e.Parameter1.ToDouble();
383
384            if (hahmo.Jump(voima))
385            {
386                this.PlaySound("hyppays");
387            }
388            return false;
389        }
390
391        bool uusiPeli(ControlEvent e)
392        {
393            aloitaUusiPeli();
394            return true;
395        }
396        #endregion
397
398
399        #region Tapahtumat
400        // Kun osutaan maaliin
401        void osuiMaaliin(Collision collision)
402        {
403            if (collision.Other.Tag == "maali")
404            {
405                this.PlaySound("maali");
406                int edellisenKentanPisteet = pelaajan1Pisteet.Value;
407                Level = seuraavaKentta();
408                MessageDisplay.Add("Pääsit läpi kentän " + kenttaNro + ". Pisteitä: " + edellisenKentanPisteet);
409            }
410        }
411
412        // Kerää tähden ja antaa pisteen
413        void keraa(Collision collision)
414        {
415            if (collision.Other.Equals(pelaaja1))
416            {
417                PhysicsObject tahti = collision.Obj;
418                tahti.Destroy();
419                pelaajan1Pisteet.Value++;
420               
421                this.PlaySound("kerays", -0.5, 0.5);
422               
423            }
424
425            if (collision.Other.Equals(pelaaja2))
426            {
427                PhysicsObject tahti = collision.Obj;
428                tahti.Destroy();
429                pelaajan2Pisteet.Value++;
430
431                this.PlaySound("kerays", -0.5, 0.5);
432               
433
434            }
435        }
436
437
438        // Haamu tuuppaa pelaajaa
439        void tuuppaa(Collision collision)
440        {
441            if (collision.Other is PlatformCharacter)
442            {
443                double luku1 = RandomGen.NextIntRange(-10000, -8000, 8000, 10000);
444                double luku2 = RandomGen.NextIntRange(-10000, -8000, 8000, 10000);
445
446                if (collision.Other == pelaaja1)
447                {
448                    // pieni värinä törmäyksestä
449                    Controls.GameControllers[PlayerIndex.One].Vibrate(0.5, 0.5, 0.0, 0.0, 0.1);
450                }
451                if (collision.Other == pelaaja2)
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
457                this.PlaySound("tuuppaus");
458                collision.Other.Hit(new Vector2D(luku1, luku2));
459            }
460        }
461        #endregion
462    }
463}
Note: See TracBrowser for help on using the repository browser.