source: 2009/lassi_h/Tankkipeli/Peli.cs @ 1252

Revision 177, 21.8 KB checked in by lamahama, 11 years ago (diff)
Line 
1#region Usings
2using System;
3using System.Collections.Generic;
4using System.Linq;
5using Microsoft.Xna.Framework;
6using Microsoft.Xna.Framework.Audio;
7using Microsoft.Xna.Framework.Content;
8using Microsoft.Xna.Framework.Graphics;
9using Microsoft.Xna.Framework.Input;
10using Microsoft.Xna.Framework.Media;
11using Jypeli;
12using Jypeli.ScreenObjects;
13using Jypeli.Assets;
14using AdvanceMath;
15using Physics2DDotNet;
16using Physics2DDotNet.Shapes;
17#endregion
18
19namespace Tankkipeli
20{
21    public class Peli : PhysicsGame
22    {
23       
24        const int Aseidenmaara = 5;
25        Tank tankki;
26        Tank tankki2;
27        BarGauge g1;
28        BarGauge g2;
29        BarGauge h1;
30        BarGauge h2;
31        byte JetPackON1;
32        byte JetPackON2;
33        int Weapon1 = 0;
34        int Weapon2 = 0;
35        List<Projectile> Aseet;
36        List<String> Aseidennimet;
37        List<double> AseenTulinopeus;
38        TextDisplay Reloading1;
39        TextDisplay Reloading2;
40        TextDisplay Ase1;
41        TextDisplay Ase2;
42        TextDisplay Winner1;
43        TextDisplay Winner2;
44        SoundEffect tankinaanet;
45        bool moottoripaalla1;
46        bool moottoripaalla2;
47        float voimakkuus;
48        float pitch;
49        double prosentti;
50        float suunta;
51        bool tuhoutunut1;
52        bool tuhoutunut2;
53        PhysicsObject Kentta;
54        Texture2D granaatti;
55        Timer ajastin;
56
57        protected override void LoadContent()
58        {
59            //Luodaan ajastin
60            LuoAjastin();
61           
62            // Luodaan tankkit ja lisätään ne peliin
63            LisaaTankit();
64
65            // Luodaan maasto
66            Kentta = Level.CreateGround(50,150, 6, Color.Brown, Content.Load<Texture2D>("Kentta"));
67
68            //Luodaan mittarit
69            LuoVoimamittarit();
70            LuoElkkumittarit();
71
72            //Luodaan aseet
73            AseidenLuominen();
74
75            // Luodaan reunat
76            Level.CreateBorder();
77
78            // Asemoidaan tankkit
79
80            tankki.Y = Level.Bottom + 200;
81            tankki.X = Level.Right - 100;
82
83            tankki2.Y = Level.Bottom + 200;
84            tankki2.X = Level.Left + 100;
85
86            // Asetetaan painovoima
87            Gravity = new Vector2D(0, -200);
88
89            //Luodaan tekstit
90            LuoAseTekstit();
91            LuoLatausTekstit();
92            LuoVoittoTekstit();
93
94            //Luodaan äänet
95            tankinaanet = Content.Load<SoundEffect>("Tankkiäänet");
96           
97            // Asetetaan näppäimet
98            Player1Keys();
99            Player2Keys();
100
101            //Laitetaan tarkistus tankkien olemisesta ilmassa
102            AddCollisionHandler(tankki, JetPackOFF1);
103            AddCollisionHandler(tankki2, JetPackOFF2);
104           
105            //Asetetaan "voitto-tekstit" näkymään kun toiselta loppuu elkut.
106            tankki2.Hull.HitpointsReachedZero += new EventHandler(Hull_HitpointsReachedZero2);
107            tankki.Hull.HitpointsReachedZero += new EventHandler(Hull_HitpointsReachedZero);
108        }
109        private void LisaaTankit()
110        {
111            tankki = new Tank(this, "tankki");
112            Level.Objects.Add(tankki);
113            tankki.Removed += new EventHandler(tuhoutuminen1);
114            tankki.Hull.Texture = Content.Load<Texture2D>("Tank2");
115            tankki2 = new Tank(this, "tankki2");
116            Level.Objects.Add(tankki2);
117            tankki2.Removed += new EventHandler(tuhoutuminen2);
118            tankki.HitPoints.MaxValue = 5000;
119            tankki2.HitPoints.MaxValue = 5000;
120            tankki.HitPoints.DefaultValue = 5000;
121            tankki2.HitPoints.DefaultValue = 5000;
122            tankki.HitPoints.Value = 5000;
123            tankki2.HitPoints.Value = 5000;
124
125           
126        }
127        private void LuoAjastin()
128        {
129            ajastin = new Timer();
130            ajastin.Interval = 0.5;
131            ajastin.Trigger += new Timer.TriggerHandler(SoitaTankkienaanet);
132            ajastin.Enabled = true;
133            AddTimer(ajastin);
134            ajastin.Start();
135        }
136        private void Player1Keys()
137        {
138            Controls.Listen(Keys.NumPad4, ButtonPosition.Down, aja1, "Liiku vasemmalle", tankki, Tank.MaxTorque);
139            Controls.Listen(Keys.NumPad6, ButtonPosition.Down, aja1, "Liiku oikealle", tankki, -Tank.MaxTorque);
140            Controls.Listen(Keys.NumPad4, ButtonPosition.Up, alaaja1, null, tankki);
141            Controls.Listen(Keys.NumPad6, ButtonPosition.Up, alaaja1, null, tankki);
142            Controls.Listen(Keys.NumPad8, ButtonPosition.Down, kaannaPutkea, "Käännä putkea vastapäivään", tankki, Angle.Degrees(1));
143            Controls.Listen(Keys.NumPad5, ButtonPosition.Down, kaannaPutkea, "Käännä putkea myötäpäivään", tankki, Angle.Degrees(-1));
144            Controls.Listen(Keys.F12, ButtonPosition.Down, lisaatehoja1, null, tankki);
145            Controls.Listen(Keys.F12, ButtonPosition.Released, ammupanos, "Ammu", tankki);
146            Controls.Listen(Keys.F11, ButtonPosition.Down, JetPack1, "Rakettimoottori", tankki);
147            Controls.Listen(Keys.F10, ButtonPosition.Pressed, NextWeapon1, "Seuraava ase", tankki);
148            Controls.Listen(Keys.F9, ButtonPosition.Pressed, BeforeWeapon1, "Edellinen ase", tankki);
149            Controls.Listen(Keys.F8, ButtonPosition.Pressed, TurnTank, "Käännä tankki oikeinpäin", tankki);
150            Controls.Listen(Keys.D5, ButtonPosition.Pressed, TurnTank, "Käännä tankki oikeinpäin", tankki2);
151        }
152        private bool TurnTank(ControlEvent e)
153        {
154            Tank t = e.Parameter0 as Tank;
155            t.Hull.Angle = Angle.Degrees(0);
156            return false;
157        }
158        private void Player2Keys()
159        {
160            Controls.Listen(Keys.G, ButtonPosition.Down, aja2, "Liiku vasemmalle", tankki2, Tank.MaxTorque);
161            Controls.Listen(Keys.J, ButtonPosition.Down, aja2, "Liiku oikealle", tankki2, -Tank.MaxTorque);
162            Controls.Listen(Keys.G, ButtonPosition.Up, alaaja2, null, tankki2);
163            Controls.Listen(Keys.J, ButtonPosition.Up, alaaja2, null, tankki2);
164            Controls.Listen(Keys.Y, ButtonPosition.Down, kaannaPutkea, "Käännä putkea vastapäivään", tankki2, Angle.Degrees(1));
165            Controls.Listen(Keys.H, ButtonPosition.Down, kaannaPutkea, "Käännä putkea myötäpäivään", tankki2, Angle.Degrees(-1));
166            Controls.Listen(Keys.D4, ButtonPosition.Down, lisaatehoja2, null, tankki2);
167            Controls.Listen(Keys.D4, ButtonPosition.Released, ammupanos, "Ammu", tankki2);
168            Controls.Listen(Keys.D3, ButtonPosition.Down, JetPack2, "Rakettimoottori", tankki2);
169            Controls.Listen(Keys.D2, ButtonPosition.Pressed, NextWeapon2, "Seuraava ase", tankki);
170            Controls.Listen(Keys.D1, ButtonPosition.Pressed, BeforeWeapon2, "Edellinen ase", tankki);
171           
172        }
173        private void tuhoutuminen2(object sender, EventArgs e)
174        {
175            tuhoutunut2 = true;
176        }
177        private void tuhoutuminen1(object sender, EventArgs e)
178        {
179            tuhoutunut1 = true;
180        }
181        private bool alaaja1(ControlEvent e)
182        {
183            moottoripaalla1 = false;
184            return false;
185        }
186        private bool alaaja2(ControlEvent e)
187        {
188            moottoripaalla2 = false;
189            return false;
190        }
191        private void LuoVoittoTekstit()
192        {
193            SpriteFont Fontti = Content.Load<SpriteFont>("SpriteFont1");
194            Winner1 = new TextDisplay(this, Fontti);
195            Winner1.TextColor = new Color(255, 0, 0);
196            Winner1.Text = "Winner: Player1";
197
198            Winner1.Visible = false;
199            Add(Winner1);
200
201            Winner2 = new TextDisplay(this, Fontti);
202            Winner2.TextColor = new Color(0, 255, 0);
203            Winner2.Text = "Winner: Player2";
204            Winner2.Visible = false;
205            Add(Winner2);
206        }
207        private void LuoLatausTekstit()
208        {
209            Reloading1 = new TextDisplay(this);
210            Reloading1.Text = "Reloading";
211            Reloading1.TextColor = new Color(255, 0, 0);
212            Reloading1.Visible = false;
213            Reloading1.X = 300;
214            Reloading1.Y = Level.Top - 10;
215            Add(Reloading1);
216
217            Reloading2 = new TextDisplay(this);
218            Reloading2.Text = "Reloading";
219            Reloading2.TextColor = new Color(0,255,0);
220            Reloading2.Visible = false;
221            Reloading2.X = -300;
222            Reloading2.Y = Level.Top - 10;
223            Add(Reloading2);
224        }
225        private void LuoAseTekstit()
226        {
227            Ase1 = new TextDisplay(this);
228            Ase1.Text = "SuperCluster";
229            Ase1.TextColor = new Color(255,0,0);
230            Ase1.X = 300;
231            Ase1.Y = Level.Bottom + 15;
232            Add(Ase1);
233
234            Ase2 = new TextDisplay(this);
235            Ase2.Text = "SuperCluster";
236            Ase2.TextColor = new Color(0,255,0);
237            Ase2.X = -300;
238            Ase2.Y = Level.Bottom + 15;
239            Add(Ase2);
240        }
241        private void LuoVoimamittarit()
242        {
243            g1 = new BarGauge(this);
244            g1.Angle = Angle.Degrees(270);
245            g1.X = 300;
246            g1.Y = Level.Top - 10;
247            g1.Width = 20;
248            g1.Max = 15000.0;
249            g1.Height = Level.Right - 100;
250            Add(g1);
251            g2 = new BarGauge(this);
252            g2.Angle = Angle.Degrees(90);
253            g2.X = -300;
254            g2.Width = 20;
255            g2.Y = Level.Top - 10;
256            g2.Max = 15000.0;
257            g2.Height = Level.Right - 100;
258            Add(g2);
259        }
260        private void LuoElkkumittarit()
261        {
262            h1 = new BarGauge(this);
263            h1.Angle = Angle.Degrees(270);
264            h1.X = 300;
265            h1.Y = Level.Top - 30;
266            h1.Max = 5000.0;
267            h1.Width = 20;
268            h1.Height = Level.Right - 100;
269            h1.ValueColor = new Color(0, 255, 0);
270            Add(h1);
271
272
273
274            h2 = new BarGauge(this);
275            h2.Angle = Angle.Degrees(90);
276            h2.X = -300;
277            h2.Y = Level.Top - 30;
278            h2.Max = 5000.0;
279            h2.Width = 20;
280            h2.Height = Level.Right - 100;
281            h2.ValueColor = new Color(0, 255, 0);
282            Add(h2);
283
284            h1.BindTo(tankki.HitPoints);
285            h2.BindTo(tankki2.HitPoints);
286        }
287        private void AseidenLuominen()
288        {
289            Aseidennimet = new List<String>();
290            Aseet = new List<Projectile>();
291            AseenTulinopeus = new List<double>();
292
293            CannonBall panos = new CannonBall();
294            panos.Shape = Shapes.CreateRectangle(20.0, 5.0);
295            panos.Damage = new Damage(300);
296            panos.Restitution = 0.0;
297            panos.ExplodeCondition = Projectile.IsBattleObject;
298            panos.Explosion.Force = 1000;
299            Aseet.Add(panos);
300            Aseidennimet.Add("Mine");
301            AseenTulinopeus.Add(0.2);
302
303            CannonBall panos2 = new CannonBall();
304            panos2.Shape = Shapes.CreateCircle(5.0);
305            panos2.Damage = new Damage(100);
306            Aseet.Add(panos2);
307            Aseidennimet.Add("Cannon");
308            AseenTulinopeus.Add(1.5);
309
310
311            Projectile panos3 = new Projectile("SuperCluster", Shapes.CreateCircle(20.0),10);
312            panos3.Explosion = new Explosion(120, 200, 100000, new Damage(1000));
313            panos3.Texture = Content.Load<Texture2D>("Cluster");
314            panos3.ClusterType = new ClusterCannonball(1);
315            panos3.ClusterType.Shape = Shapes.CreateCircle(12);
316            panos3.ClusterType.NumClusters = 2;
317            panos3.Explosion.Force = 1000;
318            panos3.NumClusters = 2;
319            panos3.ClusterArc = 20;
320            AseenTulinopeus.Add(0.1);
321            Aseet.Add(panos3);
322            Aseidennimet.Add("SuperCluster");
323
324            Projectile panos4 = new Projectile("granaatti",Shapes.CreateRectangle(10,15),10);
325            granaatti = Content.Load<Texture2D>("Granade");
326            panos4.Texture = granaatti;
327            panos4.ExplodeCondition = Projectile.IsBattleObject;
328            panos4.FuseTime = new Lifetime(4.0);
329            panos4.Explosion = new Explosion(120,200, 100000, new Damage(400));
330            AseenTulinopeus.Add(0.15);
331            Aseet.Add(panos4);
332            Aseidennimet.Add("Granade");
333           
334
335            Projectile panos5 = new Projectile("Raketti", Shapes.CreateRectangle(80, 8), 10);
336            Texture2D raketti = Content.Load<Texture2D>("Rocket");
337            panos5.Texture = raketti;
338            panos5.Mass = 8.0;
339            panos5.Explosion = new Explosion(120, 200, 100000, new Damage(400));
340            panos5.FuseTime = new Lifetime(4.0);
341            panos5.Explosion.Force = 100000;
342            AseenTulinopeus.Add(0.2);
343            Aseet.Add(panos5);
344            Aseidennimet.Add("Rocket");
345
346            CannonBall panos6 = new CannonBall();
347            panos6.Shape = Shapes.CreateCircle(2.0);
348            panos6.Mass = 10.0;
349            panos6.Explodes = true;
350            panos6.Explosion.MaxRadius = 20;
351            panos6.Damage = new Damage(10);
352            panos6.Explosion.Force = 1;
353            AseenTulinopeus.Add(8.0);
354            Aseet.Add(panos6);
355            Aseidennimet.Add("MachineGun");
356
357
358
359            tankki.Cannon.FireRate = 0.1;
360            tankki.Cannon.Clip = new Clip(panos3);
361
362            tankki2.Cannon.FireRate = 0.1;
363            tankki2.Cannon.Clip = new Clip(panos3);
364        }
365        private void Hull_HitpointsReachedZero(object sender, EventArgs e)
366        {
367            Winner2.Visible = true;
368           
369        }
370        private void Hull_HitpointsReachedZero2(object sender, EventArgs e)
371        {
372
373
374            Winner1.Visible = true;
375
376        }
377        private bool NextWeapon1(ControlEvent e)
378        {
379            Weapon1 += 1;
380            if (Weapon1 > Aseidenmaara)
381            {
382                Weapon1 = 0;
383            }
384            tankki.Cannon.Power.Value = 0;
385            tankki.Cannon.Clip = new Clip(Aseet[Weapon1]);
386            tankki.Cannon.FireRate = AseenTulinopeus[Weapon1];
387            Ase1.Text = Aseidennimet[Weapon1];
388            return false;
389        }
390        bool BeforeWeapon1(ControlEvent e)
391        {
392            Weapon1 -= 1;
393            if (Weapon1 < 0)
394            {
395                Weapon1 = Aseidenmaara;
396            }
397            tankki.Cannon.Power.Value = 0;
398            tankki.Cannon.Clip = new Clip(Aseet[Weapon1]);
399            tankki.Cannon.FireRate = AseenTulinopeus[Weapon1];
400            Ase1.Text = Aseidennimet[Weapon1];
401            return false;
402        }
403        bool NextWeapon2(ControlEvent e)
404        {
405            Weapon2 += 1;
406            if (Weapon2 > Aseidenmaara)
407            {
408                Weapon2 = 0;
409            }
410            tankki2.Cannon.Power.Value = 0;
411            tankki2.Cannon.Clip = new Clip(Aseet[Weapon2]);
412            tankki2.Cannon.FireRate = AseenTulinopeus[Weapon2];
413            Ase2.Text = Aseidennimet[Weapon2];
414            return false;
415        }
416        bool BeforeWeapon2(ControlEvent e)
417        {
418            Weapon2 -= 1;
419            if (Weapon2 < 0)
420            {
421                Weapon2 = Aseidenmaara;
422            }
423            tankki2.Cannon.Power.Value = 0;
424            tankki2.Cannon.Clip = new Clip(Aseet[Weapon2]);
425            tankki2.Cannon.FireRate = AseenTulinopeus[Weapon2];
426            Ase2.Text = Aseidennimet[Weapon2];
427            return false;
428        }
429        bool aja1(ControlEvent e)
430        {
431            Tank t = e.Parameter0 as Tank;
432
433            moottoripaalla1 = true;
434            double vaanto = e.Parameter1.ToDouble();
435
436            // Kiihdytetään tankin vauhtia
437
438
439            if (JetPackON1 == 0)
440            {
441                t.Accelerate(vaanto);
442            }
443            else
444            {
445                if (vaanto > 0.0)
446                {
447                    t.Hull.Body.ApplyTorque(1000000);
448                }
449                else
450                {
451                    t.Hull.Body.ApplyTorque(-1000000);
452                }
453
454            }
455
456
457
458            return false;
459        }
460        bool aja2(ControlEvent e)
461        {
462            Tank t = e.Parameter0 as Tank;
463            moottoripaalla2 = true;
464            double vaanto = e.Parameter1.ToDouble();
465
466            // Kiihdytetään tankin vauhtia
467
468
469            if (JetPackON2 == 0)
470            {
471                t.Accelerate(vaanto);
472            }
473            else
474            {
475                if (vaanto > 0.0)
476                {
477                    t.Hull.Body.ApplyTorque(1000000);
478                }
479                else
480                {
481                    t.Hull.Body.ApplyTorque(-1000000);
482                }
483
484            }
485
486
487
488            return false;
489        }
490        bool lisaatehoja1(ControlEvent e)
491        {
492           
493           
494            if (Weapon1 == 5)
495            {
496                tankki.Shoot();
497            }
498            else
499            {
500                if (tankki.Cannon.Power.Value < 15000)
501                {
502                    tankki.Cannon.Power.Value += 100.0;
503                }
504            }
505            return false;
506        }
507        bool lisaatehoja2(ControlEvent e)
508        {
509           
510
511            if (Weapon2 == 5)
512            {
513                tankki2.Shoot();
514            }
515            else
516            {
517                if (tankki2.Cannon.Power.Value < 15000)
518                {
519                    tankki2.Cannon.Power.Value += 100.0;
520                }
521            }
522            return false;
523        }
524        void JetPackOFF1(Collision collision)
525        {
526            if (collision.Other == Kentta)
527            {
528                JetPackON1 = 0;
529            }
530        }
531        void JetPackOFF2(Collision collision)
532        {
533            if (collision.Other == Kentta)
534            {
535                JetPackON2 = 0;
536            }
537        }
538        bool kaannaPutkea(ControlEvent e)
539        {
540            Tank t = e.Parameter0 as Tank;
541            Angle kaanto = e.Parameter1.ToAngle();
542
543            // Tässä käännetään tankin piippua
544            t.TurnCannon(kaanto);
545
546            return false;
547        }
548        bool JetPack1(ControlEvent e)
549        {
550            Tank t = e.Parameter0 as Tank;
551            Angle kulma = t.Hull.Angle + Angle.Degrees(90);
552
553            t.Hit(Vector2D.FromLengthAndAngle(1000, kulma.Radian));
554            JetPackON1 = 1;
555            return false;
556        }
557        bool JetPack2(ControlEvent e)
558        {
559            Tank t = e.Parameter0 as Tank;
560            Angle kulma = t.Hull.Angle + Angle.Degrees(90);
561
562            t.Hit(Vector2D.FromLengthAndAngle(1000, kulma.Radian));
563            JetPackON2 = 1;
564            return false;
565        }
566        bool ammupanos(ControlEvent e)
567        {
568
569            Tank t = e.Parameter0 as Tank;
570            t.Shoot();
571            t.Cannon.Power.Value = 0;
572            return false;
573        }
574        protected override void Update(GameTime gameTime)
575        {
576            AseidenEroja();
577            base.Update(gameTime);
578        }
579        private void AseidenEroja()
580        {
581            if (Weapon1 == 4 | Weapon1 == 1 | Weapon1 == 5)
582            {
583                tankki.Cannon.Power.Value = 15000;
584            }
585            if (Weapon2 == 4 | Weapon2 == 1 | Weapon2 == 5)
586            {
587                tankki2.Cannon.Power.Value = 15000;
588            }
589
590            if (tankki.Cannon.CanUse)
591            {
592                g1.IntValue = tankki.Cannon.Power.ToInt();
593                Reloading1.Visible = false;
594            }
595            else
596            {
597                g1.IntValue = 0;
598                Reloading1.Visible = true;
599            }
600
601            if (tankki2.Cannon.CanUse)
602            {
603                g2.IntValue = tankki2.Cannon.Power.ToInt();
604                Reloading2.Visible = false;
605            }
606            else
607            {
608                g2.IntValue = 0;
609                Reloading2.Visible = true;
610            }
611        }
612        void SoitaTankkienaanet(Timer sender)
613        {
614            //Ykkös tankin äänet
615            if (tuhoutunut1 == false)
616            {
617                if (moottoripaalla1 == true)
618                {
619                    voimakkuus = 0.5f;
620                    pitch = -0.5f;
621                }
622                else
623                {
624                    voimakkuus = 0.1f;
625                    pitch = -1.0f;
626                }
627
628                prosentti = Math.Abs(tankki.X) / Level.Right;
629                suunta = 0.0f;
630                if (tankki.X < 0)
631                {
632                    suunta = (float)(-prosentti);
633                }
634                else
635                {
636                    suunta = (float)(prosentti);
637                }
638                tankinaanet.Play(voimakkuus, pitch, suunta);
639            }
640
641            //Tankki2:sen äänet
642            if (tuhoutunut2 == false)
643            {
644                if (moottoripaalla2 == true)
645                {
646                    voimakkuus = 0.5f;
647                    pitch = -0.5f;
648                }
649                else
650                {
651                    voimakkuus = 0.1f;
652                    pitch = -1.0f;
653                }
654
655                prosentti = Math.Abs(tankki2.X) / Level.Right;
656                suunta = 0.0f;
657                if (tankki2.X < 0)
658                {
659                    suunta = (float)(-prosentti);
660                }
661                else
662                {
663                    suunta = (float)(prosentti);
664                }
665                tankinaanet.Play(voimakkuus, pitch, suunta);
666            }
667        }
668    }
669}
Note: See TracBrowser for help on using the repository browser.