source: 2011/31/AleksiK/WorkingTitle/WorkingTitle/Peli.cs @ 2525

Revision 2525, 18.6 KB checked in by alkivima, 8 years ago (diff)

Talletus.

Line 
1using System;
2using Jypeli;
3using Jypeli.Widgets;
4using Jypeli.Assets;
5using Jypeli.Effects;
6using Physics2DDotNet.Ignorers;
7using System.Collections.Generic;
8
9
10public class Peli : TopDownPhysicsGame
11{
12    PhysicsObject vasenReuna;
13    PhysicsObject oikeaReuna;
14    DoubleMeter voimaMittari1;
15    DoubleMeter voimaMittari2;
16    Automobile auto1;
17    Automobile auto2;
18    IntMeter pelaajan1Pisteet;
19    IntMeter pelaajan2Pisteet;
20    Label aikaNaytto;
21
22    AssaultRifle pyssy1;
23    AssaultRifle pyssy2;
24
25    Image auto1Kuva = LoadImage("PunAuto");
26    Image auto2Kuva = LoadImage("SinAuto");
27    Image[] auto1Ampuu = LoadImages("PunAuto", "PunAutoAmpuu", "PunAuto", "PunAutoAmpuu", "PunAuto");
28    Image[] auto2Ampuu = LoadImages("SinAuto", "SinAutoAmpuu", "SinAuto", "SinAutoAmpuu", "SinAuto");
29    Image kiwi = LoadImage("tiili");
30
31    Image rapa = LoadImage("mud");
32
33    Image kentta = LoadImage("sand");
34
35    Image raja = LoadImage("stone");
36
37    List<Label> valikonKohdat;
38
39    const int MontakoPistettaVoittoon = 3;
40
41
42    public override void Begin()
43    {
44        KineticFriction = 0.5;
45
46        Valikko();
47    }
48
49    void Autot(int auto)
50    {
51
52        if (auto == 1)
53        {
54            auto1 = new Automobile(50, 27.5);
55            auto1.CollisionIgnorer = new ObjectIgnorer();
56            auto1.Mass = 100.0;
57            auto1.Color = new Color(1, 1, 1);
58            auto1.X = -300;
59            auto1.Y = 0;
60            auto1.LinearDamping = 0.975;
61            auto1.AngularDamping = 0.1;
62            auto1.CanRotate = false;
63            auto1.Acceleration = 625;
64            auto1.Image = auto1Kuva;
65            auto1.Animation = new Animation(auto1Ampuu);
66            pyssy1 = new AssaultRifle(20, 5);
67            pyssy1.Tag = "ase";
68            pyssy1.TimeBetweenUse = TimeSpan.FromMilliseconds(70);
69            pyssy1.IsVisible = false;
70            pyssy1.Ammo.Value = 9999;
71            auto1.Add(pyssy1);
72
73        }
74        else
75        {
76            auto2 = new Automobile(50, 27.5);
77            auto2.CollisionIgnorer = new ObjectIgnorer();
78            auto2.Mass = 50.0;
79            auto2.Color = new Color(255, 255, 255);
80            auto2.X = 300;
81            auto2.Y = 0;
82            auto2.LinearDamping = 0.975;
83            auto2.AngularDamping = 0.1;
84            auto2.Angle = Angle.FromDegrees(180.0);
85            auto2.CanRotate = false;
86            auto2.Acceleration = 625;
87            auto2.Image = auto2Kuva;
88            auto2.Animation = new Animation(auto2Ampuu);
89            pyssy2 = new AssaultRifle(20, 5);
90            pyssy2.Tag = "ase";
91            pyssy2.TimeBetweenUse = TimeSpan.FromMilliseconds(70);
92            pyssy2.IsVisible = false;
93            pyssy2.Ammo.Value = 9999;
94            auto2.Add(pyssy2);
95        }
96       
97   
98    }
99
100    void Valikko()
101    {
102        ClearAll();
103        valikonKohdat = new List<Label>();
104
105        Label kohta1 = new Label("Aloita");
106        kohta1.Position = new Vector(0, 40);
107        valikonKohdat.Add(kohta1);
108
109        Label kohta2 = new Label("Lopeta");
110        kohta2.Position = new Vector(0, -40);
111        valikonKohdat.Add(kohta2);
112
113        foreach (Label valikonKohta in valikonKohdat)
114        {
115            Add(valikonKohta);
116        }
117
118        Mouse.ListenOn(kohta1, MouseButton.Left, ButtonState.Pressed, AloitaPeli, null);
119        Mouse.ListenOn(kohta2, MouseButton.Left, ButtonState.Pressed, Lopeta, null);
120
121        Mouse.IsCursorVisible = true;
122        Mouse.ListenMovement(1.0, ValikossaLiikkuminen, null);
123        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Lopeta, "Lopeta");
124    }
125
126    void ValikossaLiikkuminen(AnalogState hiirenTila)
127    {
128        foreach (Label kohta in valikonKohdat)
129        {
130            if (Mouse.IsCursorOn(kohta))
131            {
132                kohta.TextColor = Color.Red;
133            }
134            else
135            {
136                kohta.TextColor = Color.Black;
137            }
138
139        }
140    }
141
142    void AloitaPeli()
143    {
144        ClearAll();
145        Autot(1);
146        Autot(2);
147        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Valikko, "Palaa valikkoon");
148
149        AddCollisionHandler(auto1, KasitteleAuto1Tormays);
150        AddCollisionHandler(auto2, KasitteleAuto2Tormays);
151
152        AsetaOhjaimet();
153
154        Add(auto1, 0);
155        Add(auto2, 0);
156
157        Kentta();
158
159        HPmittarit();
160
161        LisaaLaskurit();
162
163    }
164
165    void Lopeta()
166    {
167        Exit();
168    }
169
170
171    void AsetaOhjaimet()
172    {
173        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
174        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Poistu pelistä");
175        Keyboard.Listen(Key.W, ButtonState.Down, kiihdyta, "Kiihdytä", auto1);
176        Keyboard.Listen(Key.S, ButtonState.Down, jarruta, "Jarruta", auto1);
177        Keyboard.Listen(Key.A, ButtonState.Down, kaanny, "Käänny vasemmalle", auto1, 2.0);
178        Keyboard.Listen(Key.D, ButtonState.Down, kaanny, "Käänny oikealle", auto1, -2.0);
179        Keyboard.Listen(Key.LeftControl, ButtonState.Pressed, AloitaAmpuminen, null, auto1, pyssy1);
180        Keyboard.Listen(Key.LeftControl, ButtonState.Down, AmmuAseella, "Ammu", auto1, pyssy1);
181        Keyboard.Listen(Key.LeftControl, ButtonState.Released, LopetaAmpuminen, null, auto1, pyssy1);
182
183        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
184        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Poistu pelistä");
185        Keyboard.Listen(Key.Up, ButtonState.Down, kiihdyta, "Kiihdytä", auto2);
186        Keyboard.Listen(Key.Down, ButtonState.Down, jarruta, "Jarruta", auto2);
187        Keyboard.Listen(Key.Left, ButtonState.Down, kaanny, "Käänny vasemmalle", auto2, 2.0);
188        Keyboard.Listen(Key.Right, ButtonState.Down, kaanny, "Käänny oikealle", auto2, -2.0);
189        Keyboard.Listen(Key.RightControl, ButtonState.Pressed, AloitaAmpuminen, null, auto2, pyssy2);
190        Keyboard.Listen(Key.RightControl, ButtonState.Down, AmmuAseella, "Ammu", auto2, pyssy2);
191        Keyboard.Listen(Key.RightControl, ButtonState.Released, LopetaAmpuminen, null, auto2, pyssy2);
192    }
193
194    void kiihdyta(Automobile auto)
195    {
196        auto.Accelerate(Time.SinceLastUpdate.TotalSeconds);
197    }
198
199    void jarruta(Automobile auto)
200    {
201        auto.Brake(Time.SinceLastUpdate.TotalSeconds);
202    }
203
204    void kaanny(Automobile auto, double kaannos)
205    {
206        auto.Angle = Angle.FromDegrees(auto.Angle.Degrees + kaannos * 1.7);
207    }
208
209    void Rapaa()
210    {
211        ButtonState rapa1 = Keyboard.GetKeyState(Key.W);
212        ButtonState rapa2 = Keyboard.GetKeyState(Key.Up);
213
214        if (rapa1 == ButtonState.Down)
215        {
216            Smoke kura = new Smoke();
217            kura.ParticleImage = rapa;
218            kura.Position = auto1.Position + Vector.FromLengthAndAngle(25, (auto1.Angle + Angle.FromDegrees(180)));
219            kura.MaximumLifetime = new TimeSpan(0, 0, 0, 2, 0);
220            kura.Angle = auto1.Angle + Angle.FromDegrees(180);
221            kura.FadeOut(1.5);
222            //new TimeSpan(0,0,0,1,0);
223            Add(kura);
224        }
225
226        if (rapa2 == ButtonState.Down)
227        {
228            Smoke kura1 = new Smoke();
229            kura1.ParticleImage = rapa;
230            kura1.Position = auto2.Position + Vector.FromLengthAndAngle(25, (auto2.Angle + Angle.FromDegrees(180)));
231            kura1.MaximumLifetime = new TimeSpan(0, 0, 0, 2, 0);
232            kura1.Angle = auto2.Angle + Angle.FromDegrees(180);
233            kura1.FadeOut(1.5);
234            //new TimeSpan(0,0,0,1,0);
235            Add(kura1);
236        }
237
238    }
239
240    void Kentta()
241    {
242        Mouse.IsCursorVisible = false;
243
244        //Wind = new Vector(75, 100);
245
246        Timer ajastin = new Timer();
247        ajastin.Interval = 0.08;
248        ajastin.Timeout += Rapaa;
249        ajastin.Start();
250
251
252        PhysicsObject maata = PhysicsObject.CreateStaticObject(150.0, 50.0);
253        maata.Shape = Shape.Rectangle;
254        maata.Color = Color.DarkGray;
255        maata.X = 0;
256        maata.Y = 0;
257        maata.Restitution = 0.2;
258        maata.Tag = "pylvas"; Add(maata, -1);
259
260        maata.Angle = Angle.FromDegrees(330.0);
261
262        PhysicsObject pylvas1 = PhysicsObject.CreateStaticObject(150.0, 50.0);
263        pylvas1.Shape = Shape.Rectangle;
264        pylvas1.X = -200;
265        pylvas1.Y = 270;
266        pylvas1.Restitution = 0.2;
267        pylvas1.Tag = "pylvas";
268        pylvas1.Color = Color.DarkGray;
269        Add(pylvas1, -1);
270
271        pylvas1.Angle = Angle.FromDegrees(150.0);
272
273        PhysicsObject pylvas2 = PhysicsObject.CreateStaticObject(150.0, 50.0);
274        pylvas2.Shape = Shape.Rectangle;
275        pylvas2.X = -330;
276        pylvas2.Y = 175;
277        pylvas2.Restitution = 0.2;
278        pylvas2.Tag = "pylvas";
279        pylvas2.Color = Color.DarkGray;
280        Add(pylvas2, -1);
281
282        pylvas2.Angle = Angle.FromDegrees(200.0);
283
284        PhysicsObject pylvas3 = PhysicsObject.CreateStaticObject(150.0, 50.0);
285        pylvas3.Shape = Shape.Rectangle;
286        pylvas3.X = -350;
287        pylvas3.Y = -110;
288        pylvas3.Restitution = 0.2;
289        pylvas3.Tag = "pylvas";
290        pylvas3.Color = Color.DarkGray;
291        Add(pylvas3, -1);
292
293        pylvas3.Angle = Angle.FromDegrees(130.0);
294
295        PhysicsObject pylvas4 = PhysicsObject.CreateStaticObject(150.0, 50.0);
296        pylvas4.Shape = Shape.Rectangle;
297        pylvas4.X = 250;
298        pylvas4.Y = -200;
299        pylvas4.Restitution = 0.2;
300        pylvas4.Tag = "pylvas";
301        pylvas4.Color = Color.DarkGray;
302        Add(pylvas4, -1);
303
304        pylvas4.Angle = Angle.FromDegrees(200.0);
305
306        PhysicsObject pylvas5 = PhysicsObject.CreateStaticObject(150.0, 50.0);
307        pylvas5.Shape = Shape.Rectangle;
308        pylvas5.X = -275;
309        pylvas5.Y = -270;
310        pylvas5.Restitution = 0.2;
311        pylvas5.Tag = "pylvas";
312        pylvas5.Color = Color.DarkGray;
313        Add(pylvas5, -2);
314
315        pylvas5.Angle = Angle.FromDegrees(40.0);
316
317        PhysicsObject pylvas6 = PhysicsObject.CreateStaticObject(150.0, 50.0);
318        pylvas6.Shape = Shape.Rectangle;
319        pylvas6.X = 325;
320        pylvas6.Y = 222;
321        pylvas6.Restitution = 0.2;
322        pylvas6.Tag = "pylvas";
323        pylvas6.Color = Color.DarkGray;
324        Add(pylvas6, -1);
325
326        pylvas6.Angle = Angle.FromDegrees(330.0);
327
328        vasenReuna = Level.CreateLeftBorder();
329        vasenReuna.Restitution = 0.3;
330        vasenReuna.IsVisible = true;
331        vasenReuna.Image = raja;
332
333        oikeaReuna = Level.CreateRightBorder();
334        oikeaReuna.Restitution = 0.3;
335        oikeaReuna.IsVisible = true;
336        oikeaReuna.Image = raja;
337
338        PhysicsObject ylaReuna = Level.CreateTopBorder();
339        ylaReuna.Restitution = 0.3;
340        ylaReuna.IsVisible = true;
341        ylaReuna.Image = raja;
342
343        PhysicsObject alaReuna = Level.CreateBottomBorder();
344        alaReuna.Restitution = 0.3;
345        alaReuna.IsVisible = true;
346        alaReuna.Image = raja;
347
348        Level.BackgroundColor = Color.ForestGreen;
349
350        Level.Background.Image = kentta;
351
352        Camera.X = 0.0;
353        Camera.Y = 0.0;
354        Camera.ZoomFactor = 1.1;
355
356        pylvas1.Image = kiwi;
357        pylvas2.Image = kiwi;
358        pylvas3.Image = kiwi;
359        pylvas4.Image = kiwi;
360        pylvas5.Image = kiwi;
361        pylvas6.Image = kiwi;
362        maata.Image = kiwi;
363
364    }
365
366    // Käsittelee mlempien pelaajien kuolemat
367    void PelaajaTuhoutuu(Automobile auto)
368    {
369         if (voimaMittari1.Value <= 0)
370        {
371        Explosion rajahdys1 = new Explosion(200);
372        rajahdys1.Position = auto1.Position;
373        rajahdys1.Speed = 500.0;
374        rajahdys1.Force = 3000;
375        Add(rajahdys1);
376        }
377         
378        if (voimaMittari2.Value <= 0)
379         {
380             Explosion rajahdys2 = new Explosion(200);
381             rajahdys2.Position = auto2.Position;
382             rajahdys2.Speed = 500.0;
383             rajahdys2.Force = 3000;
384             Add(rajahdys2);
385         }
386        auto.Destroy();
387        if (auto == auto1) pelaajan2Pisteet.Value += 1; else pelaajan1Pisteet.Value += 1;
388        if (pelaajan1Pisteet.Value >= pelaajan1Pisteet.MaxValue || pelaajan2Pisteet >= pelaajan2Pisteet.MaxValue) return;
389        UusiEra();     
390    }
391
392    void Voitto(Automobile auto)
393    {
394        if (auto == auto1)
395        {
396            MessageDisplay.Add("Punainen Voitti!");
397            MessageDisplay.TextColor = Color.Pink;
398            MessageDisplay.X = 560.0;
399            MessageDisplay.Y = 470.0;
400
401        }
402        else
403        {
404            MessageDisplay.Add("Sininen Voitti!");
405            MessageDisplay.TextColor = Color.Cyan;
406            MessageDisplay.X = 565.0;
407            MessageDisplay.Y = 520.0;
408        }
409
410        Loppui();
411        Remove(auto1);
412        Remove(auto2);
413    }
414
415    void HPmittarit()
416    {
417        voimaMittari1 = new DoubleMeter(40);
418        voimaMittari1.MaxValue = 40;
419        voimaMittari1.MinValue = 0;
420        voimaMittari1.LowerLimit += delegate { PelaajaTuhoutuu(auto1); };
421
422        BarGauge voimaPalkki = new BarGauge(10, 150);
423        voimaPalkki.BindTo(voimaMittari1);
424        voimaPalkki.X = (0.95 * Screen.LeftSafe);
425        voimaPalkki.Y = (0.05 * Screen.Height);
426        Add(voimaPalkki);
427
428        voimaMittari2 = new DoubleMeter(40);
429        voimaMittari2.MaxValue = 40;
430        voimaMittari2.MinValue = 0;
431        voimaMittari2.LowerLimit += delegate { PelaajaTuhoutuu(auto2); };
432        BarGauge voimaPalkki2 = new BarGauge(10, 150);
433        voimaPalkki2.BindTo(voimaMittari2);
434        voimaPalkki2.X = (0.95 * Screen.RightSafe);
435        voimaPalkki2.Y = (0.05 * Screen.Height);
436        voimaPalkki2.BarColor = Color.Blue;
437        Add(voimaPalkki2);
438    }
439    void KasitteleAuto1Tormays(PhysicsObject auto1, PhysicsObject kohde)
440    {
441
442        if (auto1.Velocity.Magnitude > 300)
443        {
444            voimaMittari1.Value--;
445        }
446
447        if (auto2.Velocity.Magnitude > auto1.Velocity.Magnitude)
448        {
449            voimaMittari1.Value--;
450        }
451    }
452    void KasitteleAuto2Tormays(PhysicsObject auto2, PhysicsObject kohde)
453    {
454
455        if (auto2.Velocity.Magnitude > 300)
456        {
457            voimaMittari2.Value--;
458        }
459
460        if (auto1.Velocity.Magnitude > auto2.Velocity.Magnitude)
461        {
462            voimaMittari2.Value--;
463        }
464    }
465    void LisaaLaskurit()
466    {
467        pelaajan1Pisteet = LuoPisteLaskuri(-605.0, 150.0);
468        pelaajan1Pisteet.UpperLimit += delegate { Voitto(auto1); };
469        pelaajan2Pisteet = LuoPisteLaskuri(605.0, 150.0);
470        pelaajan2Pisteet.UpperLimit += delegate { Voitto(auto2); };
471    }
472    IntMeter LuoPisteLaskuri(double x, double y)
473    {
474        IntMeter laskuri = new IntMeter(0);
475        laskuri.MaxValue = MontakoPistettaVoittoon;
476        Label naytto = new Label();
477        naytto.BindTo(laskuri);
478        naytto.X = x;
479        naytto.Y = y;
480        naytto.TextColor = Color.White;
481        Add(naytto);
482        return laskuri;
483    }
484    void UusiEra()
485    {
486        //ClearControls();
487
488        voimaMittari1.Value = 40;
489        voimaMittari2.Value = 40;
490
491
492
493        Aftermath();
494
495    }
496
497    void AloitaAmpuminen(Automobile auto, Weapon ase)
498    {
499        if (auto == auto1)
500        {
501            auto1.Animation.Start();
502        }
503        else
504        {
505
506            auto2.Animation.Start();
507        }
508    }
509
510    void LopetaAmpuminen(Automobile auto, Weapon ase)
511    {
512        if (auto == auto1)
513        {
514            auto1.Animation.Stop();
515        }
516        else
517        {
518            auto2.Animation.Stop();
519        }
520
521    }
522
523    void AmmuAseella(Automobile auto, Weapon ase)
524    {
525        PhysicsObject ammus = ase.Shoot();
526
527        if (ammus != null)
528        {
529            ammus.CollisionIgnorer = auto.CollisionIgnorer;
530            ammus.Size *= 0.5;
531            AddCollisionHandler(ammus, AmmusOsui);
532        }
533    }
534
535    void AmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
536    {
537        ammus.Destroy();
538
539        if (kohde == auto1)
540        {
541            voimaMittari1.Value--;
542            return;
543        }
544        if (kohde == auto2)
545        {
546            voimaMittari2.Value--;
547            return;
548        }
549    }
550
551    void Aftermath()
552    {       
553        Timer jalkiaika = new Timer();
554        jalkiaika.Interval = 3;
555        jalkiaika.Timeout += EranAlku;
556        jalkiaika.Start(1);
557    }
558    void EranAlku()
559    {
560   
561        Add(auto1, 0);
562        Add(auto2, 0);
563
564        auto1.X = -300;
565        auto1.Y = 0;
566        auto2.X = 300;
567        auto2.Y = 0;
568
569        auto1.Angle = new Angle();
570        auto2.Angle = Angle.FromDegrees(180.0);
571
572        auto1.Stop();
573        auto2.Stop();
574
575        auto1.Animation.Stop();
576        auto2.Animation.Stop();
577
578        ClearControls();
579
580        MessageDisplay.Clear();
581       
582        Timer aikaLaskuri = new Timer();
583        aikaLaskuri.Interval = 3;
584        aikaLaskuri.Trigger += AikaLoppui;
585        aikaLaskuri.Start();
586
587        aikaNaytto = new Label();
588        aikaNaytto.TextColor = Color.White;
589        aikaNaytto.X = 0.0;
590        aikaNaytto.Y = 0.0;
591        aikaNaytto.DecimalPlaces = 1;
592        aikaNaytto.BindTo(aikaLaskuri.SecondCounter);
593        Add(aikaNaytto);
594
595        pyssy1.Ammo.Value = 9999;
596        pyssy2.Ammo.Value = 9999;
597
598        auto1.Angle = new Angle();
599        auto2.Angle = Angle.FromDegrees(180.0);
600
601        auto1.Stop();
602        auto2.Stop();
603    }
604
605    void AikaLoppui(Timer ajastin)
606    {
607        if (auto1.IsDestroyed)
608        {
609            Autot(1);
610            Add(auto1, 0);
611        }
612        if (auto2.IsDestroyed)
613        {
614            Autot(2);
615            Add(auto2, 0);
616        }
617
618        auto1.Animation.Stop();
619        auto2.Animation.Stop();
620
621        auto1.X = -300;
622        auto1.Y = 0;
623        auto2.X = 300;
624        auto2.Y = 0;
625
626        MessageDisplay.Add("Start!");
627        MessageDisplay.TextColor = Color.White;
628        MessageDisplay.X = 610.0;
629        MessageDisplay.Y = 500.0;
630        ajastin.Stop();
631        ajastin.Reset();
632        ajastin.Stop();
633        aikaNaytto.Destroy();
634        AsetaOhjaimet();
635
636        pyssy1.Ammo.Value = 9999;
637        pyssy2.Ammo.Value = 9999;
638    }
639
640    void Loppui()
641    {
642        Remove(auto1);
643        Remove(auto2);
644        Timer lopunLaskuri = new Timer();
645        lopunLaskuri.Interval = 3;
646        lopunLaskuri.Trigger += PeliLoppui;
647        lopunLaskuri.Start();
648    }
649    void PeliLoppui(Timer ajastin)
650    {
651        Valikko();
652        Level.BackgroundColor = Color.LightBlue;
653    }
654}
Note: See TracBrowser for help on using the repository browser.