source: 2013/24/IlariR/Robot attack/Robot attack/Robot attack/Robot_attack.cs @ 4125

Revision 4125, 18.3 KB checked in by ilkarist, 6 years ago (diff)

Talletus.

Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9public class Robot_attack : PhysicsGame
10{
11    Image tykkiKuva = LoadImage("tykki");
12    Image tatainkuva = LoadImage("tahtain");
13    Image luodinKuva = LoadImage("luoti3");
14    Image taustakuva = LoadImage("tausta2");
15    Image avainkuva = LoadImage("avain");
16    Image lukkokuva = LoadImage("lukko");
17    Image teleporttikuva = LoadImage("teleportti");
18    Image muurikuva = LoadImage("muuri");
19    Image Vihukuva = LoadImage("PaaVihollinen");
20    SoundEffect ampuminen = LoadSoundEffect("ampuminen");
21    SoundEffect rajahdysaani = LoadSoundEffect("rajahdys2");
22    SoundEffect robotaani = LoadSoundEffect("robotaani");
23    SoundEffect NUKEaani = LoadSoundEffect("NUKEsound");
24
25    Robot robot;
26    PhysicsObject ase;
27    IntMeter pisteLaskuri;
28    EasyHighScore topLista = new EasyHighScore();
29    int kenttaNro = 1;
30
31    public override void Begin()
32    {
33        Alkuvalikko();
34    }
35
36    void Aloitapeli()
37    {
38        pisteLaskuri = new IntMeter(0);
39       
40
41        AlustaKentta();
42       
43
44    }
45
46
47     void AlustaKentta()
48    {
49        ClearAll();
50        LuoKentta();
51        LuoOhjaimet();
52        LuoPistelaskuri();
53        Mouse.IsCursorVisible = true;
54
55        robotaani.Play();
56    }
57
58    void LiikutaPelaajaa(Vector vektori)
59    {
60        robot.Push(vektori);
61    }
62
63    void Tahtaa(AnalogState hiirenLiike)
64    {
65        Vector suunta = (Mouse.PositionOnWorld - ase.AbsolutePosition).Normalize();
66        //ase.Angle = suunta.Angle;
67        ase.ApplyTorque((ase.Angle.Radians - suunta.Angle.Radians) * 100000);
68    }
69
70    void TahtaaNappaimella(int suunta)
71    {
72        ase.ApplyTorque(suunta);
73    }
74
75    void LuoOhjaimet()
76    {
77        Keyboard.Listen(Key.W, ButtonState.Down, LiikutaPelaajaa, null, new Vector(0, 4500));
78        Keyboard.Listen(Key.A, ButtonState.Down, LiikutaPelaajaa, null, new Vector(-4500, 0));
79        Keyboard.Listen(Key.S, ButtonState.Down, LiikutaPelaajaa, null, new Vector(0, -4500));
80        Keyboard.Listen(Key.D, ButtonState.Down, LiikutaPelaajaa, null, new Vector(4500, 0));
81        Keyboard.Listen(Key.Space, ButtonState.Released, AmmuAseella, null, ase, 400.0);
82
83        Keyboard.Listen(Key.F10, ButtonState.Pressed, delegate {
84            PaasetSeuraavaanTasoon(robot, null);
85        }, null);
86
87        Keyboard.Listen(Key.F11, ButtonState.Pressed, Nuke, null);
88
89        Keyboard.Listen(Key.Left, ButtonState.Down, TahtaaNappaimella, null, 25000);
90        Keyboard.Listen(Key.Right, ButtonState.Down, TahtaaNappaimella, null, -25000);
91        //Mouse.ListenMovement(0.1, Tahtaa, "Tähtää aseella");
92
93        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
94        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
95    }
96
97    void Nuke()
98    {
99        NUKEaani.Play();
100        Timer.SingleShot(14.5, delegate {
101            foreach (PhysicsObject v in GetObjectsWithTag("vihollinen"))
102            {
103                TuhoaJaRajahda(v);
104            }
105
106            Explosion rajahdys = new Explosion(400);
107            rajahdys.Sound = rajahdysaani;
108            rajahdys.Position = robot.Position + RandomGen.NextVector(100, 200);
109            Add(rajahdys);
110        });
111    }
112
113    void LuoVihollinen(Vector paikka, double leveys, double korkeus)
114    {
115        Robot vihollinen = new Robot(leveys, korkeus, 2);
116        vihollinen.Position = paikka;
117        vihollinen.Color = Color.Red;
118        vihollinen.Shape = Shape.Diamond;
119        vihollinen.Tag = "vihollinen";
120        vihollinen.CollisionIgnoreGroup = 3;
121        vihollinen.Destroyed += delegate { pisteLaskuri.AddValue(100); };
122        Timer ajastin = new Timer();
123        ajastin.Interval = 2;
124        ajastin.Timeout +=
125            delegate
126            {
127                if (vihollinen.IsDestroyed)
128                {
129                    ajastin.Stop(); return;
130                }
131                AmmuAseella(vihollinen, 200);
132            };
133        ajastin.Start();
134
135        FollowerBrain aivot = new FollowerBrain("Pelaaja");
136        vihollinen.Brain = aivot;
137        aivot.TurnWhileMoving = true;
138        aivot.Speed = 70
139            ;
140        vihollinen.Elamat.LowerLimit += delegate { TuhoaJaRajahda(vihollinen); };
141        Add(vihollinen);
142
143    }
144
145    void LuoPistelaskuri()
146    {
147        Label pisteNaytto = new Label();
148        pisteNaytto.X = Screen.Left + 100;
149        pisteNaytto.Y = Screen.Top - 100;
150        pisteNaytto.TextColor = Color.Black;
151        pisteNaytto.Color = Color.White;
152
153        pisteNaytto.BindTo(pisteLaskuri);
154        Add(pisteNaytto);
155    }
156
157    void LuoLiikkumatonVihollinen(Vector paikka, double leveys, double korkeus)
158    {
159        Robot vihollinen = new Robot(leveys*1.5, korkeus*1.5, 8);
160        vihollinen.Position = paikka;
161        vihollinen.Color = Color.Red;
162        vihollinen.Shape = Shape.Triangle;
163        vihollinen.Tag = "vihollinen";
164        vihollinen.CollisionIgnoreGroup = 3;
165        Timer ajastin = new Timer();
166        ajastin.Interval = 1;
167        vihollinen.Destroyed += delegate { pisteLaskuri.AddValue(500); };
168        ajastin.Timeout +=
169            delegate
170            {
171                if (vihollinen.IsDestroyed)
172                {
173                    ajastin.Stop(); return;
174                }
175                AmmuAseella(vihollinen, 700);
176            };
177        ajastin.Start();
178
179        FollowerBrain aivot = new FollowerBrain("Pelaaja");
180        vihollinen.Brain = aivot;
181        aivot.TurnWhileMoving = true;
182        aivot.Speed = 0
183            ;
184        vihollinen.Elamat.LowerLimit += delegate { TuhoaJaRajahda(vihollinen); };
185        Add(vihollinen);
186
187    }
188    void LuoPääVihollinen(Vector paikka, double leveys, double korkeus)
189    {
190        Robot vihollinen = new Robot(leveys * 2.5, korkeus * 2.5, 100);
191        vihollinen.Position = paikka;
192        vihollinen.Tag = "vihollinen";
193        vihollinen.Image = Vihukuva;
194        vihollinen.CollisionIgnoreGroup = 3;
195        Timer ajastin = new Timer();
196        ajastin.Interval = 0.05;
197        vihollinen.Destroyed += delegate { pisteLaskuri.AddValue(1000); };
198        ajastin.Timeout +=
199            delegate
200            {
201                if (vihollinen.IsDestroyed)
202                {
203                    ajastin.Stop(); return;
204                }
205                AmmuAseella(vihollinen, 700);
206            };
207        ajastin.Start();
208
209        Timer latausajastin = new Timer();
210        latausajastin.Interval = 5.0;
211        latausajastin.Timeout +=
212            delegate
213            {
214                if (ajastin.Enabled)
215                {
216                    ajastin.Pause();
217                }
218                else
219                {
220                    ajastin.Start();
221                }
222            };
223        latausajastin.Start();
224
225        FollowerBrain aivot = new FollowerBrain("Pelaaja");
226        vihollinen.Brain = aivot;
227        aivot.TurnWhileMoving = true;
228        aivot.Speed = 0;
229        vihollinen.Elamat.LowerLimit += delegate { TuhoaJaRajahda(vihollinen); };
230        Add(vihollinen);
231    }
232
233    void AmmuAseella(PhysicsObject obj, double ammuksenNopeus)
234    {
235        PhysicsObject ammus = new PhysicsObject(30, 10);
236        ammus.Image = luodinKuva;
237        AddCollisionHandler(ammus, AmmusTormaa);
238        ammus.Angle = obj.Angle;
239        ammus.Velocity = Vector.FromLengthAndAngle(ammuksenNopeus, obj.Angle);
240        ammus.CollisionIgnoreGroup = obj.CollisionIgnoreGroup;
241        ammus.Position = obj.Position + Vector.FromLengthAndAngle(10, obj.Angle);
242        Add(ammus);
243    }
244
245
246    void AmmusTormaa(PhysicsObject ammus, PhysicsObject kohde)
247    {
248        ammus.Destroy();
249
250        if(kohde.Tag.Equals("ase"))
251        {
252            //Törmäyskäsittelijä aseeseen osuneita ammuksia varten
253            robot.Elamat.Value--;
254            return;
255        }
256
257        if (kohde is Muuri)
258        {
259            ((Muuri)kohde).ElamaLaskuri.AddValue(-1);
260        }
261
262        if (!(kohde is Robot)) return;
263        Robot robotti = (Robot)kohde;
264        if (kohde.Tag.Equals("Pelaaja")) robotti.Elamat.Value--;
265        if(kohde.Tag.Equals("vihollinen")) robotti.Elamat.Value--;
266
267    }
268   
269    void LuoKentta()
270    {
271        if(kenttaNro == 3)
272        {
273            Label kenttaRuutu = new Label(700, 500);
274            kenttaRuutu.Text = "Big Boss!";
275            kenttaRuutu.Color = Color.Transparent;
276            kenttaRuutu.TextScale = new Vector(7, 7);
277            kenttaRuutu.Position = new Vector(-300, 300);
278            kenttaRuutu.TextColor = Color.Turquoise;
279            Add(kenttaRuutu);
280            Timer ajastin = new Timer();
281            ajastin.Interval = 1;
282            ajastin.Start();
283            ajastin.Timeout += delegate { kenttaRuutu.Destroy(); };
284
285        }
286
287        if (kenttaNro == 4)
288        {
289            Label kenttaRuutu = new Label(700, 500);
290            kenttaRuutu.Text = "VOITIT PELIN!";
291            kenttaRuutu.Color = Color.Transparent;
292            kenttaRuutu.TextScale = new Vector(7, 7);
293            kenttaRuutu.Position = new Vector(-300, 300);
294            kenttaRuutu.TextColor = Color.Turquoise;
295            Add(kenttaRuutu);
296
297            PeliLoppui();
298            return;
299        }
300
301        ColorTileMap ruudut = ColorTileMap.FromLevelAsset("kentta"+kenttaNro);
302        ruudut.SetTileMethod("00FF00", LuoLukko);
303        ruudut.SetTileMethod(Color.Blue, LuoPelaaja);
304        ruudut.SetTileMethod(Color.Black, LuoTaso);
305        ruudut.SetTileMethod(Color.Red, LuoVihollinen);
306        ruudut.SetTileMethod("BA006E", LuoLiikkumatonVihollinen);
307        ruudut.SetTileMethod("FFD800", LuoAvain);
308        ruudut.SetTileMethod("FF00DC", LuoMuuri);
309        ruudut.SetTileMethod("00FFFF", LuoPääVihollinen);
310        ruudut.SetTileMethod("FF6A00", LuoTahti);
311        ruudut.SetTileMethod("0094FF", LuoHaviavaMuuri);
312        ruudut.SetTileMethod("404040", LuoMaali);
313        ruudut.Execute(50, 50);
314        Level.BackgroundColor = Color.Black;
315        //Level.Background.CreateGradient(Color.Yellow, Color.Orange);
316        Level.Background.Image = taustakuva;
317        Level.Background.FitToLevel();
318
319        Camera.Follow(robot);
320        Camera.ZoomFactor = 2;
321    }
322
323    void LuoMuuri(Vector paikka, double leveys, double korkeus)
324    {
325        Muuri muuri = new Muuri(leveys, korkeus);
326        muuri.MakeStatic();
327        muuri.Position = paikka;
328        muuri.Image = muurikuva;
329        muuri.CollisionIgnoreGroup = 0;
330        muuri.Destroyed += delegate {
331            for (int i = 0; i < 80; i++)
332            {
333                PhysicsObject p = new PhysicsObject(6, 6);
334                //p.Image = muurikuva;
335                p.Color = Color.Gray;
336                p.Position = muuri.Position;
337                p.LinearDamping = 0.98;
338                p.Hit(RandomGen.NextVector(20, 300));
339                p.LifetimeLeft = TimeSpan.FromSeconds(3.0);
340                p.CollisionIgnoreGroup = 1;
341                p.FadeColorTo(Color.Transparent, 2.0);
342                Add(p);
343               
344            }
345            ampuminen.Play();
346           
347        };
348        Add(muuri);
349    }
350
351    void LuoTahti(Vector paikka, double leveys, double korkeus)
352    {
353        PhysicsObject tahti = PhysicsObject.CreateStaticObject(leveys, korkeus);
354        tahti.Position = paikka;
355        tahti.Shape = Shape.Star;
356        tahti.CollisionIgnoreGroup = 0;
357        tahti.Tag = "Tahti";
358        tahti.Color = Color.Gold;
359        Add(tahti);
360
361    }
362
363    void LuoMaali(Vector paikka, double leveys, double korkeus)
364    {
365        PhysicsObject Maali = PhysicsObject.CreateStaticObject(leveys, korkeus);
366        Maali.Position = paikka;
367        Maali.Image = teleporttikuva;
368        Maali.CollisionIgnoreGroup = 0;
369        Add(Maali);
370
371        AddCollisionHandler(robot, Maali, PaasetSeuraavaanTasoon);
372    }
373
374    void PaasetSeuraavaanTasoon(PhysicsObject robotti, PhysicsObject maali)
375    {
376        kenttaNro++;
377        AlustaKentta();
378    }
379
380    void LuoHaviavaMuuri(Vector paikka, double leveys, double korkeus)
381    {
382        PhysicsObject haviavamuuri = PhysicsObject.CreateStaticObject(leveys, korkeus);
383        haviavamuuri.Position = paikka;
384        haviavamuuri.CollisionIgnoreGroup = 0;
385        haviavamuuri.Color = Color.DarkGray;
386        haviavamuuri.Tag = "maaliseina";
387        Add(haviavamuuri);
388    }
389
390    void LuoLukko(Vector paikka, double leveys, double korkeus)
391    {
392        PhysicsObject lukko = PhysicsObject.CreateStaticObject(leveys, korkeus);
393        lukko.Position = paikka;
394        lukko.Image = lukkokuva;
395        lukko.CollisionIgnoreGroup = 0;
396        lukko.Tag = "lukko";
397        Add(lukko);
398    }
399
400    void Avaalukko(PhysicsObject tormaaja, PhysicsObject kohde)
401    {
402        if (robot.avain)
403        {
404            kohde.Destroy();
405            pisteLaskuri.Value += 250;
406
407            foreach(PhysicsObject maaliseina in GetObjectsWithTag("maaliseina") )
408            {
409                TuhoaJaRajahda(maaliseina);
410                //maaliseina.Destroy();
411            }
412        }
413    }
414
415    void LuoAvain(Vector paikka, double leveys, double korkeus)
416    {
417        PhysicsObject Avain = PhysicsObject.CreateStaticObject(leveys, korkeus);
418        Avain.Position = paikka;
419        Avain.Image = avainkuva;
420        Avain.CollisionIgnoreGroup = 0;
421        Avain.Tag = "avain";
422        Add(Avain);
423    }
424
425    void KeraaAvain(PhysicsObject tormaaja, PhysicsObject kohde)
426    {
427        robot.avain = true;
428        kohde.Destroy();
429    }
430
431
432
433    void LuoPelaaja(Vector paikka, double leveys, double korkeus)
434    {
435        robot = new Robot(leveys, korkeus, 8);
436        robot.Position = paikka;
437        robot.Shape = Shape.Hexagon;
438        robot.Color = Color.Cyan;
439        robot.LinearDamping = 0.6;
440        robot.CollisionIgnoreGroup = 1;
441        robot.CanRotate = false;
442        robot.Tag = "Pelaaja";
443        //AddCollisionHandler(robot, );
444        Add(robot);
445        ProgressBar elamaPalkki = new ProgressBar(150, 20);
446        elamaPalkki.X = Screen.Left + 150;
447        elamaPalkki.Y = Screen.Top - 20;
448        elamaPalkki.BindTo(robot.Elamat);
449        //Taustaväri:
450        elamaPalkki.Color = Color.Yellow;
451
452        //Palkin väri:
453        elamaPalkki.BarColor = Color.Red;
454
455        //Reunan väri:
456        elamaPalkki.BorderColor = Color.Black;
457
458        Add(elamaPalkki);
459
460        robot.Elamat.LowerLimit += delegate {
461            TuhoaJaRajahda(robot);
462
463            kenttaNro = 1;
464
465            for (int i = 0; i < 60; i++)
466            {
467                Timer.SingleShot(0.1 + i / 40.0, delegate
468                {
469                    Explosion rajahdys = new Explosion(400);
470                    rajahdys.Sound = rajahdysaani;
471                    rajahdys.Position = robot.Position + RandomGen.NextVector(100, 200);
472                    Add(rajahdys);
473                });
474            }
475        };
476        robot.Destroyed += PeliLoppui;
477
478        ase = new PhysicsObject(tykkiKuva);
479        ase.Shape = Shape.FromImage(tykkiKuva);
480        ase.Position = robot.Position;
481        ase.AngularDamping = 0.9;
482        ase.Tag = "ase";
483        ase.Size *= 0.5;
484        ase.CollisionIgnoreGroup = 1;
485        Add(ase);
486
487        AxleJoint liitos = new AxleJoint(robot, ase, robot.Position);
488        Add(liitos);
489
490        AddCollisionHandler(robot, "Tahti", delegate(PhysicsObject tormaaja, PhysicsObject kohde)
491        {
492            pisteLaskuri.AddValue(500);
493            kohde.Destroy();
494        });
495
496        AddCollisionHandler(robot, "avain", KeraaAvain);
497        AddCollisionHandler(robot, "lukko", Avaalukko);
498
499
500        /*
501        ase = new Cannon(leveys, korkeus/5);
502        ase.Image = tykkiKuva;
503        ase.Size *= 2;
504        robot.Add(ase);
505         */
506
507     
508    }
509
510    void PeliLoppui()
511    {
512        topLista.EnterAndShow(pisteLaskuri.Value);
513        topLista.HighScoreWindow.Closed += PeliLoppuiValikko;
514    }
515
516    void PeliLoppuiValikko(Window sender)
517    {
518        MultiSelectWindow ikkuna = new MultiSelectWindow("Game Over!", "Aloita alusta", "Lopeta");
519        ikkuna.ItemSelected += ValikkoValinta;
520        Add(ikkuna);
521
522    }
523
524
525    void ValikkoValinta(int valinta)
526    {
527        switch (valinta)
528        {
529            case 0:
530                Aloitapeli();
531                break;
532            case 1:
533                Exit();
534                break;
535            default:
536                break;
537        }
538    }
539
540
541    void TuhoaJaRajahda(PhysicsObject obj)
542    {
543        Explosion rajahdys = new Explosion(100);
544        rajahdys.Sound = rajahdysaani;
545        rajahdys.Position = obj.Position;
546        Add(rajahdys);
547        obj.Destroy();
548    }
549
550    void LuoTaso(Vector paikka, double leveys, double korkeus)
551    {
552        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
553        taso.Position = paikka;
554        //taso.Image = groundImage;
555        taso.CollisionIgnoreGroup = 2;
556        taso.Color = new Color(66, 83, 240);
557        Add(taso);
558    }
559
560    void Alkuvalikko()
561    {
562        MultiSelectWindow alkuValikko = new MultiSelectWindow("Pelin alkuvalikko", "Aloita peli", "Parhaat pisteet", "Lopeta");
563        alkuValikko.AddItemHandler(0, Aloitapeli);
564        alkuValikko.AddItemHandler(1, NaytaParhaatPisteet);
565        alkuValikko.AddItemHandler(2, Exit);
566
567        Add(alkuValikko);
568    }
569
570    void NaytaParhaatPisteet()
571    {
572        topLista.Show();
573        topLista.HighScoreWindow.Closed += delegate(Window sender) { Alkuvalikko(); };
574   
575    }
576}
577
578public class Robot : PhysicsObject
579{
580    IntMeter elamat;
581    public bool avain;
582    public IntMeter Elamat { get { return elamat; } }
583
584    public Robot(double leveys, double korkeus, int elamia)
585        : base(leveys, korkeus)
586    {
587        elamat = new IntMeter(elamia, 0, elamia);
588        avain = false;
589    }
590
591    IntMeter pisteLaskuri;
592
593}
594
595class Muuri : PhysicsObject
596{
597    private IntMeter elamaLaskuri = new IntMeter(5, 0, 5);
598    public IntMeter ElamaLaskuri { get { return elamaLaskuri; } }
599
600    public Muuri(double leveys, double korkeus)
601        : base(leveys, korkeus)
602    {
603        elamaLaskuri.LowerLimit += delegate { this.Destroy(); };
604        this.Tag = "muuri";
605    }
606}
Note: See TracBrowser for help on using the repository browser.