source: 2012/09-22/SanteriH/Kynari/Kynari/Kynari/Kynari.cs @ 3832

Revision 3832, 19.1 KB checked in by anlakane, 8 years ago (diff)

Kynärin uuden version alku.

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