source: 2013/23/Jon-ErikK/magnetaa.cs @ 3976

Revision 3976, 19.5 KB checked in by josaklin, 10 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9public class magnetaa : PhysicsGame
10{   
11    IntMeter pelaaja1Elamat;
12    IntMeter pelaaja2Elamat;
13
14    Pelaaja pelaaja1;   
15    Pelaaja pelaaja2;
16
17    PhysicsObject ylaraja;
18    PhysicsObject alaraja;
19    PhysicsObject oikearaja;
20    PhysicsObject vasenraja;
21
22    List<Ammus> ammukset;
23
24    Vector ylos = new Vector(0, 100);
25    Vector alas = new Vector(0, -100);
26    Vector oikea = new Vector(100, 0);
27    Vector vasen = new Vector(-100, 0);
28   
29    public override void Begin()
30    {
31        ammukset = new List<Ammus>();
32
33        luoKentta(-300,0,300,0,new Vector(0,1), new Vector(0,-1));
34        asetaNappaimet();
35    }
36
37   //pelikentän säätäminen alkaa
38
39    public void uusiPeli()
40    {
41        ClearAll();
42        Begin();
43    }
44   
45    public void luoKentta(double pelaaja1x, double pelaaja1y, double pelaaja2x, double pelaaja2y, Vector alkusuunta1, Vector alkusuunta2) {
46
47        luoKentanOsat();
48       
49        pelaaja1 = luoPelaaja(pelaaja1x, pelaaja1y, alkusuunta1, 1);
50        pelaaja2 = luoPelaaja(pelaaja2x, pelaaja2y, alkusuunta2, 2);
51
52    }
53
54    public void luoKentanOsat()
55    {
56        Level.BackgroundColor = Color.Black;
57
58        luoTausta();
59        luoKentanReunat();
60        luoLaskurit();
61
62    }
63
64    public void luoKentanReunat()
65    {
66        alaraja = Level.CreateBottomBorder();
67        alaraja.Color = Color.Charcoal;
68
69        ylaraja = Level.CreateTopBorder();
70        ylaraja.Color = Color.Charcoal;
71
72        oikearaja = Level.CreateRightBorder();
73        oikearaja.Color = Color.Charcoal;
74
75        vasenraja = Level.CreateLeftBorder();
76        vasenraja.Color = Color.Charcoal;
77
78
79    }
80
81    public void luoTausta()
82    {
83        GameObject sivusuorakulmio1 = new GameObject(300, Screen.Height);
84        sivusuorakulmio1.Color = Color.Charcoal;
85        sivusuorakulmio1.X = -650;
86        sivusuorakulmio1.Y = 0;
87
88        GameObject sivusuorakulmio2 = new GameObject(300, Screen.Height);
89        sivusuorakulmio2.Color = Color.Charcoal;
90        sivusuorakulmio2.X = 650;
91        sivusuorakulmio2.Y = 0;
92
93        Add(sivusuorakulmio1);
94        Add(sivusuorakulmio2);
95
96        GameObject tasoOikea = new GameObject(300, Level.Height);
97        tasoOikea.Shape = Shape.Rectangle;
98        tasoOikea.X =Level.Right-150;
99        tasoOikea.Y = 0;
100        tasoOikea.Color = Color.Silver;
101
102        GameObject tasoVasen = new GameObject(300, Level.Height);
103        tasoVasen.Shape = Shape.Rectangle;
104        tasoVasen.X = Level.Left+150;
105        tasoVasen.Y = 0;
106        tasoVasen.Color = Color.Silver;
107
108        Add(tasoOikea,-3);
109        Add(tasoVasen,-3);
110    }
111
112    public void luoLaskurit()
113    {
114        pelaaja1Elamat = new IntMeter(5);
115        Label pistenaytto1 = new Label();
116        pistenaytto1.X = Screen.Left + 100;
117        pistenaytto1.Y = Screen.Top - 130;
118        pistenaytto1.Color = Color.Charcoal;
119        pistenaytto1.TextColor = Color.White;
120
121        pistenaytto1.BindTo(pelaaja1Elamat);
122
123        pelaaja2Elamat = new IntMeter(5);
124        Label pistenaytto2 = new Label();
125        pistenaytto2.X = Screen.Right - 100;
126        pistenaytto2.Y = Screen.Top - 130;
127        pistenaytto2.Color = Color.Charcoal;
128        pistenaytto2.TextColor = Color.White;
129
130        pistenaytto2.BindTo(pelaaja2Elamat);
131
132        Add(pistenaytto1);
133        Add(pistenaytto2);
134
135        Label pelaajan1 = luoTekstillinenLabel(Color.White, "Pelaajan 1 elamat");
136        pelaajan1.X = Screen.Left + 110;
137        pelaajan1.Y = Screen.Top - 100;
138
139        Label pelaajan2 = luoTekstillinenLabel(Color.White, "Pelaajan 2 elamat");
140        pelaajan2.X = Screen.Right - 110;
141        pelaajan2.Y = Screen.Top - 100;
142
143        Add(pelaajan1);
144        Add(pelaajan2);
145
146    }
147
148    public Label luoTekstillinenLabel(Color tekstinVari, String teksti)
149    {
150        Label tekstikentta = new Label();
151        tekstikentta.Text = teksti;
152        tekstikentta.TextColor = tekstinVari;
153
154        return tekstikentta;
155    }
156
157    public Pelaaja luoPelaaja(double x, double y, Vector alkusuunta, int numero) {
158
159        Pelaaja pelaaja = new Pelaaja(x, y, alkusuunta, numero);
160
161        Add(pelaaja);
162
163        return pelaaja;
164    }
165
166    //pelikentän säätö loppuu
167
168    //Näppäimistön asetus
169   
170    public void asetaNappaimet() {
171
172        Keyboard.Listen(Key.W, ButtonState.Down, asetaPelaajanSuuntaJaNopeus, null, pelaaja1, ylos);
173        Keyboard.Listen(Key.W, ButtonState.Released, asetaPelaajanSuuntaJaNopeus, null, pelaaja1, Vector.Zero);
174        Keyboard.Listen(Key.S, ButtonState.Down, asetaPelaajanSuuntaJaNopeus, null, pelaaja1, alas);
175        Keyboard.Listen(Key.S, ButtonState.Released, asetaPelaajanSuuntaJaNopeus, null, pelaaja1, Vector.Zero);
176        Keyboard.Listen(Key.A, ButtonState.Down, asetaPelaajanSuuntaJaNopeus, null, pelaaja1, vasen);
177        Keyboard.Listen(Key.A, ButtonState.Released, asetaPelaajanSuuntaJaNopeus, null, pelaaja1, Vector.Zero);
178        Keyboard.Listen(Key.D, ButtonState.Down, asetaPelaajanSuuntaJaNopeus, null, pelaaja1, oikea);
179        Keyboard.Listen(Key.D, ButtonState.Released, asetaPelaajanSuuntaJaNopeus, null, pelaaja1, Vector.Zero);
180
181        Keyboard.Listen(Key.Space, ButtonState.Pressed, ammu, null, pelaaja1);
182        Keyboard.Listen(Key.LeftShift, ButtonState.Pressed, vaihdaMagneettisuus, null, pelaaja1);
183        Keyboard.Listen(Key.Q, ButtonState.Pressed, luoTorni, null, pelaaja1);
184       
185        Keyboard.Listen(Key.Up, ButtonState.Down, asetaPelaajanSuuntaJaNopeus, null, pelaaja2, ylos);
186        Keyboard.Listen(Key.Up, ButtonState.Released, asetaPelaajanSuuntaJaNopeus, null, pelaaja2, Vector.Zero);
187        Keyboard.Listen(Key.Down, ButtonState.Down, asetaPelaajanSuuntaJaNopeus, null, pelaaja2, alas);
188        Keyboard.Listen(Key.Down, ButtonState.Released, asetaPelaajanSuuntaJaNopeus, null, pelaaja2, Vector.Zero);
189        Keyboard.Listen(Key.Left, ButtonState.Down, asetaPelaajanSuuntaJaNopeus, null, pelaaja2, vasen);
190        Keyboard.Listen(Key.Left, ButtonState.Released, asetaPelaajanSuuntaJaNopeus, null, pelaaja2, Vector.Zero);
191        Keyboard.Listen(Key.Right, ButtonState.Down, asetaPelaajanSuuntaJaNopeus, null, pelaaja2, oikea);
192        Keyboard.Listen(Key.Right, ButtonState.Released, asetaPelaajanSuuntaJaNopeus, null, pelaaja2, Vector.Zero);
193
194        Keyboard.Listen(Key.Period, ButtonState.Pressed, ammu, null, pelaaja2);
195        Keyboard.Listen(Key.Comma, ButtonState.Pressed, vaihdaMagneettisuus, null, pelaaja2);
196        Keyboard.Listen(Key.M, ButtonState.Pressed, luoTorni, null, pelaaja2);
197
198
199
200        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
201
202    }
203
204    //Näppäimistön asetus loppuu
205
206    //Pelaajan ja ammuksen nopeuksien asettaminen
207
208    public void asetaPelaajanSuuntaJaNopeus(Pelaaja pelaaja, Vector nopeus)
209    {
210        if (nopeus != Vector.Zero)
211        {
212            Vector apuyksikkovektori = new Vector(nopeus.X, nopeus.Y);
213            apuyksikkovektori = apuyksikkovektori.Normalize();
214
215
216
217            maaritaPelaajanAmmuksenSuunta(apuyksikkovektori, pelaaja);
218        } 
219
220        pelaaja.Velocity = nopeus;
221    }
222
223    public void maaritaPelaajanAmmuksenSuunta(Vector yksikkovektori, Pelaaja pelaaja)
224    {
225        if (yksikkovektori.X != 0 || yksikkovektori.Y != 0)
226        {
227            pelaaja.ammustenSuunta = yksikkovektori;
228        }
229    }
230
231    //Pelaajan ja ammuksen nopeuden asetus loppuu
232
233    //Ammuksen syntymä ja kuolema
234
235    public void ammu(Pelaaja pelaaja)
236    { 
237        double apuX=pelaaja.ammustenSuunta.X * 38;
238        double apuY=pelaaja.ammustenSuunta.Y * 38;
239
240        luoUusiAmmus(pelaaja.X+apuX, pelaaja.Y+apuY, pelaaja.magneetinVari, pelaaja.ammustenSuunta);     
241    }
242
243    public void luoUusiAmmus(double x, double y, bool onkoMagneettinen, Vector suunta)
244    {
245        Ammus uusiAmmus = new Ammus(onkoMagneettinen, x, y);
246
247        uusiAmmus.Velocity=suunta*200;
248        uusiAmmus.X = x;
249        uusiAmmus.Y = y;
250       
251        AddCollisionHandler(uusiAmmus, osumaAmmuksella);       
252       
253        Add(uusiAmmus);
254
255        ammukset.Add(uusiAmmus);
256
257    }
258
259    public void osumaAmmuksella(PhysicsObject ammus, PhysicsObject osuja)
260    {
261        Ammus ammus2 = (Ammus)ammus;
262
263        for(int i=0;i<ammukset.Count;i++){
264            if (ammukset[i] == osuja)
265            {
266                osuja.Destroy();
267                ammus.Destroy();
268
269                Ammus osuja2 = (Ammus)osuja;
270                ammukset.Remove(ammus2);
271                ammukset.Remove(osuja2);
272
273                return;
274            }
275        }
276
277        if (osuja == pelaaja2 || osuja == pelaaja1) {
278
279            Pelaaja pelaaja = (Pelaaja)osuja;
280
281            if (pelaaja == pelaaja1)
282            {
283                pelaaja1Elamat.Value -= 1;
284                if (pelaaja1Elamat < 1)
285                {
286                    pelinLoppu(pelaaja);
287                }
288            }
289            if(pelaaja == pelaaja2)
290            {
291                pelaaja2Elamat.Value -= 1;
292                if (pelaaja2Elamat < 1)
293                {
294                    pelinLoppu(pelaaja);
295                }
296            }
297           
298           
299            ammus.Destroy();
300            ammukset.Remove(ammus2);
301
302            return;
303
304        }
305
306        if (osuukoReunaan(ammus, osuja))
307        {
308            return;
309        }
310
311        for (int i = 0; i < pelaaja1.tornit.Count; i++)
312        {
313            if (pelaaja1.tornit[i] == osuja)
314            {
315                ammus.Destroy();
316
317                ammukset.Remove(ammus2);
318
319                pelaaja1.tornit[i].elamat.Value -= 1;
320
321                if (pelaaja1.tornit[i].elamat <= 0)
322                {
323                    osuja.Destroy();
324                    pelaaja1.tornit.Remove(pelaaja1.tornit[i]);
325                }
326
327                return;
328            }
329        }
330
331        for (int i = 0; i < pelaaja2.tornit.Count; i++)
332        {
333            if (pelaaja2.tornit[i] == osuja)
334            {
335                ammus.Destroy();
336
337                ammukset.Remove(ammus2);
338
339                pelaaja2.tornit[i].elamat.Value -= 1;
340
341                if (pelaaja2.tornit[i].elamat <= 0)
342                {
343                    osuja.Destroy();
344                    pelaaja2.tornit.Remove(pelaaja2.tornit[i]);
345                }
346
347                return;
348            }
349        }
350    }
351
352    public bool osuukoReunaan(PhysicsObject ammus, PhysicsObject osuja)
353    {
354        if (osuja == ylaraja)
355        {
356            ammus.Y = -ammus.Y + 11;
357            Vector nopeus = ammus.Velocity;
358            Timer.SingleShot(0.01, delegate { ammus.Velocity = nopeus; });
359
360            return true;
361
362        }
363
364        if (osuja == alaraja)
365        {
366            ammus.Y = -ammus.Y - 11;
367            Vector nopeus = ammus.Velocity;
368            Timer.SingleShot(0.01, delegate { ammus.Velocity = nopeus; });
369
370            return true;
371        }
372
373        if (osuja == oikearaja)
374        {
375            ammus.X = -ammus.X + 11;
376            Vector nopeus = ammus.Velocity;
377            Timer.SingleShot(0.01, delegate { ammus.Velocity = nopeus; });
378
379            return true;
380
381        }
382
383        if (osuja == vasenraja)
384        {
385            ammus.X = -ammus.X - 11;
386            Vector nopeus = ammus.Velocity;
387            Timer.SingleShot(0.01, delegate { ammus.Velocity = nopeus; });
388            return true;
389        }
390
391        return false;
392    }
393
394    //Ammuksen käsittely loppuu
395
396    //Magneettisuuden vaihto alkaa
397
398    public void vaihdaMagneettisuus(PhysicsObject pelaaja)
399    {
400        if (pelaaja == pelaaja2)
401        {
402            if (pelaaja2.magneetinVari)
403            {
404                pelaaja2.magneetinVari = false;
405            }
406            else
407            {
408                pelaaja2.magneetinVari = true;
409            }
410        }
411        else
412        {
413            if (pelaaja1.magneetinVari)
414            {
415                pelaaja1.magneetinVari = false;
416            }
417            else
418            {
419                pelaaja1.magneetinVari = true;
420            }
421        }
422
423    }
424
425    //Magneettisuuden vaihto loppuu
426
427    //Tornilogiikka alkaa
428
429    public void luoTorni(PhysicsObject pelaaja)
430    {
431        if (pelaaja == pelaaja1)
432        {
433            if (pelaaja1.tornit.Count < 5)
434            {
435                Add(pelaaja1.lisaaMagneettitorni());
436            }
437        }
438        else
439        {
440            if (pelaaja2.tornit.Count < 5)
441            {
442                Add(pelaaja2.lisaaMagneettitorni());
443            }
444        }
445    }
446
447    //Tornilogiikka loppuu
448
449    //Peli päivitys alkaa
450
451    protected override void Update(Time time)
452    {
453        base.Update(time);
454        tarkistaMagneetit();
455        pelaajienTarkistus();
456    }
457
458    public void tarkistaMagneetit()
459    {
460       
461        for (int i = 0; i < ammukset.Count-1; i++)
462        {
463            for (int j = 1 + i; j < ammukset.Count; j++)
464            {
465                Vector voima = luoMagneettivektori(ammukset[i], ammukset[j]);
466                Vector vastavoima = voima * -1;
467
468                ammukset[i].Velocity = ammukset[i].Velocity + voima;
469                ammukset[j].Velocity = ammukset[j].Velocity + vastavoima;
470            }
471        }
472
473        for (int i = 0; i < pelaaja1.tornit.Count; i++)
474        {
475            for (int j = 0; j < ammukset.Count; j++)
476            {
477                Ammus ammus = ammukset[j];
478               
479                Vector voima = luoMagneettivektori(ammukset[j],pelaaja1.tornit[i]);
480
481                ammus.Velocity = ammus.Velocity + voima;
482            }
483        }
484
485        for (int i = 0; i < pelaaja2.tornit.Count; i++)
486        {
487            for (int j = 0; j < ammukset.Count; j++)
488            {
489                Vector voima = luoMagneettivektori(ammukset[j], pelaaja2.tornit[i]);
490
491                ammukset[j].Velocity = ammukset[j].Velocity + voima;
492            }
493        }
494    }
495
496    public Vector luoMagneettivektori(Magneettisuus kohde1, Magneettisuus kohde2)
497    {
498        Vector palautettava = new Vector(kohde1.GetX()-kohde2.GetX(), kohde1.GetY()-kohde2.GetY());
499        palautettava=palautettava.Normalize();
500
501        double etaisyys = Math.Sqrt((kohde1.GetX() - kohde2.GetX())*(kohde1.GetX() - kohde2.GetX())+(kohde1.GetY() - kohde2.GetY())*(kohde1.GetY() - kohde2.GetY()));
502
503        palautettava = (palautettava * kohde1.MagneetinVahvuus*kohde2.MagneetinVahvuus) / (etaisyys*etaisyys);
504
505        if (!((kohde1.Magneettisuus && kohde2.Magneettisuus) || (!kohde1.Magneettisuus && !kohde2.Magneettisuus)))
506        {
507            palautettava = palautettava * -1;
508        }
509
510        return palautettava;
511    }
512
513    public void pelaajienTarkistus()
514    {
515        tarkistaPelaaja(pelaaja2);
516        tarkistaPelaaja(pelaaja1);
517    }
518
519    public void tarkistaPelaaja(Pelaaja pelaaja)
520    {
521        if (pelaaja.X < Level.Left + 25)
522        {
523            pelaaja.X = Level.Left + 25;
524            asetaPelaajanSuuntaJaNopeus(pelaaja, Vector.Zero);
525        }
526        else if(pelaaja.X>Level.Right - 25)
527        {
528            pelaaja.X = Level.Right - 25;
529            asetaPelaajanSuuntaJaNopeus(pelaaja, Vector.Zero);
530        }
531
532        if (pelaaja.Y > Level.Top - 25)
533        {
534            pelaaja.Y = Level.Top - 25;
535            asetaPelaajanSuuntaJaNopeus(pelaaja, Vector.Zero);
536        }
537        else if (pelaaja.Y < Level.Bottom + 25)
538        {
539            pelaaja.Y = Level.Bottom + 25;
540            asetaPelaajanSuuntaJaNopeus(pelaaja, Vector.Zero);
541        }
542
543        if (pelaaja.X < 225 && pelaaja.X > -225)
544        {
545            if (pelaaja.X < 0)
546            {
547                pelaaja.X = -225;
548                asetaPelaajanSuuntaJaNopeus(pelaaja, Vector.Zero);
549            }
550            else
551            {
552                pelaaja.X = 225;
553                asetaPelaajanSuuntaJaNopeus(pelaaja, Vector.Zero);
554            }
555        }
556    }
557
558    //Päivitys loppuu
559
560    public void pelinLoppu(Pelaaja pelaaja)
561    {
562        Pelaaja ilmoitettava;
563       
564        if(pelaaja==pelaaja1)
565        {
566            ilmoitettava=pelaaja2;
567        }
568        else
569        {
570            ilmoitettava=pelaaja1;
571        }
572
573        ClearAll();
574
575        Level.BackgroundColor = Color.Blue;
576       
577        Label voittajanilmoitus = luoTekstillinenLabel(Color.White,"Pelaaja "+ilmoitettava.pelaajanNumero+" voitti pelin!");
578        voittajanilmoitus.X = 0;
579        voittajanilmoitus.Y = 0;
580
581        Add(voittajanilmoitus);
582
583        Timer.SingleShot(2, delegate { uusiPeli(); });
584   
585    }
586
587}
588
589public interface Magneettisuus
590{
591    bool Magneettisuus { get; }
592    double MagneetinVahvuus { get; }
593    double GetX();
594    double GetY();
595}
596
597public class Ammus : PhysicsObject, Magneettisuus
598{
599   
600    private bool magneettisuus;
601    public bool Magneettisuus { get { return magneettisuus; } }
602
603    private double magneetinVahvuus;
604    public double MagneetinVahvuus { get { return magneetinVahvuus; } }
605
606    public Ammus(bool magneettisuus, double x, double y)
607    :base(20,20)
608    {
609        this.magneettisuus = magneettisuus;
610        this.magneetinVahvuus = 200;
611
612        if (magneettisuus == true)
613        {
614            base.Color = Color.Red;
615        }
616        else
617        {
618            base.Color = Color.Blue;
619        }
620
621        base.Shape = Shape.Circle;
622        base.X = x;
623        base.Y = y;
624
625       }
626
627    public double GetY()
628    {
629        return base.Y;
630    }
631
632    public double GetX()
633    {
634        return base.X;
635    }
636}
637
638public class Magneettitorni:PhysicsObject, Magneettisuus
639{
640    public IntMeter elamat;
641   
642    private bool magneettisuus;
643    public bool Magneettisuus{get{return magneettisuus;}}
644
645    private double magneetinVahvuus;
646    public double MagneetinVahvuus{get{return magneetinVahvuus;}}
647
648    public Magneettitorni(bool magneettisuus, double x, double y)
649        :base(30,30)
650    {
651        this.magneettisuus = magneettisuus;
652        this.magneetinVahvuus = 300;
653
654        base.IgnoresPhysicsLogics = true;
655        base.IgnoresCollisionResponse = true;
656        base.Shape = Shape.Circle;
657        base.X = x;
658        base.Y = y;
659
660        if (magneettisuus)
661        {
662            base.Color = Color.Red;
663        }
664        else
665        {
666            base.Color = Color.Blue;
667        }
668
669        elamat = new IntMeter(3);
670    }
671
672    public double GetX()
673    {
674        return base.X;
675    }
676
677    public double GetY()
678    {
679        return base.Y;
680    }
681
682}
683
684public class Pelaaja : PhysicsObject
685{
686    public bool magneetinVari;
687    public Vector ammustenSuunta;
688    public int pelaajanNumero;
689
690    public List<Magneettitorni> tornit;
691   
692    public Pelaaja(double x, double y, Vector ammustenSuunta, int pelaaja)
693        :base(50,50)
694    {
695        magneetinVari = false;
696        this.ammustenSuunta = ammustenSuunta;
697        pelaajanNumero = pelaaja;
698
699        tornit = new List<Magneettitorni>();
700
701        base.X = x;
702        base.Y = y;
703        base.Color = Color.White;
704        base.Shape = Shape.Circle;
705        base.IgnoresCollisionResponse = true;
706        base.IgnoresPhysicsLogics = true;
707    }
708
709    public Magneettitorni lisaaMagneettitorni()
710    {
711        Magneettitorni torni = new Magneettitorni(magneetinVari, base.X, base.Y);
712
713        tornit.Add(torni);
714
715        return torni;
716    }
717}
Note: See TracBrowser for help on using the repository browser.