source: nuutti_m/Tasohyppely2/Peli.cs @ 434

Revision 434, 15.1 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? Kolmas!
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            ajastin2.Interval = 90;
85            ajastin2.Trigger += new Timer.TriggerHandler(lisaaTahtia2);
86            AddTimer(ajastin2);
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, 0, -250);
187            lisaaPieniTaso(kentta, -300, 250);
188            lisaaPieniTaso(kentta, 0, -500);
189            lisaaPieniTaso(kentta, 250, 500);
190            lisaaPieniTaso(kentta, 50, 100);
191            lisaaPieniTaso(kentta, 100, -650);
192            lisaaPieniTaso(kentta, -150, 525);
193            lisaaPieniTaso(kentta, 0, 350);
194           
195            lisaaMaali(kentta);
196            lisaaPelaajat(kentta);
197            lisaaTahdet(kentta);
198
199            int vihollistenMaara = kenttaNro;
200           
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                lisaaMaali(Level);
219            }
220        }
221
222        void lisaaTahtia2(Timer sender)
223        {
224            for (int i = 0; i < 100; i++)
225            {
226
227                PhysicsObject tahti = new PhysicsObject(0.005, Shapes.CreateCircle(12));
228                tahti.X = RandomGen.NextDouble(-475.0, 475.0);
229                tahti.Y = 700.0;
230                tahti.Restitution = 0.1;
231                tahti.Texture = Content.Load<Texture2D>("banana");
232                AddCollisionHandler(tahti, keraa);
233                Level.Objects.Add(tahti);
234               
235            }
236        }
237
238
239
240        void lisaaPieniTaso(Level kentta, double x, double y)
241        {
242            Platform taso = new Platform(100, 30, Color.Green);
243            taso.X = x;
244            taso.Y = y;
245            kentta.Objects.Add(taso);
246        }
247
248        void lisaaPelaajat(Level kentta)
249        {
250            pelaaja1 = new PlatformCharacter(4, Shapes.CreateRectangle(70,105));
251            pelaaja1.Texture = Content.Load<Texture2D>("monkey");
252            pelaaja1.X = 0;
253            pelaaja1.Y = kentta.Bottom + 120;
254            pelaaja1.Restitution = 1.0;
255
256            pelaaja2 = new PlatformCharacter(4, Shapes.CreateRectangle(70, 105));
257            pelaaja2.Texture = Content.Load<Texture2D>("monkey2");
258            pelaaja2.X = 100;
259            pelaaja2.Y = kentta.Bottom + 120;
260            pelaaja2.Restitution = 1.0;
261     
262            kentta.Objects.Add(pelaaja1);
263            kentta.Objects.Add(pelaaja2);
264        }
265
266        void lisaaTahdet(Level kentta)
267        {
268            for (int i = 0; i < 100; i++)
269            {
270                PhysicsObject tahti = new PhysicsObject(0.005, Shapes.CreateCircle(12));
271                tahti.X = RandomGen.NextDouble(-475.0, 475.0);
272                tahti.Y = 700.0;
273                tahti.Restitution = 0.1;
274                tahti.Texture = Content.Load<Texture2D>("banana");
275                AddCollisionHandler(tahti, keraa);
276                kentta.Objects.Add(tahti);
277               
278            }
279        }
280
281        void lisaaMaali(Level kentta)
282        {
283            maali = PhysicsObject.CreateStaticObject(Shapes.CreateCircle(25));
284            maali.Tag = "maali";
285            maali.IgnoresCollisionResponse = true;
286            maali.X = 0;
287            maali.Y = 325;
288            maali.Texture = Content.Load<Texture2D>("banana");
289            kentta.Objects.Add(maali);
290            AddCollisionHandler(maali, lisaabanaaneita);
291        }
292
293        void lisaabanaaneita(Collision c)
294        {
295            for (int i2 = 0; i2 < 50; i2++)
296            {
297                PhysicsObject tahti = new PhysicsObject(0.005, Shapes.CreateCircle(12));
298                tahti.X = RandomGen.NextDouble(-475.0, 475.0);
299                tahti.Y = 700.0;
300                tahti.Restitution = 0.1;
301                tahti.Texture = Content.Load<Texture2D>("banana");
302                AddCollisionHandler(tahti, keraa);
303                Level.Objects.Add(tahti);
304                maali.Destroy();
305            }
306        }
307        void lisaaViholliset(Level kentta, int kpl)
308        {
309            for (int i = 0; i < kpl; i++)
310            {
311                PlatformCharacter vihollinen = new PlatformCharacter(100, Shapes.CreateCircle(30));
312                vihollinen.Brain = new RandomMoverBrain();
313                vihollinen.X = maali.X;
314                vihollinen.Y = maali.Y;
315                vihollinen.IgnoresGravity = true;
316                vihollinen.Texture = Content.Load<Texture2D>("vihollinen");
317                AddCollisionHandler(vihollinen, tuuppaa);
318                kentta.Objects.Add(vihollinen);
319
320               
321            }
322        }
323        #endregion
324
325
326        #region Nappaimet
327        // Lisää peliin kaikki näppäimet
328        void lisaaNappaimet()
329        {
330            ClearControls();
331            //Yleiset näppäimet
332            Controls.Listen(Keys.Enter, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
333
334            // Pelaajan näppäimet
335            Controls.Listen(Keys.Left, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector2D(-liikeVoima, 0));
336            Controls.Listen(Keys.Right, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja1, new Vector2D(liikeVoima, 0));
337            Controls.Listen(Keys.Up, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja1, hyppyVoima);
338
339            Controls.Listen(Keys.A, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja2, new Vector2D(-liikeVoima, 0));
340            Controls.Listen(Keys.D, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja2, new Vector2D(liikeVoima, 0));
341            Controls.Listen(Keys.W, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja2, hyppyVoima);
342
343
344            lisaaGamePadNappaimet(PlayerIndex.One, pelaaja1);
345            lisaaGamePadNappaimet(PlayerIndex.One, pelaaja2);
346        }
347
348        void lisaaGamePadNappaimet(PlayerIndex pelaajaNro, PlatformCharacter pelaaja)
349        {
350            //Yleiset näppäimet
351            Controls.Listen(pelaajaNro, Buttons.Start, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
352
353            Controls.Listen(pelaajaNro, Buttons.DPadLeft, ButtonPosition.Down, liikuta, "Pelaaja liikkuu vasemmalle", pelaaja1, new Vector2D(-liikeVoima, 0));
354            Controls.Listen(pelaajaNro, Buttons.DPadRight, ButtonPosition.Down, liikuta, "Pelaaja liikkuu oikealle", pelaaja1, new Vector2D(liikeVoima, 0));
355            Controls.Listen(pelaajaNro, Buttons.A, ButtonPosition.Pressed, hyppaa, "Pelaaja hyppää", pelaaja1, hyppyVoima);
356
357        }
358
359        // Näppäimiin liitetyt toiminnot alkavat tästä -->
360        bool liikuta(ControlEvent e)
361        {
362            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
363            Vector2D voima = e.Parameter1.ToVector2D();
364            hahmo.Walk(e.Time, voima);
365            return false;
366        }
367
368        bool hyppaa(ControlEvent e)
369        {
370            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
371            double voima = e.Parameter1.ToDouble();
372
373            if (hahmo.Jump(voima))
374            {
375                this.PlaySound("hyppays");
376            }
377            return false;
378        }
379
380        bool uusiPeli(ControlEvent e)
381        {
382            aloitaUusiPeli();
383            return true;
384        }
385        #endregion
386
387
388        #region Tapahtumat
389        // Kun osutaan maaliin
390        void osuiMaaliin(Collision collision)
391        {
392            if (collision.Other.Tag == "maali")
393            {
394                this.PlaySound("maali");
395                int edellisenKentanPisteet = pelaajan1Pisteet.Value;
396                Level = seuraavaKentta();
397                MessageDisplay.Add("Pääsit läpi kentän " + kenttaNro + ". Pisteitä: " + edellisenKentanPisteet);
398            }
399        }
400
401        // Kerää tähden ja antaa pisteen
402        void keraa(Collision collision)
403        {
404            if (collision.Other.Equals(pelaaja1))
405            {
406                PhysicsObject tahti = collision.Obj;
407                tahti.Destroy();
408                pelaajan1Pisteet.Value++;
409               
410                this.PlaySound("kerays", -0.5, 0.5);
411               
412            }
413
414            if (collision.Other.Equals(pelaaja2))
415            {
416                PhysicsObject tahti = collision.Obj;
417                tahti.Destroy();
418                pelaajan2Pisteet.Value++;
419
420                this.PlaySound("kerays", -0.5, 0.5);
421               
422
423            }
424        }
425
426
427        // Haamu tuuppaa pelaajaa
428        void tuuppaa(Collision collision)
429        {
430            if (collision.Other is PlatformCharacter)
431            {
432                double luku1 = RandomGen.NextIntRange(-10000, -8000, 8000, 10000);
433                double luku2 = RandomGen.NextIntRange(-10000, -8000, 8000, 10000);
434
435                if (collision.Other == pelaaja1)
436                {
437                    // pieni värinä törmäyksestä
438                    Controls.GameControllers[PlayerIndex.One].Vibrate(0.5, 0.5, 0.0, 0.0, 0.1);
439                }
440                if (collision.Other == pelaaja2)
441                {
442                    // pieni värinä törmäyksestä
443                    Controls.GameControllers[PlayerIndex.One].Vibrate(0.5, 0.5, 0.0, 0.0, 0.1);
444                }
445
446                this.PlaySound("tuuppaus");
447                collision.Other.Hit(new Vector2D(luku1, luku2));
448            }
449        }
450        #endregion
451    }
452}
Note: See TracBrowser for help on using the repository browser.