source: 2010/31/saolhaka/KynariKakone/Peli.cs @ 1640

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