source: santeri_h/Kynari/Peli.cs @ 422

Revision 422, 19.7 KB checked in by saolhaka, 12 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 Kynari
15{
16    // Yksinkertainen tasohyppely.
17    class Tasohyppely : PhysicsGame
18    {
19        #region Muuttujat
20
21        const double liikeVoima = 2000;
22        const double hyppyVoima = 2000;
23
24        PlatformCharacter pelaaja1;
25        PlatformCharacter pelaaja2;
26       
27        BarGauge hpNaytto;
28        BarGauge hpNaytto2;
29       
30        bool pelaaja1asevaihto = true;
31        bool pelaaja2asevaihto = true;
32
33        Meter<int> pelaajan1Pisteet;
34        Meter<int> pelaajan2Pisteet;
35
36        #endregion
37       
38        #region Alustukset
39        protected override void LoadContent()
40        {
41            LisaaLaskurit();
42            DrawPerimeter = false; // ei haluta piirtää kentän reunoja
43
44            // Asetetaan painovoima
45            Gravity = new Vector2D(0, -1000);
46            // Zoomataan lähemmäksi
47            Camera.ZoomFactor = 0.7;
48            aloitaUusiPeli();
49            Song musiikki = Content.Load<Song>("tausta");
50            MediaPlayer.IsRepeating = true;
51            MediaPlayer.Play(musiikki);
52        }
53
54        void aloitaUusiPeli()
55        {
56            MessageDisplay.Clear();
57            // ladataan kenttä
58            Level = seuraavaKentta();
59            pelaaja1asevaihto = true;
60            pelaaja2asevaihto = true;
61            naytaTiedot();
62
63        }
64        #endregion
65
66
67        #region KentanLataus
68        Level seuraavaKentta()
69        {
70            Level seuraava = luoKentta();
71            lisaaNappaimet();
72            //Camera.Follow(pelaaja1);
73            Camera.Position = new Vector2D(0, 0);           
74            return seuraava;
75        }
76
77        Level luoKentta()
78        {
79            Level kentta = new Level(this, 4000, 1000);
80            kentta.CreateBorder();
81            kentta.Borders.Visible = false;
82            kentta.Background.CreateGradient(Color.White, Color.Gray);
83
84            luoTasot(kentta);
85            lisaaPelaajat(kentta);
86            lisaaAsePelaajalle(kentta);
87            lisaaKerattavaAse(kentta);
88            lisaaHPNaytot(kentta);
89
90            return kentta;
91        }
92
93        void luoTasot(Level kentta)
94        {
95            Platform alusta = new Platform(kentta.Width, 300, Color.DimGray);
96            alusta.X = 0;
97            alusta.Y = kentta.Bottom - alusta.Height / 2;
98            kentta.Objects.Add(alusta);
99
100            lisaaPieniTaso(kentta, -200, -350);
101            lisaaPieniTaso(kentta, 0, -400);
102            lisaaPieniTaso(kentta, 100, -300);
103            lisaaPieniTaso(kentta, 400, -350);
104            lisaaPieniTaso(kentta, 450, -200);
105            lisaaPieniTaso(kentta, -500, -400);
106            lisaaPieniTaso(kentta, -550, -200);
107            lisaaPieniTaso(kentta, -400, -300);
108            lisaaPieniTaso(kentta, -150, -150);
109            lisaaPieniTaso(kentta, -870, -350);
110            lisaaPieniTaso(kentta, -700, -400);
111
112            lisaaPieniTaso(kentta, 600, -300);
113            lisaaPieniTaso(kentta, 850, -300);
114            lisaaPieniTaso(kentta, 750, -400);
115            lisaaPieniTaso(kentta, 200, -200);
116            lisaaPieniTaso(kentta, -200, -150);
117
118            lisaaPystyTaso(kentta, 600, -450);
119            lisaaPystyTaso(kentta, -600, -500);
120            lisaaPystyTaso(kentta, 0, -450);
121
122            lisaaReuna(kentta, -900, 0);
123            lisaaReuna(kentta, 900, 0);
124        }
125
126        void lisaaHPNaytot(Level kentta)
127        {
128            // luodaan elämänäyttö
129            hpNaytto = new BarGauge(this);
130            hpNaytto.HorizontalOrigin = HorizontalAlignment.Center;
131            hpNaytto.VerticalOrigin = VerticalAlignment.Bottom;
132            hpNaytto.Size = new Vector2D(30, 250);
133            hpNaytto.Angle = Angle.Degrees(90);
134            hpNaytto.ValueColor = Color.LightGreen;
135            hpNaytto.BackColor = Color.Red;           
136            hpNaytto.BindTo(pelaaja1.HitPoints);
137            hpNaytto.Position = new Vector2D(Screen.RightSafe - 1000, Screen.TopSafe - 170);
138            Add(hpNaytto);
139
140            hpNaytto2 = new BarGauge(this);
141            hpNaytto2.HorizontalOrigin = HorizontalAlignment.Center;
142            hpNaytto2.VerticalOrigin = VerticalAlignment.Bottom;
143            hpNaytto2.Size = new Vector2D(30, 250);
144            hpNaytto2.Angle = Angle.Degrees(90);
145            hpNaytto2.ValueColor = Color.LightGreen;
146            hpNaytto2.BackColor = Color.Red;
147            hpNaytto2.BindTo(pelaaja2.HitPoints);
148            hpNaytto2.Position = new Vector2D(Screen.RightSafe - 300, Screen.TopSafe - 170);
149            Add(hpNaytto2);
150        }
151
152        void LisaaLaskurit()
153        {
154            pelaajan1Pisteet = LuoPisteLaskuri(Screen.Left + 100.0, Screen.Top - 100.0);
155            pelaajan2Pisteet = LuoPisteLaskuri(Screen.Right - 100.0, Screen.Top - 100.0);
156            pelaajan1Pisteet.UpperLimit += new Meter<int>.OnLimitHandler(laskuri1_UpperLimit);
157            pelaajan2Pisteet.UpperLimit += new Meter<int>.OnLimitHandler(laskuri2_UpperLimit);
158        }
159
160        void NollaaLaskurit()
161        {
162            pelaajan1Pisteet.Reset();
163            pelaajan2Pisteet.Reset();
164        }
165
166        Meter<int> LuoPisteLaskuri(double x, double y)
167        {
168            Meter<int> laskuri = new Meter<int>(0, 0, 10);
169            ValueDisplay naytto = new ValueDisplay(this);
170            naytto.BindTo(laskuri);
171            naytto.X = x;
172            naytto.Y = y;
173            Add(naytto);
174            return laskuri;
175        }
176
177        void laskuri1_UpperLimit(Meter<int> sender)
178        {
179            MessageDisplay.Clear();
180            MessageDisplay.Add("Pelaaja 1 voittaa!");
181            MessageDisplay.X = -100;
182
183        }
184
185        void laskuri2_UpperLimit(Meter<int> sender)
186        {
187            MessageDisplay.Clear();
188            MessageDisplay.Add("Pelaaja 2 voittaa!");
189            MessageDisplay.X = -100;
190
191        }
192
193        void lisaaPieniTaso(Level kentta, double x, double y)
194        {
195            Platform taso = new Platform(100, 30, Color.DimGray);
196            taso.X = x;
197            taso.Y = y;
198            kentta.Objects.Add(taso);
199        }
200
201        void lisaaReuna(Level kentta, double x, double y)
202        {
203            Platform taso = new Platform(50, 1000, Color.DimGray);
204            taso.X = x;
205            taso.Y = y;
206            kentta.Objects.Add(taso);
207        }
208
209        void lisaaPystyTaso(Level kentta, double x, double y)
210        {
211            Platform taso = new Platform(30, 100, Color.DimGray);
212            taso.X = x;
213            taso.Y = y;
214            kentta.Objects.Add(taso);
215        }
216
217        void lisaaPelaajat(Level kentta)
218        {
219            pelaaja1 = new PlatformCharacter(4, Shapes.CreateCircle(20));
220            pelaaja1.Texture = Content.Load<Texture2D>("norsu");
221            pelaaja1.X = -700;
222            pelaaja1.Y = kentta.Bottom + 20;
223
224            pelaaja2 = new PlatformCharacter(4, Shapes.CreateCircle(20));
225            pelaaja2.Texture = Content.Load<Texture2D>("norsu");
226            pelaaja2.X = 700;
227            pelaaja2.Y = kentta.Bottom + 20;
228
229            pelaaja1.HitPoints.MaxValue = 100;
230            pelaaja1.HitPoints.Value = 100;
231            pelaaja1.HitpointsReachedZero += new EventHandler(pelaajaKuoli);
232
233            pelaaja2.HitPoints.MaxValue = 100;
234            pelaaja2.HitPoints.Value = 100;
235            pelaaja2.HitpointsReachedZero += new EventHandler(pelaajaKuoli);
236
237            kentta.Objects.Add(pelaaja1);
238            kentta.Objects.Add(pelaaja2);
239        }
240
241        void pelaajaKuoli(object sender, EventArgs e)
242        {
243            PlatformCharacter pelaaja = (PlatformCharacter)sender;
244            pelaaja.UnequipWeapon();
245            Weapon kuolinAse = pelaaja.Weapon;
246            kuolinAse.RemoveFromOwner();
247            kuolinAse.Unequip();
248            kuolinAse.Visible = true;
249            pelaaja.Destroy();
250            MessageDisplay.Clear();
251            MessageDisplay.X = -100;
252            if (sender == pelaaja1)
253            {
254                MessageDisplay.Add("Pelaaja 2 voitti erän!");
255                pelaajan2Pisteet.Value += 1;
256            }
257            if (sender == pelaaja2)
258            {
259                MessageDisplay.Add("Pelaaja 1 voitti erän!");
260                pelaajan1Pisteet.Value += 1;
261            }
262
263            if (pelaajan1Pisteet.Value == pelaajan1Pisteet.MaxValue)
264            {
265                return;
266            }
267
268            if (pelaajan2Pisteet.Value == pelaajan2Pisteet.MaxValue)
269            {
270                return;
271            }
272
273            else
274            {
275                Timer ajastin2 = new Timer();
276                ajastin2.Interval = 3;
277                ajastin2.Trigger += new Timer.TriggerHandler(eraloppui);
278                ajastin2.Start();
279                AddTimer(ajastin2);
280            }
281
282        }
283
284        void eraloppui(Timer sender)
285        {
286            aloitaUusiPeli();
287            sender.Stop();
288            RemoveTimer(sender);
289        }
290
291        void keraaAse(Collision collision)
292        {
293            if (collision.Other is PlatformCharacter)
294            {
295                if (collision.Other == pelaaja1)
296                {
297                    if (pelaaja1asevaihto == false)
298                        return;
299
300                    pelaaja1asevaihto = false;
301                }
302
303                if (collision.Other == pelaaja2)
304                {
305                    if (pelaaja2asevaihto == false)
306                        return;
307
308                    pelaaja2asevaihto = false;
309                }
310
311                Timer ajastin = new Timer();
312                ajastin.Interval = 1;
313                ajastin.Tag = collision.Other;
314                ajastin.Trigger += new Timer.TriggerHandler(salliAseenvaihto);
315                ajastin.Start();
316                AddTimer(ajastin);
317
318                // Pelaaja törmäsi aseeseen
319                ProjectileWeapon ase = (ProjectileWeapon)collision.Obj;
320                PlatformCharacter pelaaja = (PlatformCharacter)collision.Other;
321                if (ase.Owner != null)
322                {
323                    return;
324                }
325                pelaaja.UnequipWeapon();
326                Weapon vanhaAse = pelaaja.Weapon;
327                vanhaAse.RemoveFromOwner();
328                vanhaAse.X = pelaaja.X + vanhaAse.Width;
329                vanhaAse.Y = pelaaja.Y;
330                vanhaAse.Visible = true;
331                vanhaAse.Hit(new Vector2D(100, 20));
332                pelaaja.Weapon = ase;
333                pelaaja.EquipWeapon();
334                pelaaja.Weapon.Texture = ase.Texture;
335                naytaTiedot();
336            }
337        }
338
339
340
341        void salliAseenvaihto(Timer sender)
342        {
343            if (sender.Tag == pelaaja1)
344            {
345                pelaaja1asevaihto = true;
346            }
347            else if (sender.Tag == pelaaja2)
348            {
349                pelaaja2asevaihto = true;
350            }
351
352            sender.Stop();
353            RemoveTimer(sender);
354        }
355
356        void lisaaKerattavaAse(Level kentta)
357        {
358            //Täällä lisätään ase kenttään
359            Bullet luoti = new Bullet();
360            Bullet luoti2 = new Bullet();
361            Bullet hauli = new Bullet();
362            Grenade kranaatti = new Grenade();
363            kranaatti.Explosion = new Explosion(50, 200, 20, new Damage(10000));
364
365            Texture2D shotgun = Content.Load<Texture2D>("shotgun");
366            Texture2D grenade = Content.Load<Texture2D>("grenade");
367            Texture2D magnumtexture = Content.Load<Texture2D>("magnum");
368
369            AssaultRifle kivaari = new AssaultRifle(luoti);
370            kivaari.X = 200;
371            kivaari.Y = -100;
372            kivaari.FireRate = 5;
373            kivaari.MomentOfInertia = double.PositiveInfinity;
374            kivaari.Mass = 0.1;
375            kivaari.Tag = "Kivääri";
376            kentta.Objects.Add(kivaari);
377
378            AssaultRifle magnum = new AssaultRifle(luoti2);
379            magnum.X = 0;
380            magnum.Y = -300;
381            magnum.FireRate = 1;
382            magnum.MomentOfInertia = double.PositiveInfinity;
383            magnum.Mass = 0.1;
384            magnum.Tag = "Magnum";
385            magnum.Shape = Shapes.CreateFromTexture(magnumtexture, new Vector2D(magnumtexture.Width, magnumtexture.Height), 100);
386            magnum.Size = new Vector2D(magnumtexture.Width, magnumtexture.Height);
387            magnum.UpdateShapeFromSize();
388            magnum.Texture = magnumtexture;
389            magnum.AmmoType.Damage = new Damage(20);
390            kentta.Objects.Add(magnum);
391
392            AssaultRifle haulikko = new AssaultRifle(hauli);
393            haulikko.X = -550;
394            haulikko.Y = 0;
395            haulikko.FireRate = 0.75;
396            haulikko.MomentOfInertia = double.PositiveInfinity;
397            haulikko.Mass = 0.1;
398            haulikko.Tag = "Haulikko";
399            haulikko.AmmoType.Damage = new Damage(35);
400            haulikko.Texture = shotgun;
401            kentta.Objects.Add(haulikko);
402
403            Cannon kranaatinheitin = new Cannon(kranaatti);
404            kranaatinheitin.X = -200;
405            kranaatinheitin.Y = -100;
406            kranaatinheitin.FireRate = 0.2;
407            kranaatinheitin.MomentOfInertia = double.PositiveInfinity;
408            kranaatinheitin.Mass = 0.1;
409            kranaatinheitin.Power = new Meter<double>(5000, 0, 5000);
410            kranaatinheitin.Tag = "Kranaatinheitin";
411            kranaatinheitin.Shape = Shapes.CreateFromTexture(grenade, new Vector2D(grenade.Width, grenade.Height), 100);
412            kranaatinheitin.Size = new Vector2D(grenade.Width, grenade.Height);
413            kranaatinheitin.UpdateShapeFromSize();
414            kranaatinheitin.Texture = grenade;
415            kentta.Objects.Add(kranaatinheitin);
416
417            //Lisää myös törmäyksen käsittelijä aseelle, jossa kutsutaan keraaAse -aliohjelmaa
418            AddCollisionHandler(kivaari, keraaAse);
419            AddCollisionHandler(haulikko, keraaAse);
420            AddCollisionHandler(kranaatinheitin, keraaAse);
421            AddCollisionHandler(magnum, keraaAse);
422        }
423
424        void lisaaAsePelaajalle(Level kentta)
425        {
426            Bullet luoti = new Bullet();
427
428            Texture2D pistol = Content.Load<Texture2D>("pistol");
429
430            pelaaja1.UnequipWeapon();
431            pelaaja1.Weapon = new AssaultRifle(luoti);
432            pelaaja1.Weapon.FireRate = 2;
433            pelaaja1.Weapon.Mass = 0.1;
434            kentta.Objects.Add(pelaaja1.Weapon);
435            pelaaja1.EquipWeapon();
436            pelaaja1.Weapon.MomentOfInertia = double.PositiveInfinity;
437            pelaaja1.Weapon.Tag = "Pistooli";
438            pelaaja1.Weapon.Shape = Shapes.CreateFromTexture(pistol, new Vector2D(pistol.Width, pistol.Height), 100);
439            pelaaja1.Weapon.Size = new Vector2D(pistol.Width, pistol.Height);
440            pelaaja1.Weapon.UpdateShapeFromSize();
441            pelaaja1.Weapon.Texture = pistol;
442            AddCollisionHandler(pelaaja1.Weapon, keraaAse);
443
444            pelaaja2.UnequipWeapon();
445            pelaaja2.Weapon = new AssaultRifle(luoti);
446            pelaaja2.Weapon.FireRate = 2;
447            pelaaja2.Weapon.Mass = 0.1;
448            kentta.Objects.Add(pelaaja2.Weapon);
449            pelaaja2.EquipWeapon();
450            pelaaja2.Weapon.MomentOfInertia = double.PositiveInfinity;
451            pelaaja2.Weapon.Tag = "Pistooli";
452            pelaaja2.Weapon.Shape = Shapes.CreateFromTexture(pistol, new Vector2D(pistol.Width, pistol.Height), 100);
453            pelaaja2.Weapon.Size = new Vector2D(pistol.Width, pistol.Height);
454            pelaaja2.Weapon.UpdateShapeFromSize();
455            pelaaja2.Weapon.Texture = pistol;
456            AddCollisionHandler(pelaaja2.Weapon, keraaAse);
457        }
458
459        #endregion
460
461
462        #region Nappaimet
463        // Lisää peliin kaikki näppäimet
464        void lisaaNappaimet()
465        {
466            ClearControls();
467            //Yleiset näppäimet
468            Controls.Listen(Keys.F1, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
469
470            // Pelaajan näppäimet
471            Controls.Listen(Keys.A, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector2D(-liikeVoima, 0));
472            Controls.Listen(Keys.D, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja1, new Vector2D(liikeVoima, 0));
473            Controls.Listen(Keys.W, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja1, hyppyVoima);
474            Controls.Listen(Keys.Space, ButtonPosition.Down, Ammu, "Ammu", pelaaja1);
475
476            Controls.Listen(Keys.Left, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja2, new Vector2D(-liikeVoima, 0));
477            Controls.Listen(Keys.Right, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja2, new Vector2D(liikeVoima, 0));
478            Controls.Listen(Keys.Up, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja2, hyppyVoima);
479            Controls.Listen(Keys.Enter, ButtonPosition.Down, Ammu, "Ammu", pelaaja2);
480
481            lisaaGamePadNappaimet(PlayerIndex.One, pelaaja1);
482            lisaaGamePadNappaimet(PlayerIndex.Two, pelaaja2);
483        }
484
485        void lisaaGamePadNappaimet(PlayerIndex pelaajaNro, PlatformCharacter pelaaja)
486        {
487            //Yleiset näppäimet
488            Controls.Listen(pelaajaNro, Buttons.Start, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
489
490            Controls.Listen(pelaajaNro, Buttons.DPadLeft, ButtonPosition.Down, liikuta, "Pelaaja liikkuu vasemmalle", pelaaja, new Vector2D(-liikeVoima, 0));
491            Controls.Listen(pelaajaNro, Buttons.DPadRight, ButtonPosition.Down, liikuta, "Pelaaja liikkuu oikealle", pelaaja, new Vector2D(liikeVoima, 0));
492            Controls.Listen(pelaajaNro, Buttons.A, ButtonPosition.Pressed, hyppaa, "Pelaaja hyppää", pelaaja, hyppyVoima);
493            Controls.Listen(pelaajaNro, Buttons.RightTrigger, ButtonPosition.Down, Ammu, "Ammu", pelaaja);
494        }
495
496        // Näppäimiin liitetyt toiminnot alkavat tästä -->
497        bool liikuta(ControlEvent e)
498        {
499            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
500            Vector2D voima = e.Parameter1.ToVector2D();
501            hahmo.Walk(e.Time, voima);
502            return false;
503        }
504
505        bool naytaTiedot()
506        {
507            MessageDisplay.Clear();
508            MessageDisplay.X = -100;
509            MessageDisplay.Add("Pelaaja 1: " + pelaaja1.Weapon.Tag);
510            MessageDisplay.Add("Pelaaja 2: " + pelaaja2.Weapon.Tag);
511            return false;
512        }
513
514        bool Ammu(ControlEvent e)
515        {
516            PlatformCharacter pelaaja = e.Parameter0 as PlatformCharacter;
517            if (pelaaja.IsDestroyed())
518            {
519                return false;
520            }
521
522            Projectile ammus = pelaaja.Weapon.Use();
523
524            if (ammus != null)
525            {
526                Level.Objects.Add(ammus);
527            }
528
529            return false;
530        }
531
532        bool hyppaa(ControlEvent e)
533        {
534            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
535            double voima = e.Parameter1.ToDouble();
536
537            if (Math.Abs(hahmo.Velocity.Y) > 0.001)
538            {
539                return false;
540            }
541
542            if (hahmo.Jump(voima))
543            {
544                this.PlaySound("hyppays");
545            }
546            return false;
547        }
548
549        bool uusiPeli(ControlEvent e)
550        {
551            NollaaLaskurit();
552            aloitaUusiPeli();
553            return true;
554        }
555        #endregion
556
557
558    }
559}
Note: See TracBrowser for help on using the repository browser.