source: 2009/santeri_h/Kynari/Peli.cs @ 1618

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