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

Revision 865, 18.5 KB checked in by arhetaka, 11 years ago (diff)

päivitys

Line 
1using System;
2using Jypeli;
3using Jypeli.ScreenObjects;
4using Jypeli.Assets;
5
6public class Peli : PhysicsGame
7{
8    Vector nopeusYlos = new Vector(0, 200);
9    Vector nopeusAlas = new Vector(0, -200);
10
11    PhysicsObject pallo;
12    PhysicsObject alus1;
13    PhysicsObject alus2;
14
15    PhysicsObject vasenReuna;
16    PhysicsObject oikeaReuna;
17    PhysicsObject alaReuna;
18    PhysicsObject ylaReuna;
19
20    IntMeter p1Pisteet;
21    IntMeter p2Pisteet;
22
23    BarGauge p1special;
24    BarGauge p2special;
25   
26    DoubleMeter p1specialTeho;
27    DoubleMeter p2specialTeho;
28
29    Double specialLifeTime = 1;
30
31    Boolean p1specialkentalla = false;
32    Boolean p2specialkentalla = false;
33
34    Timer p1specialTimer;
35    Timer p2specialTimer;
36
37    int specialNopeus = 750;
38
39    Animation alus1_kaasu_tekst;
40    Animation alus2_kaasu_tekst;
41
42    double resolutionX;
43    double resolutionY;
44
45    Timer UpdateTimer;
46    double updateInterval = 0.1;
47
48    int siirtymaLaidassa = 80;
49
50    bool alus1_kaasuttaa = false;
51    bool alus2_kaasuttaa = false;
52
53    int perusAmmusKoko = 3;
54    int AlustenHealth = 10;
55    double alustenIlmanvastus = 0.999;
56
57    protected override void Begin()
58    {
59        AloitaPeli();       
60    }
61    void AloitaPeli()
62    {
63        ClearAll();
64        alus1_kaasuttaa = false;
65        alus2_kaasuttaa = false;
66        p1specialkentalla = false;
67        p2specialkentalla = false;
68        LuoKentta();
69        AsetaOhjaimet();
70        LisaaLaskurit();
71    }
72    void LuoKentta()
73    {
74        TeeAlukset();
75        UpDate(); //tekee ajopisteet ja tutkii ovatko alukset vielä kentällä
76        TeeSpecial(); //tekee special aseet ja lisää kuuntelijat
77        resolutionX = Screen.Width;
78        resolutionY = Screen.Height;
79        TeeReunat();
80        Level.Background.CreateStars(1000);
81        Camera.ZoomToLevel();
82    }
83    void TeeAlukset()
84    {
85        alus1 = LuoAlus(1, Level.Left + 20.0, 0.0);
86        alus1.Tag = "alus1";
87        alus1.Image = LoadImage("alus1");
88
89        Image[] alus_kaasu1 = LoadImages(
90        "alus1",
91        "alus1_kaasuttaa"
92        );
93        alus1_kaasu_tekst = new Animation(alus_kaasu1);
94        alus1_kaasu_tekst.FPS = 10;
95        alus1.Animation = alus1_kaasu_tekst;
96
97        alus1.LinearDamping = alustenIlmanvastus;
98
99        alus2 = LuoAlus(2, Level.Right - 20.0, 0.0);
100        alus2.Tag = "alus2";
101        alus2.Image = LoadImage("alus2");
102
103        Image[] alus_kaasu2 = LoadImages(
104        "alus2",
105        "alus2_kaasuttaa"
106        );
107
108        alus2_kaasu_tekst = new Animation(alus_kaasu2);
109        alus2_kaasu_tekst.FPS = 5;
110        alus2.Animation = alus2_kaasu_tekst;
111        alus2.Angle = Angle.StraightAngle;
112        alus2.LinearDamping = alustenIlmanvastus;
113
114    }
115    void TeeReunat()
116    {
117
118        vasenReuna = PhysicsObject.CreateStaticObject(5, resolutionX + 500);
119        vasenReuna.IgnoresPhysicsLogics = true;
120        vasenReuna.Color = Color.White;
121        vasenReuna.X = -(resolutionX / 2) - 50;
122        vasenReuna.Restitution = 1.0;
123        vasenReuna.IsVisible = true;
124        vasenReuna.Tag = "vasenreuna";
125        vasenReuna.IgnoresCollisionResponse = true;
126        AddCollisionHandler(vasenReuna, ReunaanOsuu);
127        Add(vasenReuna);
128
129        oikeaReuna = PhysicsObject.CreateStaticObject(5, resolutionX + 500);
130        oikeaReuna.IgnoresPhysicsLogics = true;
131        oikeaReuna.Color = Color.White;
132        oikeaReuna.X = (resolutionX / 2) + 50;
133        oikeaReuna.Restitution = 1.0;
134        oikeaReuna.IsVisible = true;
135        oikeaReuna.Tag = "oikeareuna";
136        oikeaReuna.IgnoresCollisionResponse = true;
137        AddCollisionHandler(oikeaReuna, ReunaanOsuu);
138        Add(oikeaReuna);
139
140        ylaReuna = PhysicsObject.CreateStaticObject(resolutionY + 500, 5);
141        ylaReuna.IgnoresPhysicsLogics = true;
142        ylaReuna.Color = Color.White;
143        ylaReuna.Y = (resolutionY / 2) + 50;
144        ylaReuna.Restitution = 0.0;
145        ylaReuna.IsVisible = true;
146        ylaReuna.Tag = "ylareuna";
147        ylaReuna.IgnoresCollisionResponse = true;
148        AddCollisionHandler(ylaReuna, ReunaanOsuu);
149        Add(ylaReuna);
150
151        alaReuna = PhysicsObject.CreateStaticObject(resolutionY + 500, 5);
152        alaReuna.IgnoresPhysicsLogics = true;
153        alaReuna.Color = Color.White;
154        alaReuna.Y = -(resolutionY / 2) - 50;
155        alaReuna.Restitution = 0.0;
156        alaReuna.IsVisible = true;
157        alaReuna.Tag = "alareuna";
158        alaReuna.IgnoresCollisionResponse = true;
159        AddCollisionHandler(alaReuna, ReunaanOsuu);
160        Add(alaReuna);
161    }
162    PhysicsObject LuoAlus(int kumpi, double x, double y)
163    {
164        PhysicsObject alus = new PhysicsObject(30.0, 20.0);
165        alus.Shape = Shapes.Rectangle;
166        alus.X = x;
167        alus.Y = y;
168        alus.Mass = 10;
169        alus.Restitution = 1.0;
170        alus.CanRotate = true;
171        alus.IgnoresCollisionResponse = false;
172        //AddCollisionHandler(alus, AlusOsuu);
173        Add(alus);
174        return alus;
175    }
176    void LisaaLaskurit()
177    {
178        p1Pisteet = LuoPisteLaskuri(Screen.Left + 100.0, Screen.Top - 100.0);
179        p2Pisteet = LuoPisteLaskuri(Screen.Right - 100.0, Screen.Top - 100.0);
180    }
181    IntMeter LuoPisteLaskuri(double x, double y)
182    {
183        IntMeter laskuri = new IntMeter(0);
184        laskuri.MaxValue = AlustenHealth;
185        ValueDisplay naytto = new ValueDisplay();
186        naytto.BindTo(laskuri);
187        naytto.X = x;
188        naytto.Y = y;
189        naytto.ValueColor = Color.White;
190        laskuri.UpperLimit += Voitto;
191
192        Add(naytto);
193        return laskuri;
194    }
195    void AsetaOhjaimet()
196    {
197
198        Keyboard.Listen(Key.A, ButtonState.Down, kaannaVasen, "käännä alusta vasemmalle", alus1,  1);
199        Keyboard.Listen(Key.A, ButtonState.Released, pysaytaPyoriminen, null, alus1, 1);
200        Keyboard.Listen(Key.D, ButtonState.Down, kaannaOikea, "käännä alusta oikealle", alus1, 1);
201        Keyboard.Listen(Key.D, ButtonState.Released, pysaytaPyoriminen, null, alus1, 1);
202        Keyboard.Listen(Key.W, ButtonState.Down, kaasua, "kaasu", alus1, 1);
203        Keyboard.Listen(Key.W, ButtonState.Released, eikaasua, null, alus1, 1);
204        Keyboard.Listen(Key.Tab, ButtonState.Pressed, ammu, null, alus1, 1);
205
206        Keyboard.Listen(Key.Left, ButtonState.Down, kaannaVasen, "käännä alusta vasemmalle", alus2, 1);
207        Keyboard.Listen(Key.Left, ButtonState.Released, pysaytaPyoriminen, null, alus2, 1);
208        Keyboard.Listen(Key.Right, ButtonState.Down, kaannaOikea, "käännä alusta oikealle", alus2, 1);
209        Keyboard.Listen(Key.Right, ButtonState.Released, pysaytaPyoriminen, null, alus2, 1);
210        Keyboard.Listen(Key.Up, ButtonState.Down, kaasua, "kaasu", alus2, 1);
211        Keyboard.Listen(Key.Up, ButtonState.Released, eikaasua, null, alus2, 1);
212        Keyboard.Listen(Key.RightShift, ButtonState.Pressed, ammu, null, alus2, 1);
213
214        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
215        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Poistu");
216        Keyboard.Listen(Key.F2, ButtonState.Pressed, AloitaPeli, "uusi peli");       
217    }   
218    void kaannaVasen(PhysicsObject alus, int nopeus)
219    {
220        alus.AngularVelocity = 4;
221    }
222    void kaannaOikea(PhysicsObject alus, int nopeus)
223    {
224        alus.AngularVelocity = -4;
225    }
226    void pysaytaPyoriminen(PhysicsObject alus, int nopeus)
227    {
228        alus.AngularVelocity = 0;
229    }
230    void kaasua(PhysicsObject alus, int nopeus)
231    {
232        Angle aluksenKulma = alus.Angle;
233        Vector impulssi = Vector.FromLengthAndAngle(2000, aluksenKulma);       
234        double aluksenAste = aluksenKulma.Degree;   
235        alus.Push(impulssi);       
236        alus.Animation.Resume();
237        if (alus.Tag == "alus1")
238        {
239            alus1_kaasuttaa = true;
240        }
241        if (alus.Tag == "alus2")
242        {
243            alus2_kaasuttaa = true;
244        }
245
246    }
247    void eikaasua(PhysicsObject alus, int nopeus)
248    {
249        alus.Animation.Stop();
250        if (alus.Tag == "alus1")
251        {
252            alus1_kaasuttaa = false;
253        }
254        if (alus.Tag == "alus2")
255        {
256            alus2_kaasuttaa = false;
257        }
258    }
259    void ammu(PhysicsObject alus, int nopeus)
260    {
261        PhysicsObject ammus = new PhysicsObject(perusAmmusKoko, perusAmmusKoko);
262        ammus.Shape = Shapes.Circle;
263        ammus.Color = Color.YellowGreen;
264        ammus.X = alus.X;
265        ammus.Y = alus.Y;
266        ammus.IgnoresCollisionResponse = true;
267        ammus.IgnoresExplosions = true;
268        TimeSpan elinaika = new TimeSpan(15000000);
269        ammus.MaximumLifetime = elinaika;
270        ammus.Tag = alus.Tag;
271        AddCollisionHandler(ammus, AmmusOsuu);
272        Add(ammus);
273        Angle aluksenKulma = alus.Angle;
274        Vector impulssi = Vector.FromLengthAndAngle(500, aluksenKulma);
275        ammus.Hit(impulssi);
276    }
277    void AmmusOsuu(PhysicsObject ammus, PhysicsObject kohde)
278    {
279        if (ammus.Tag != kohde.Tag && kohde.Tag != "ajopiste")
280        {   
281            if (ammus.Width != perusAmmusKoko) //jos special
282            {
283                if (kohde.Tag == "alus1")
284                {
285                    rajaytap2Special(p2specialTimer);
286                }
287                else
288                {
289                    rajaytap1Special(p1specialTimer);
290                }
291            }
292            else 
293            {
294                Explosion rajahdys;
295                rajahdys = new Explosion(40);
296                rajahdys.Position = ammus.Position;
297                Add(rajahdys);
298            }
299           
300            if (kohde.Tag == "alus2")
301            {
302                p1Pisteet.Value += (int)(ammus.Width / 3);
303            }
304            else if (kohde.Tag == "alus1")
305            {
306                p2Pisteet.Value += (int)(ammus.Width / 3);
307            }
308            ammus.Destroy();
309        }
310       
311    }
312    void AlusOsuu(PhysicsObject alus, PhysicsObject kohde)
313    {
314       
315    }   
316    void UpDate()
317    {
318        UpdateTimer = new Timer();                     // luodaan uusi ajastin, nimeltä aikaLaskuri
319        UpdateTimer.Interval = updateInterval;                      // ajastukseksi 5 sekuntia
320        UpdateTimer.Trigger += new Timer.TriggerHandler(Paivitys);  //   // asetetaan tapahtuma, kun aikaLaskuri kun 5 sekuntia on kulunut.
321        Add(UpdateTimer);                       // lisätään aikaLaskuri peliin
322        UpdateTimer.Start();                           // käynnistetään aikaLaskuri     
323    }
324    private void Paivitys(Timer sender)
325    {
326        //ovatko alukset kentällä
327        if (alus1.X < (vasenReuna.X - 50))
328        {
329            alus1.X = oikeaReuna.X - siirtymaLaidassa;
330        }
331        if (alus2.X < (vasenReuna.X - 50))
332        {
333            alus2.X = oikeaReuna.X - siirtymaLaidassa;
334        }
335        if (alus1.X > (oikeaReuna.X + 50))
336        {
337            alus1.X = vasenReuna.X + siirtymaLaidassa;
338        }
339        if (alus2.X > (oikeaReuna.X + 50))
340        {
341            alus2.X = vasenReuna.X + siirtymaLaidassa;
342        }
343        if (alus1.Y > (ylaReuna.Y + 50))
344        {
345            alus1.Y = alaReuna.Y + siirtymaLaidassa;
346        }
347        if (alus2.Y > (ylaReuna.Y + 50))
348        {
349            alus2.Y = alaReuna.Y + siirtymaLaidassa;
350        }
351        if (alus1.Y < (alaReuna.Y - 50))
352        {
353            alus1.Y = ylaReuna.Y - siirtymaLaidassa;
354        }
355        if (alus2.Y < (alaReuna.Y - 50))
356        {
357            alus1.Y = ylaReuna.Y - siirtymaLaidassa;
358        }
359
360
361        if (alus1_kaasuttaa) //ajopisteen teko
362        {
363            PhysicsObject piste = teeAjopiste(alus1);
364            Add(piste);
365        }
366        if (alus2_kaasuttaa) //ajopisteen teko
367        {
368            PhysicsObject piste = teeAjopiste(alus2);
369            Add(piste);
370        }
371    }
372    PhysicsObject teeAjopiste(PhysicsObject alus)
373    {
374        PhysicsObject piste = new PhysicsObject(2, 2);
375        piste.Shape = Shapes.Circle;
376        piste.Color = Color.Yellow;piste.IgnoresCollisionResponse = true;
377        piste.Tag = "ajopiste";
378        piste.X = alus.X;
379        piste.Y = alus.Y;
380        TimeSpan elinaika = new TimeSpan(20000000);
381        piste.MaximumLifetime = elinaika;
382        Angle aluksenKulma = alus.Angle + Angle.StraightAngle;
383        Vector impulssi = Vector.FromLengthAndAngle(50, aluksenKulma);
384        piste.Hit(impulssi);
385        return piste;
386    }
387    void ReunaanOsuu(PhysicsObject reuna, PhysicsObject osuja)
388    {
389        if (reuna.Tag == "ylareuna")
390        {
391            osuja.Y = alaReuna.Y + siirtymaLaidassa;
392        }
393
394        if (reuna.Tag == "alareuna")
395        {
396            osuja.Y = ylaReuna.Y - siirtymaLaidassa;
397        }
398        if (reuna.Tag == "vasenreuna")
399        {
400            osuja.X = (oikeaReuna.X - siirtymaLaidassa);
401        }
402
403        if (reuna.Tag == "oikeareuna")
404        {
405            osuja.X = (vasenReuna.X + siirtymaLaidassa);
406        }
407    }
408    void TeeSpecial()
409    {
410        p1specialTimer = new Timer();       
411        p2specialTimer = new Timer();
412
413        Add(p1specialTimer);
414        Add(p2specialTimer);
415       
416        LisaaSpecialOhjaimet();
417        LisaaSpecialMittarit();
418    }
419    void LisaaSpecialOhjaimet()
420    {       
421        Keyboard.Listen(Key.LeftShift, ButtonState.Down, LataaSpecial, "Special lataus", alus1, 1);
422        Keyboard.Listen(Key.LeftShift, ButtonState.Released, LaukaiseSpecial, "laukaise special", alus1, 1);
423        Keyboard.Listen(Key.RightControl, ButtonState.Down, LataaSpecial, "Special lataus", alus2, 1);
424        Keyboard.Listen(Key.RightControl, ButtonState.Released, LaukaiseSpecial, "laukaise special", alus2, 1);
425    }
426    void LisaaSpecialMittarit()
427    {
428        p1specialTeho = new DoubleMeter(perusAmmusKoko + 1);
429        p1specialTeho.MaxValue = 100;
430
431        p2specialTeho = new DoubleMeter(perusAmmusKoko + 1);
432        p2specialTeho.MaxValue = 100;
433       
434        p1special = new BarGauge();
435        p1special.Max = 100;
436        p1special.ValueColor = Color.LightBlue;
437        p1special.BindTo(p1specialTeho);
438        p1special.X = Screen.Left + 100;
439        p1special.Y = Screen.Top - 200;
440        p1special.Width = 40;
441        Add(p1special);
442
443        p2special = new BarGauge();
444        p2special.Max = 100;
445        p2special.ValueColor = Color.LightBlue;
446        p2special.BindTo(p2specialTeho);
447        p2special.X = Screen.Right - 100;
448        p2special.Y = Screen.Top - 200;
449        p2special.Width = 40;
450        Add(p2special);
451    }   
452    void LataaSpecial(PhysicsObject alus, int nopeus)
453    {
454        if (alus.Tag == "alus1" && !p1specialkentalla)
455        {
456            p1specialTeho.Value += 2;
457        }
458        if (alus.Tag == "alus2" && !p2specialkentalla)
459        {
460            p2specialTeho.Value += 2;
461        }
462
463    }
464    void LaukaiseSpecial(PhysicsObject alus, int nopeus)
465    {
466        if (alus.Tag == "alus1" && !p1specialkentalla)
467        {
468            PhysicsObject ammus = new PhysicsObject((p1specialTeho / 2), (p1specialTeho / 2));
469            ammus.Shape = Shapes.Circle;
470            ammus.Color = Color.LightBlue;
471            ammus.X = alus.X;
472            ammus.Y = alus.Y;
473            ammus.IgnoresCollisionResponse = true;           
474            ammus.Tag = alus.Tag;
475            AddCollisionHandler(ammus, AmmusOsuu);
476            ammus.Image = LoadImage("special");
477            ammus.CanRotate = true;
478            ammus.AngularVelocity = 3;
479            Add(ammus);
480            Angle aluksenKulma = alus.Angle;
481            Vector impulssi = Vector.FromLengthAndAngle(specialNopeus, aluksenKulma);
482            ammus.Hit(impulssi);
483            p1specialkentalla = true;
484            p1specialTimer.Tag = ammus;
485            p1specialTimer.Interval = specialLifeTime;
486            p1specialTimer.Trigger += new Timer.TriggerHandler(rajaytap1Special);  //   // asetetaan tapahtuma, kun aikaLaskuri kun 5 sekuntia on kulunut.           
487            p1specialTimer.Start();
488            p1specialTeho.Value = 1;
489        }
490        if (alus.Tag == "alus2" && !p2specialkentalla)
491        {
492            PhysicsObject ammus = new PhysicsObject((p2specialTeho / 2), (p2specialTeho / 2));
493            ammus.Shape = Shapes.Circle;
494            ammus.Color = Color.LightBlue;
495            ammus.X = alus.X;
496            ammus.Y = alus.Y;
497            ammus.IgnoresCollisionResponse = true;
498            TimeSpan elinaika = TimeSpan.FromSeconds(specialLifeTime);
499            ammus.MaximumLifetime = elinaika;
500            ammus.Tag =alus.Tag;
501            AddCollisionHandler(ammus, AmmusOsuu);
502            ammus.Image = LoadImage("special");
503            ammus.CanRotate = true;
504            ammus.AngularVelocity = 3;
505            Add(ammus);
506            Angle aluksenKulma = alus.Angle;
507            Vector impulssi = Vector.FromLengthAndAngle(specialNopeus, aluksenKulma);
508            ammus.Hit(impulssi);
509            p2specialkentalla = true;
510            p2specialTimer.Tag = ammus;
511            p2specialTimer.Interval = specialLifeTime;
512            p2specialTimer.Trigger += new Timer.TriggerHandler(rajaytap2Special);  //   // asetetaan tapahtuma, kun aikaLaskuri kun 5 sekuntia on kulunut.           
513            p2specialTimer.Start();
514            p2specialTeho.Value = 1;           
515        }
516    }
517    private void rajaytap1Special(Timer sender)
518    { 
519        PhysicsObject ammus = (PhysicsObject)sender.Tag;
520        Explosion jysays = new Explosion(ammus.Width * 3);
521        jysays.Position = ammus.Position;
522        jysays.Force = 100;
523        Add(jysays);
524        ammus.Destroy();     
525        sender.Stop();       
526        p1specialkentalla = false;
527    }
528    private void rajaytap2Special(Timer sender)
529    {
530        PhysicsObject ammus = (PhysicsObject)sender.Tag;       
531        Explosion jysays = new Explosion(ammus.Width * 3);
532        jysays.Position = ammus.Position;
533        jysays.Force = 100;
534        Add(jysays);
535        ammus.Destroy();
536        sender.Stop();
537        p2specialkentalla = false;   
538    }
539    void Voitto(int laskuri)
540    {
541        if (p1Pisteet.Value >= AlustenHealth)
542        {
543            MessageDisplay.TextColor = Color.White;
544            MessageDisplay.Add("Pelaaja 1 voitti pelin.");
545        }
546        if (p2Pisteet.Value >= AlustenHealth)
547        {
548            MessageDisplay.TextColor = Color.White;
549            MessageDisplay.Add("Pelaaja 2 voitti pelin.");
550        }       
551    }
552}
Note: See TracBrowser for help on using the repository browser.