source: 2010/24/arhetaka/FysiikkaPeli1/FysiikkaPeli1/Peli.cs @ 951

Revision 951, 33.5 KB checked in by arhetaka, 13 years ago (diff)

paljon taas parannuksia

Line 
1using System;
2using Jypeli;
3using Jypeli.ScreenObjects;
4using Jypeli.Assets;
5
6public class Peli : PhysicsGame
7{     
8    PhysicsObject alus1;
9    PhysicsObject alus2;
10
11    PhysicsObject vasenReuna;
12    PhysicsObject oikeaReuna;
13    PhysicsObject alaReuna;
14    PhysicsObject ylaReuna;
15
16    ImageDisplay alus1PerusAse;
17    ImageDisplay alus2PerusAse;
18
19    ImageDisplay alus1SpecialAse;
20    ImageDisplay alus2SpecialAse;
21
22    int siirtymaLaidassa = 80;
23    int reunanetaisyysruudusta = 100;
24
25    IntMeter p1Pisteet;
26    IntMeter p2Pisteet;
27
28    BarGauge p1special;
29    BarGauge p2special;
30   
31    DoubleMeter p1specialTeho;
32    DoubleMeter p2specialTeho;
33
34    BarGauge p1health;
35    BarGauge p2health;
36
37    DoubleMeter p1healthmittari;
38    DoubleMeter p2healthmittari;
39
40    Double specialLifeTime = 1.5;
41    Boolean p1specialkentalla = false;
42    Boolean p2specialkentalla = false;
43    Timer p1specialTimer;
44    Timer p2specialTimer;
45    int specialNopeus = 500;
46    int p1special_reload_speed = 1;
47    int p2special_reload_speed = 1;
48   
49    int p1kaanto_nopeus = 2;
50    int p2kaanto_nopeus = 2;
51
52    int alus1nopeus = 2000;
53    int alus2nopeus = 2000;
54
55    Animation alus1_kaasu_tekst;
56    Animation alus2_kaasu_tekst;
57    Animation alus1_idle_tekst;
58    Animation alus2_idle_tekst;
59
60    Animation lisaase_anim;
61    Animation perusase_anim;
62
63    Animation special_animation;
64
65    double resolutionX;
66    double resolutionY;
67
68    Timer UpdateTimer;
69    double updateInterval = 0.1;
70       
71    bool alus1_kaasuttaa = false;
72    bool alus2_kaasuttaa = false;
73
74    bool lisaaseita = true;
75
76    int perusAmmusKoko = 3;
77    int AlustenHealth = 10;
78    double alustenIlmanvastus = 0.999;
79
80    int partikkelit = 50;
81
82    Timer reSpawnTimer1;
83    Timer reSpawnTimer2;
84    int respawntimer = 3;
85
86    protected override void Begin()
87    {
88        AloitaPeli();       
89    }
90    void AloitaPeli()
91    {
92        ClearAll();
93        NollaaMuuttujat();
94       
95        LuoKentta();
96        AsetaOhjaimet();
97        LisaaLaskurit();
98    }
99    void NollaaMuuttujat()
100    {
101        p1special_reload_speed = 1;
102        p2special_reload_speed = 1;
103
104        p1kaanto_nopeus = 2;
105        p2kaanto_nopeus = 2;
106
107        alus1nopeus = 1000;
108        alus2nopeus = 1000;
109
110        alus1_kaasuttaa = false;
111        alus2_kaasuttaa = false;
112        p1specialkentalla = false;
113        p2specialkentalla = false;
114    }
115    void LuoKentta()
116    {
117        resolutionX = Screen.Width;
118        resolutionY = Screen.Height;
119
120        reSpawnTimer1 = new Timer();
121        reSpawnTimer2 = new Timer();
122        Add(reSpawnTimer1);
123        Add(reSpawnTimer2);
124
125        TeeGalaksi();
126        TeeAsteroidi(0,0,5, 200);       
127        TeeAlukset(true, true);       
128        UpDate(); //tekee ajopisteet ja tutkii ovatko alukset vielä kentällä
129        TeeSpecial(); //tekee special aseet ja lisää kuuntelijat
130        TeeHealth();       
131        TeeAseidenKuvat();
132        Level.Background.CreateStars(3000);
133       
134        TeeReunat();
135        Camera.ZoomToLevel();
136        MessageDisplay.X = 0;
137        MessageDisplay.TextColor = Color.White;
138
139    }
140    void TeeGalaksi()
141    {
142        PhysicsObject galaksi = new PhysicsObject(700, 700);
143        galaksi.Image = LoadImage("galaksi");
144        galaksi.IgnoresExplosions = true;
145        galaksi.IgnoresCollisionResponse = true;
146        galaksi.IgnoresPhysicsLogics = true;
147        galaksi.IgnoresGravity = true;
148        galaksi.Tag = "galaksi";
149        galaksi.AngularVelocity = -0.1;
150        Add(galaksi);
151    }
152    void TeeAsteroidi(double x, double y, int lukumaara, double maxkoko)
153    {
154        for (int i = 0; i < lukumaara; i++)
155        {
156           
157            double koko = RandomGen.NextDouble(maxkoko/2, maxkoko);
158            if (koko > 30)
159            {
160                PhysicsObject asteroidi = new PhysicsObject(koko, koko);
161                asteroidi.Shape = Shapes.Circle;
162                asteroidi.Image = LoadImage("asteroidi");
163                asteroidi.Mass = koko * 5;
164                asteroidi.IgnoresExplosions = false;
165                asteroidi.IgnoresCollisionResponse = false;
166                asteroidi.IgnoresPhysicsLogics = false;
167                asteroidi.IgnoresGravity = false;
168                Vector suunta = Vector.FromLengthAndAngle(RandomGen.NextDouble(0, 5000), RandomGen.NextAngle());
169                asteroidi.X = x;// +suunta.X / 10;
170                asteroidi.Y = y;// +suunta.Y / 10;
171                asteroidi.Hit(suunta);
172                asteroidi.Tag = "asteroidi9";
173                asteroidi.AngularVelocity = RandomGen.NextDouble(-1, 1);
174                AddCollisionHandler(asteroidi, AsteroidiOsuu);
175                Add(asteroidi);
176            }
177            else if (lisaaseita && koko > 20)
178            {
179                PhysicsObject lisaase = new PhysicsObject(koko, koko);
180                lisaase.Color = Color.White;
181                lisaase.Tag = "lisaase";
182                lisaase.Mass = koko;
183                lisaase.Image = LoadImage("lisaase1");
184                Image[] lisaaseimaget = LoadImages(
185                   "lisaase1",
186                   "lisaase2",
187                   "lisaase3",
188                   "lisaase4"
189                   );
190                lisaase_anim = new Animation(lisaaseimaget);
191                lisaase_anim.FPS = 1.5;
192                lisaase.Animation = lisaase_anim;
193                lisaase.Animation.Start();
194                lisaase.X = x;
195                lisaase.Y = y;
196                Add(lisaase);
197            }
198        }
199    }
200    void TeeAlukset(bool p1, bool p2)
201    {
202        if (p1)
203        {
204            alus1 = LuoAlus(1, Level.Left + 20.0, 0.0);
205            alus1.Tag = "alus1";
206            alus1.Image = LoadImage("alus12");
207            alus1.Color = Color.Red;
208            AddCollisionHandler(alus1, AlusOsuu);
209
210            Image[] alus1idle = LoadImages(
211               "alus12",
212               "alus121",
213               "alus122"
214               );
215            alus1_idle_tekst = new Animation(alus1idle);
216            alus1_idle_tekst.FPS = 1.5;
217            alus1.Animation = alus1_idle_tekst;
218            alus1.Animation.Start();
219
220            Image[] alus_kaasu1 = LoadImages(
221                "alus12",
222                "alus12_kaasuttaa"
223                );
224            alus1_kaasu_tekst = new Animation(alus_kaasu1);
225            alus1_kaasu_tekst.FPS = 10;
226            alus1.LinearDamping = alustenIlmanvastus;
227
228           
229        }
230        if (p2)
231        {
232            alus2 = LuoAlus(2, Level.Right - 20.0, 0.0);
233            alus2.Tag = "alus2";
234            alus2.Image = LoadImage("alus22");
235            alus2.Color = Color.Blue;
236            AddCollisionHandler(alus2, AlusOsuu);
237
238            Image[] alus2idle = LoadImages(
239               "alus22",
240               "alus221",
241               "alus222"
242               );
243            alus2_idle_tekst = new Animation(alus2idle);
244            alus2_idle_tekst.FPS = 1.5;
245            alus2.Animation = alus2_idle_tekst;
246            alus2.Animation.Start();
247
248
249            Image[] alus_kaasu2 = LoadImages(
250                "alus22",
251                "alus22_kaasuttaa"
252                );
253            alus2_kaasu_tekst = new Animation(alus_kaasu2);
254            alus2_kaasu_tekst.FPS = 10;
255
256            alus2.Angle = Angle.StraightAngle;
257            alus2.LinearDamping = alustenIlmanvastus;
258        }
259    }
260    void TeeReunat()
261    {
262
263        vasenReuna = PhysicsObject.CreateStaticObject(5, resolutionX + 500);
264        vasenReuna.IgnoresPhysicsLogics = true;
265        vasenReuna.Color = Color.White;
266        vasenReuna.X = -(resolutionX / 2) - reunanetaisyysruudusta;
267        vasenReuna.Restitution = 1.0;
268        vasenReuna.IsVisible = true;
269        vasenReuna.Tag = "vasenreuna";
270        vasenReuna.IgnoresCollisionResponse = true;
271        AddCollisionHandler(vasenReuna, ReunaanOsuu);
272        Add(vasenReuna);
273
274        oikeaReuna = PhysicsObject.CreateStaticObject(5, resolutionX + 500);
275        oikeaReuna.IgnoresPhysicsLogics = true;
276        oikeaReuna.Color = Color.White;
277        oikeaReuna.X = (resolutionX / 2) + reunanetaisyysruudusta;
278        oikeaReuna.Restitution = 1.0;
279        oikeaReuna.IsVisible = true;
280        oikeaReuna.Tag = "oikeareuna";
281        oikeaReuna.IgnoresCollisionResponse = true;
282        AddCollisionHandler(oikeaReuna, ReunaanOsuu);
283        Add(oikeaReuna);
284
285        ylaReuna = PhysicsObject.CreateStaticObject(resolutionY + 500, 5);
286        ylaReuna.IgnoresPhysicsLogics = true;
287        ylaReuna.Color = Color.White;
288        ylaReuna.Y = (resolutionY / 2) + reunanetaisyysruudusta;
289        ylaReuna.Restitution = 0.0;
290        ylaReuna.IsVisible = true;
291        ylaReuna.Tag = "ylareuna";
292        ylaReuna.IgnoresCollisionResponse = true;
293        AddCollisionHandler(ylaReuna, ReunaanOsuu);
294        Add(ylaReuna);
295
296        alaReuna = PhysicsObject.CreateStaticObject(resolutionY + 500, 5);
297        alaReuna.IgnoresPhysicsLogics = true;
298        alaReuna.Color = Color.White;
299        alaReuna.Y = -(resolutionY / 2) - reunanetaisyysruudusta;
300        alaReuna.Restitution = 0.0;
301        alaReuna.IsVisible = true;
302        alaReuna.Tag = "alareuna";
303        alaReuna.IgnoresCollisionResponse = true;
304        AddCollisionHandler(alaReuna, ReunaanOsuu);
305        Add(alaReuna);
306    }
307    void TeeAseidenKuvat()
308    {
309        alus1PerusAse = new ImageDisplay();
310        TeeAsenaytto(alus1PerusAse, Screen.Left + 50, Screen.Top - 50);       
311        alus1PerusAse.Image = LoadImage("plasma");
312        Image[] alus_perus = LoadImages(
313              "plasma",
314              "plasma2"             
315              );
316        perusase_anim = new Animation(alus_perus);
317        alus1PerusAse.Animation = perusase_anim;
318        alus1PerusAse.Animation.FPS = 15;
319        alus1PerusAse.Animation.Start();
320
321        Add(alus1PerusAse);
322
323        alus2PerusAse = new ImageDisplay();
324        TeeAsenaytto(alus2PerusAse, Screen.Right - 50, Screen.Top - 50);
325        alus2PerusAse.Image = LoadImage("plasma");
326        alus2PerusAse.Animation = perusase_anim;
327        alus2PerusAse.Animation.FPS = 15;
328        alus2PerusAse.Animation.Start();
329        Add(alus2PerusAse);
330
331        Image[] alus_special = LoadImages(
332         "special2",
333         "special22",
334         "special23"
335         );
336        special_animation = new Animation(alus_special);
337
338        alus1SpecialAse = new ImageDisplay();
339        TeeAsenaytto(alus1SpecialAse, Screen.Left + 100, Screen.Top - 50);       
340        alus1SpecialAse.Image = LoadImage("special2");
341        alus1SpecialAse.Animation = special_animation;
342        alus1SpecialAse.Animation.FPS = 4;
343        alus1SpecialAse.Animation.Start();
344        Add(alus1SpecialAse);
345
346        alus2SpecialAse = new ImageDisplay();
347        TeeAsenaytto(alus2SpecialAse, Screen.Right - 100, Screen.Top - 50);
348        alus2SpecialAse.Image = LoadImage("special2");
349        alus2SpecialAse.Animation = special_animation;
350        alus2SpecialAse.Animation.FPS = 4;
351        alus2SpecialAse.Animation.Start();
352
353        Add(alus2SpecialAse);
354    }
355    void TeeAsenaytto(ImageDisplay naytto, double x, double y)
356    {       
357        naytto.AutoSize = false;
358        naytto.Width = 40;
359        naytto.Height = 40;
360        naytto.X = x;
361        naytto.Y = y;       
362    }
363
364
365    PhysicsObject LuoAlus(int kumpi, double x, double y)
366    {
367        PhysicsObject alus = new PhysicsObject(60.0, 45.0);
368        alus.Shape = Shapes.Rectangle;
369        alus.X = x;
370        alus.Y = y;
371        alus.Mass = 10;
372        alus.Restitution = 1.0;
373        alus.CanRotate = true;
374        alus.IgnoresCollisionResponse = false;
375        //AddCollisionHandler(alus, AlusOsuu);
376        Add(alus);
377        return alus;
378    }
379    void LisaaLaskurit()
380    {
381        p1Pisteet = LuoPisteLaskuri(Screen.Left + 75.0, Screen.Top - 250.0, Color.Red);
382        p2Pisteet = LuoPisteLaskuri(Screen.Right - 75.0, Screen.Top - 250.0, Color.Blue);
383    }
384    IntMeter LuoPisteLaskuri(double x, double y, Color vari)
385    {
386        IntMeter laskuri = new IntMeter(0);
387        laskuri.MaxValue = AlustenHealth;
388        ValueDisplay naytto = new ValueDisplay();
389        naytto.BindTo(laskuri);
390        naytto.X = x;
391        naytto.Y = y;
392        naytto.ValueColor = vari;       
393        //naytto.Width = 50;
394        //naytto.Height = 50;
395        Add(naytto);
396        return laskuri;
397    }
398    void AsetaOhjaimet()
399    {
400
401        Keyboard.Listen(Key.A, ButtonState.Down, KaannaVasen, "käännä alusta vasemmalle", alus1,  1);
402        Keyboard.Listen(Key.A, ButtonState.Released, PysaytaPyoriminen, null, alus1, 1);
403        Keyboard.Listen(Key.D, ButtonState.Down, KaannaOikea, "käännä alusta oikealle", alus1, 1);
404        Keyboard.Listen(Key.D, ButtonState.Released, PysaytaPyoriminen, null, alus1, 1);
405        Keyboard.Listen(Key.W, ButtonState.Down, Kaasua, "kaasu", alus1, 1);
406        Keyboard.Listen(Key.W, ButtonState.Released, Eikaasua, null, alus1, 1);
407        Keyboard.Listen(Key.Tab, ButtonState.Pressed, Ammu, null, alus1, 1);
408
409        Keyboard.Listen(Key.Left, ButtonState.Down, KaannaVasen, "käännä alusta vasemmalle", alus2, 1);
410        Keyboard.Listen(Key.Left, ButtonState.Released, PysaytaPyoriminen, null, alus2, 1);
411        Keyboard.Listen(Key.Right, ButtonState.Down, KaannaOikea, "käännä alusta oikealle", alus2, 1);
412        Keyboard.Listen(Key.Right, ButtonState.Released, PysaytaPyoriminen, null, alus2, 1);
413        Keyboard.Listen(Key.Up, ButtonState.Down, Kaasua, "kaasu", alus2, 1);
414        Keyboard.Listen(Key.Up, ButtonState.Released, Eikaasua, null, alus2, 1);
415        Keyboard.Listen(Key.RightShift, ButtonState.Pressed, Ammu, null, alus2, 1);
416
417        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
418        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Poistu");
419        Keyboard.Listen(Key.F2, ButtonState.Pressed, AloitaPeli, "uusi peli");       
420    }   
421    void KaannaVasen(PhysicsObject alus, int nopeus)
422    {
423        if (alus.Tag == "alus1")
424        {
425            alus.AngularVelocity = p1kaanto_nopeus;
426        }
427        else if (alus.Tag == "alus2")
428        {
429            alus.AngularVelocity = p2kaanto_nopeus;
430        }
431    }
432    void KaannaOikea(PhysicsObject alus, int nopeus)
433    {
434        if (alus.Tag == "alus1")
435        {
436            alus.AngularVelocity = -p1kaanto_nopeus;
437        }
438        else if (alus.Tag == "alus2")
439        {
440            alus.AngularVelocity = -p2kaanto_nopeus;
441        }
442    }
443   
444    void PysaytaPyoriminen(PhysicsObject alus, int nopeus)
445    {
446        alus.AngularVelocity = 0;
447    }
448    void Kaasua(PhysicsObject alus, int nopeus)
449    {
450        Angle aluksenKulma = alus.Angle;
451        Vector impulssi;
452        if (alus.Tag == "alus1")
453        {
454         impulssi = Vector.FromLengthAndAngle(alus1nopeus, aluksenKulma);       
455        }
456        else
457        {
458             impulssi = Vector.FromLengthAndAngle(alus2nopeus, aluksenKulma);
459        }
460        double aluksenAste = aluksenKulma.Degree;   
461        alus.Push(impulssi);       
462        alus.Animation.Resume();
463        if (alus.Tag == "alus1")
464        {
465            alus1_kaasuttaa = true;
466            alus1.Animation = alus1_kaasu_tekst;
467
468        }
469        if (alus.Tag == "alus2")
470        {
471            alus2_kaasuttaa = true;
472            alus2.Animation = alus2_kaasu_tekst;
473        }
474
475    }
476    void Eikaasua(PhysicsObject alus, int nopeus)
477    {
478        alus.Animation.Stop();
479        if (alus.Tag == "alus1")
480        {
481            alus1_kaasuttaa = false;
482            alus1.Animation = alus1_idle_tekst;
483
484        }
485        if (alus.Tag == "alus2")
486        {
487            alus2_kaasuttaa = false;
488            alus2.Animation = alus2_idle_tekst;
489        }
490    }
491    void Ammu(PhysicsObject alus, int nopeus)
492    {
493        PhysicsObject ammus = new PhysicsObject(perusAmmusKoko, perusAmmusKoko);
494        ammus.Shape = Shapes.Circle;
495        ammus.Color = Color.YellowGreen;
496        ammus.X = alus.X;
497        ammus.Y = alus.Y;
498        ammus.IgnoresCollisionResponse = true;
499        ammus.IgnoresExplosions = true;
500        TimeSpan elinaika = new TimeSpan(15000000);
501        ammus.MaximumLifetime = elinaika;
502        ammus.Tag = alus.Tag + "ammus";
503        AddCollisionHandler(ammus, AmmusOsuu);
504        Add(ammus);
505        Angle aluksenKulma = alus.Angle;
506        Vector impulssi = Vector.FromLengthAndAngle(500, aluksenKulma);
507        ammus.Hit(impulssi);
508    }
509    void AmmusOsuu(PhysicsObject ammus, PhysicsObject kohde)
510    {
511        if (kohde.Tag != "galaksi")
512        {
513            string ampuja = ammus.Tag.ToString();
514            string uhri = kohde.Tag.ToString();
515
516           
517            if (ampuja[4] != uhri[4] && kohde.Tag != "ajopiste")
518            {
519                string special = ammus.Tag.ToString();
520                if (special[5] == 's') //jos special
521                {
522                    if (special[4] == '2')
523                    {
524                        Rajaytap2Special(p2specialTimer);
525                    }
526                    else if (special[4] == '1')
527                    {
528                        Rajaytap1Special(p1specialTimer);
529                    }             
530                }
531                else
532                {
533                    Explosion rajahdys;
534                    rajahdys = new Explosion(40);
535                    rajahdys.Position = ammus.Position;
536                    Add(rajahdys);                   
537                }
538                if (uhri[1] == 's')
539                {
540                    double asteroidinenergia = char.GetNumericValue(uhri[9]);
541                    if (special[5] == 's')
542                    {
543                        asteroidinenergia -= (int)(ammus.Width / 3);
544                    }
545                    else
546                    {
547                        asteroidinenergia--;
548                    }
549                    if (asteroidinenergia <= 0)
550                    {
551                        TeeAsteroidi(kohde.X, kohde.Y, 3, (kohde.Width / 2));
552                        kohde.Destroy();
553                    }
554                    else
555                    {
556                        string uhrinuusitag = "asteroidi";
557                        string uusienergia = asteroidinenergia.ToString();
558                        uhrinuusitag = uhrinuusitag + uusienergia[0];
559                        kohde.Tag = uhrinuusitag;
560                    }
561
562                }
563
564                if (kohde.Tag == "alus2")
565                {
566                    p2healthmittari.Value -= (int)(ammus.Width / 3);
567                }
568                else if (kohde.Tag == "alus1")
569                {
570                    p1healthmittari.Value -= (int)(ammus.Width / 3);
571                }
572                ammus.Destroy();
573            }
574        }
575    }
576    void AlusOsuu(PhysicsObject alus, PhysicsObject kohde)
577    {
578        if (kohde.Tag.ToString().Length > 8)
579        {
580            string kohdestr = kohde.Tag.ToString();
581            if (alus.Tag == "alus2" && kohdestr[8] == 'i')
582            {
583                p2healthmittari.Value -= 1;
584            }
585            else if (alus.Tag == "alus1" && kohdestr[8] == 'i')
586            {
587                p1healthmittari.Value -= 1;
588            }
589        }
590        if (kohde.Tag == "lisaase")
591        {
592            int mikaase = RandomGen.NextInt(4);
593            if (mikaase == 0)
594            {
595                if (alus.Tag == "alus1")
596                {
597                    p1special_reload_speed += 1;
598                    MessageDisplay.Add("Pelaaja 1 special latausnopeus +");
599                }
600                if (alus.Tag == "alus2")
601                {
602                    p2special_reload_speed += 1;
603                    MessageDisplay.Add("Pelaaja 2 special latausnopeus +");
604                }
605            }
606            if (mikaase == 1)
607            {
608                if (alus.Tag == "alus1")
609                {                   
610                    p1healthmittari.Value += 3;
611                    MessageDisplay.Add("Pelaaja 1 health +3");
612                }
613                if (alus.Tag == "alus2")
614                {
615                    p2healthmittari.Value += 3;
616                    MessageDisplay.Add("Pelaaja 2 health +3");
617                }
618            }
619            if (mikaase == 2)
620            {
621                if (alus.Tag == "alus1")
622                {
623                    alus1nopeus += 1000;
624                    MessageDisplay.Add("Pelaaja 1 nopeus +");
625                }
626                if (alus.Tag == "alus2")
627                {
628                    alus2nopeus += 1000;
629                    MessageDisplay.Add("Pelaaja 2 nopeus +");
630                }
631            }
632            if (mikaase == 3)
633            {
634                if (alus.Tag == "alus1")
635                {
636                    p1kaanto_nopeus += 1;
637                    MessageDisplay.Add("Pelaaja 1 kääntönopeus +");
638                }
639                if (alus.Tag == "alus2")
640                {
641                    p2kaanto_nopeus += 1;
642                    MessageDisplay.Add("Pelaaja 2 kääntönopeus +");
643                }
644            }
645            kohde.Destroy();
646        }
647    }
648    void UpDate()
649    {
650        UpdateTimer = new Timer();                     // luodaan uusi ajastin, nimeltä aikaLaskuri
651        UpdateTimer.Interval = updateInterval;                      // ajastukseksi 5 sekuntia
652        UpdateTimer.Trigger += new Timer.TriggerHandler(Paivitys);  //   // asetetaan tapahtuma, kun aikaLaskuri kun 5 sekuntia on kulunut.
653        Add(UpdateTimer);                       // lisätään aikaLaskuri peliin
654        UpdateTimer.Start();                           // käynnistetään aikaLaskuri     
655    }
656    private void Paivitys(Timer sender)
657    {
658        //ovatko alukset kentällä
659        if (alus1.X < (vasenReuna.X - 50))
660        {
661            alus1.X = oikeaReuna.X - siirtymaLaidassa;
662        }
663        if (alus2.X < (vasenReuna.X - 50))
664        {
665            alus2.X = oikeaReuna.X - siirtymaLaidassa;
666        }
667        if (alus1.X > (oikeaReuna.X + 50))
668        {
669            alus1.X = vasenReuna.X + siirtymaLaidassa;
670        }
671        if (alus2.X > (oikeaReuna.X + 50))
672        {
673            alus2.X = vasenReuna.X + siirtymaLaidassa;
674        }
675        if (alus1.Y > (ylaReuna.Y + 50))
676        {
677            alus1.Y = alaReuna.Y + siirtymaLaidassa;
678        }
679        if (alus2.Y > (ylaReuna.Y + 50))
680        {
681            alus2.Y = alaReuna.Y + siirtymaLaidassa;
682        }
683        if (alus1.Y < (alaReuna.Y - 50))
684        {
685            alus1.Y = ylaReuna.Y - siirtymaLaidassa;
686        }
687        if (alus2.Y < (alaReuna.Y - 50))
688        {
689            alus1.Y = ylaReuna.Y - siirtymaLaidassa;
690        }
691
692
693        if (alus1_kaasuttaa) //ajopisteen teko
694        {
695            PhysicsObject piste = teeAjopiste(alus1);
696            Add(piste);
697        }
698        if (alus2_kaasuttaa) //ajopisteen teko
699        {
700            PhysicsObject piste = teeAjopiste(alus2);
701            Add(piste);
702        }
703    }
704    PhysicsObject teeAjopiste(PhysicsObject alus)
705    {
706        PhysicsObject piste = new PhysicsObject(2, 2);
707        piste.Shape = Shapes.Circle;
708        piste.Color = Color.Yellow;
709        piste.IgnoresCollisionResponse = true;
710        piste.Tag = "ajopiste";
711        piste.X = alus.X;
712        piste.Y = alus.Y;
713        TimeSpan elinaika = new TimeSpan(20000000);
714        piste.MaximumLifetime = elinaika;
715        Angle aluksenKulma = alus.Angle + Angle.StraightAngle;
716        Vector impulssi = Vector.FromLengthAndAngle(50, aluksenKulma);
717        piste.Hit(impulssi);
718        return piste;
719    }
720    void ReunaanOsuu(PhysicsObject reuna, PhysicsObject osuja)
721    {
722        string asteroidiko = osuja.Tag.ToString();
723        if (asteroidiko[1] != 's') 
724        {
725            if (reuna.Tag == "ylareuna")
726            {
727                osuja.Y = alaReuna.Y + siirtymaLaidassa;
728            }
729
730            if (reuna.Tag == "alareuna")
731            {
732                osuja.Y = ylaReuna.Y - siirtymaLaidassa;
733            }
734            if (reuna.Tag == "vasenreuna")
735            {
736                osuja.X = (oikeaReuna.X - siirtymaLaidassa);
737            }
738
739            if (reuna.Tag == "oikeareuna")
740            {
741                osuja.X = (vasenReuna.X + siirtymaLaidassa);
742            }
743        }
744    }
745    void TeeHealth()
746    {
747        p1health = new BarGauge();
748        p1health.Max = AlustenHealth;       
749        p1healthmittari = new DoubleMeter(AlustenHealth);
750        p1healthmittari.MaxValue = AlustenHealth;
751        p1healthmittari.MinValue = 0;
752        p1healthmittari.LowerLimit += Voitto;
753        p1health.BindTo(p1healthmittari);
754        p1health.Width = 40;       
755        p1health.ValueColor = Color.Red;
756        p1health.X = Screen.Left + 50;
757        p1health.Y = Screen.Top - 150;       
758        Add(p1health);
759
760        p2health = new BarGauge();
761        p2health.Max = AlustenHealth;
762        p2healthmittari = new DoubleMeter(AlustenHealth);
763        p2healthmittari.MaxValue = AlustenHealth;
764        p2healthmittari.MinValue = 0;
765        p2healthmittari.LowerLimit += Voitto;
766        p2health.BindTo(p2healthmittari);
767        p2health.Width = 40;       
768        p2health.ValueColor = Color.Blue;
769        p2health.X = Screen.Right - 50;
770        p2health.Y = Screen.Top - 150;
771        Add(p2health);
772    }
773    void TeeSpecial()
774    {
775        p1specialTimer = new Timer();       
776        p2specialTimer = new Timer();
777
778        Add(p1specialTimer);
779        Add(p2specialTimer);
780       
781        LisaaSpecialOhjaimet();
782        LisaaSpecialMittarit();
783    }
784    void LisaaSpecialOhjaimet()
785    {       
786        Keyboard.Listen(Key.LeftShift, ButtonState.Down, LataaSpecial, "Special lataus", alus1, 1);
787        Keyboard.Listen(Key.LeftShift, ButtonState.Released, LaukaiseSpecial, "laukaise special", alus1, 1);
788        Keyboard.Listen(Key.RightControl, ButtonState.Down, LataaSpecial, "Special lataus", alus2, 1);
789        Keyboard.Listen(Key.RightControl, ButtonState.Released, LaukaiseSpecial, "laukaise special", alus2, 1);
790    }
791    void LisaaSpecialMittarit()
792    {
793        p1specialTeho = new DoubleMeter(perusAmmusKoko + 1);
794        p1specialTeho.MaxValue = 100;
795
796        p2specialTeho = new DoubleMeter(perusAmmusKoko + 1);
797        p2specialTeho.MaxValue = 100;
798       
799        p1special = new BarGauge();
800        p1special.Max = 100;
801        p1special.ValueColor = Color.LightPink;
802        p1special.BindTo(p1specialTeho);
803        p1special.X = Screen.Left + 100;
804        p1special.Y = Screen.Top - 150;
805        p1special.Width = 40;
806        Add(p1special);
807
808        p2special = new BarGauge();
809        p2special.Max = 100;
810        p2special.ValueColor = Color.LightBlue;
811        p2special.BindTo(p2specialTeho);
812        p2special.X = Screen.Right - 100;
813        p2special.Y = Screen.Top - 150;
814        p2special.Width = 40;
815        Add(p2special);
816    }   
817    void LataaSpecial(PhysicsObject alus, int nopeus)
818    {
819        if (alus.Tag == "alus1" && !p1specialkentalla)
820        {
821            p1specialTeho.Value += p1special_reload_speed;
822        }
823        if (alus.Tag == "alus2" && !p2specialkentalla)
824        {
825            p2specialTeho.Value += p2special_reload_speed;
826        }
827
828    }
829    void LaukaiseSpecial(PhysicsObject alus, int nopeus)
830    {
831        if (alus.Tag == "alus1" && !p1specialkentalla)
832        {
833            PhysicsObject ammus = new PhysicsObject((p1specialTeho / 3), (p1specialTeho / 3));
834            ammus.Shape = Shapes.Circle;
835            ammus.Color = Color.LightBlue;
836            ammus.X = alus.X;
837            ammus.Y = alus.Y;
838            ammus.IgnoresCollisionResponse = true;           
839            ammus.Tag = alus.Tag + "special";
840            AddCollisionHandler(ammus, AmmusOsuu);
841            ammus.Image = LoadImage("special2");
842            ammus.CanRotate = true;
843            ammus.AngularVelocity = 3;
844            Add(ammus);
845            Angle aluksenKulma = alus.Angle;
846            Vector impulssi = Vector.FromLengthAndAngle(specialNopeus, aluksenKulma);
847            ammus.Hit(impulssi);
848            p1specialkentalla = true;
849            p1specialTimer.Tag = ammus;
850            p1specialTimer.Interval = specialLifeTime;
851            p1specialTimer.Trigger += new Timer.TriggerHandler(Rajaytap1Special);
852            p1specialTimer.Start();
853            p1specialTeho.Value = 1;
854        }
855        if (alus.Tag == "alus2" && !p2specialkentalla)
856        {
857            PhysicsObject ammus = new PhysicsObject((p2specialTeho / 2), (p2specialTeho / 2));
858            ammus.Shape = Shapes.Circle;
859            ammus.Color = Color.LightBlue;
860            ammus.X = alus.X;
861            ammus.Y = alus.Y;
862            ammus.IgnoresCollisionResponse = true;
863            TimeSpan elinaika = TimeSpan.FromSeconds(specialLifeTime);
864            ammus.MaximumLifetime = elinaika;
865            ammus.Tag = alus.Tag + "special";
866            AddCollisionHandler(ammus, AmmusOsuu);
867            ammus.Image = LoadImage("special2");
868            ammus.CanRotate = true;
869            ammus.AngularVelocity = 3;
870            Add(ammus);
871            Angle aluksenKulma = alus.Angle;
872            Vector impulssi = Vector.FromLengthAndAngle(specialNopeus, aluksenKulma);
873            ammus.Hit(impulssi);
874            p2specialkentalla = true;
875            p2specialTimer.Tag = ammus;
876            p2specialTimer.Interval = specialLifeTime;
877            p2specialTimer.Trigger += new Timer.TriggerHandler(Rajaytap2Special);
878            p2specialTimer.Start();
879            p2specialTeho.Value = 1;           
880        }
881    }
882    private void Rajaytap1Special(Timer sender)
883    { 
884        PhysicsObject ammus = (PhysicsObject)sender.Tag;       
885        Explosion jysays = new Explosion(ammus.Width * 3);
886        jysays.Position = ammus.Position;
887        jysays.Force = 100;
888        Add(jysays);
889        ammus.Destroy();     
890        sender.Stop();       
891        p1specialkentalla = false;
892    }
893    private void Rajaytap2Special(Timer sender)
894    {
895        PhysicsObject ammus = (PhysicsObject)sender.Tag;       
896        Explosion jysays = new Explosion(ammus.Width * 3);
897        jysays.Position = ammus.Position;
898        jysays.Force = 100;
899        Add(jysays);
900        ammus.Destroy();
901        sender.Stop();
902        p2specialkentalla = false;   
903    }
904    void Voitto(Double laskuri)
905    {
906        if (p2healthmittari <= 0)
907        {
908            MessageDisplay.TextColor = Color.White;
909            MessageDisplay.Add("Pelaaja 1 voitti pelin.");
910            p1Pisteet.Value += 1;
911            TuhoaAlus(alus2);
912            reSpawnTimer2.Interval = respawntimer;
913            reSpawnTimer2.Trigger += new Timer.TriggerHandler(ReSpawnp2); 
914            reSpawnTimer2.Start();
915
916        }
917        if (p1healthmittari <= 0)
918        {
919            MessageDisplay.TextColor = Color.White;
920            MessageDisplay.Add("Pelaaja 2 voitti pelin.");
921            p2Pisteet.Value += 1;
922            TuhoaAlus(alus1);
923            reSpawnTimer1.Interval = respawntimer;
924            reSpawnTimer1.Trigger += new Timer.TriggerHandler(ReSpawnp1);
925            reSpawnTimer1.Start();
926        }       
927    }
928    void AsteroidiOsuu(PhysicsObject asteroidi, PhysicsObject kohde)
929    {
930        if (kohde.Tag == "vasenreuna")
931        {
932            asteroidi.X = oikeaReuna.X - asteroidi.Width;
933        }
934        if (kohde.Tag == "oikeareuna")
935        {
936            asteroidi.X = vasenReuna.X + asteroidi.Width;
937        }
938        if (kohde.Tag == "ylareuna")
939        {
940            asteroidi.Y = alaReuna.Y + asteroidi.Width;
941        }
942        if (kohde.Tag == "alareuna")
943        {
944            asteroidi.Y = ylaReuna.Y - asteroidi.Width;
945        }
946    }
947    void TuhoaAlus(PhysicsObject alus)
948    {
949        Explosion jysy = new Explosion(250);
950        jysy.X = alus.X;
951        jysy.Y = alus.Y;
952        Add(jysy);
953        for (int i = 0; i < partikkelit; i++)
954        {
955            PhysicsObject jama = new PhysicsObject(RandomGen.NextInt(1, 20), RandomGen.NextInt(1, 10));
956            bool nelioko = RandomGen.NextBool();
957            if (nelioko)
958            {
959                jama.Shape = Shapes.Rectangle;
960            }
961            else
962            {
963                jama.Shape = Shapes.Triangle;
964            }
965            nelioko = RandomGen.NextBool();
966            if (nelioko)
967            {
968                jama.Color = RandomGen.NextColor(Color.Red, Color.Yellow);
969            }
970            else
971            {
972                jama.Color = alus.Color;
973            }
974            jama.X = alus.X;
975            jama.Y = alus.Y;
976            Vector maiskeenlento = Vector.FromLengthAndAngle(RandomGen.NextDouble(0, 100), RandomGen.NextAngle());
977            TimeSpan eloaika = TimeSpan.FromSeconds(1);
978            jama.MaximumLifetime = eloaika;
979            jama.Tag = "jamaa";
980            jama.IgnoresCollisionResponse = true;
981
982            jama.IgnoresExplosions = true;
983            jama.IgnoresGravity = true;
984            jama.IgnoresPhysicsLogics = true;
985            jama.KineticFriction = 0.5;
986            jama.LinearDamping = 0.99;
987           
988            jama.Hit(maiskeenlento);
989            Add(jama);
990        }
991        alus.Destroy();
992    }
993    private void ReSpawnp1(Timer sender)
994    {
995        sender.Stop();
996        TeeAlukset(true, false);
997    }
998
999    private void ReSpawnp2(Timer sender)
1000    {
1001        sender.Stop();
1002        TeeAlukset(false, true);
1003    }
1004}
Note: See TracBrowser for help on using the repository browser.