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

Revision 4164, 18.6 KB checked in by ilkarist, 7 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    Image alkutaustakuva = LoadImage("Taustakuva");
21    SoundEffect ampuminen = LoadSoundEffect("ampuminen");
22    SoundEffect rajahdysaani = LoadSoundEffect("rajahdys2");
23    SoundEffect robotaani = LoadSoundEffect("robotaani");
24    SoundEffect NUKEaani = LoadSoundEffect("NUKEsound");
25
26    Robot robot;
27    PhysicsObject ase;
28    IntMeter pisteLaskuri;
29    EasyHighScore topLista = new EasyHighScore();
30    int kenttaNro = 1;
31
32    public override void Begin()
33    {
34        Alkuvalikko();
35    }
36
37    void Aloitapeli()
38    {
39        pisteLaskuri = new IntMeter(0);
40        AlustaKentta();
41    }
42
43
44    void AlustaKentta()
45    {
46        ClearAll();
47        LuoKentta();
48        LuoOhjaimet();
49        LuoPistelaskuri();
50        Mouse.IsCursorVisible = true;
51
52        robotaani.Play();
53    }
54
55    void LiikutaPelaajaa(Vector vektori)
56    {
57        robot.Push(vektori);
58    }
59
60    void Tahtaa(AnalogState hiirenLiike)
61    {
62        Vector suunta = (Mouse.PositionOnWorld - ase.AbsolutePosition).Normalize();
63        //ase.Angle = suunta.Angle;
64        ase.ApplyTorque((ase.Angle.Radians - suunta.Angle.Radians) * 100000);
65    }
66
67    void TahtaaNappaimella(int suunta)
68    {
69        ase.ApplyTorque(suunta);
70    }
71
72    void LuoOhjaimet()
73    {
74        Keyboard.Listen(Key.W, ButtonState.Down, LiikutaPelaajaa, null, new Vector(0, 4500));
75        Keyboard.Listen(Key.A, ButtonState.Down, LiikutaPelaajaa, null, new Vector(-4500, 0));
76        Keyboard.Listen(Key.S, ButtonState.Down, LiikutaPelaajaa, null, new Vector(0, -4500));
77        Keyboard.Listen(Key.D, ButtonState.Down, LiikutaPelaajaa, null, new Vector(4500, 0));
78        Keyboard.Listen(Key.Space, ButtonState.Released, AmmuAseella, null, ase, 400.0);
79
80        Keyboard.Listen(Key.F10, ButtonState.Pressed, delegate
81        {
82            PaasetSeuraavaanTasoon(robot, null);
83        }, null);
84
85        Keyboard.Listen(Key.F11, ButtonState.Pressed, Nuke, null);
86
87        Keyboard.Listen(Key.Left, ButtonState.Down, TahtaaNappaimella, null, 25000);
88        Keyboard.Listen(Key.Right, ButtonState.Down, TahtaaNappaimella, null, -25000);
89        //Mouse.ListenMovement(0.1, Tahtaa, "Tähtää aseella");
90
91        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
92        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
93    }
94
95    void Nuke()
96    {
97        NUKEaani.Play();
98        Timer.SingleShot(14.5, delegate
99        {
100            foreach (PhysicsObject v in GetObjectsWithTag("vihollinen"))
101            {
102                TuhoaJaRajahda(v);
103            }
104
105            Explosion rajahdys = new Explosion(400);
106            rajahdys.Sound = rajahdysaani;
107            rajahdys.Position = robot.Position + RandomGen.NextVector(100, 200);
108            Add(rajahdys);
109        });
110    }
111
112    void LuoVihollinen(Vector paikka, double leveys, double korkeus)
113    {
114        Robot vihollinen = new Robot(leveys, korkeus, 2);
115        vihollinen.Position = paikka;
116        vihollinen.Color = Color.Red;
117        vihollinen.Shape = Shape.Diamond;
118        vihollinen.Tag = "vihollinen";
119        vihollinen.CollisionIgnoreGroup = 3;
120        vihollinen.Destroyed += delegate { pisteLaskuri.AddValue(100); };
121        vihollinen.Elamat.LowerLimit += delegate { TuhoaJaRajahda(vihollinen); };
122        vihollinen.Destroyed += delegate { Timer.SingleShot(10.0, delegate { LuoVihollinen(paikka, leveys, korkeus); }); };
123       
124        Timer ajastin = new Timer();
125        ajastin.Interval = 2;
126        ajastin.Timeout +=
127            delegate
128            {
129                if (vihollinen.IsDestroyed)
130                {
131                    ajastin.Stop(); return;
132                }
133                AmmuAseella(vihollinen, 200);
134            };
135        ajastin.Start();
136
137        FollowerBrain aivot = new FollowerBrain("Pelaaja");
138        vihollinen.Brain = aivot;
139        aivot.TurnWhileMoving = true;
140        aivot.Speed = 70;
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        {
332            for (int i = 0; i < 80; i++)
333            {
334                PhysicsObject p = new PhysicsObject(6, 6);
335                //p.Image = muurikuva;
336                p.Color = Color.Gray;
337                p.Position = muuri.Position;
338                p.LinearDamping = 0.98;
339                p.Hit(RandomGen.NextVector(20, 300));
340                p.LifetimeLeft = TimeSpan.FromSeconds(3.0);
341                p.CollisionIgnoreGroup = 1;
342                p.FadeColorTo(Color.Transparent, 2.0);
343                Add(p);
344
345            }
346            ampuminen.Play();
347
348        };
349        Add(muuri);
350    }
351
352    void LuoTahti(Vector paikka, double leveys, double korkeus)
353    {
354        PhysicsObject tahti = PhysicsObject.CreateStaticObject(leveys, korkeus);
355        tahti.Position = paikka;
356        tahti.Shape = Shape.Star;
357        tahti.CollisionIgnoreGroup = 0;
358        tahti.Tag = "Tahti";
359        tahti.Color = Color.Gold;
360        Add(tahti);
361
362    }
363
364    void LuoMaali(Vector paikka, double leveys, double korkeus)
365    {
366        PhysicsObject Maali = PhysicsObject.CreateStaticObject(leveys, korkeus);
367        Maali.Position = paikka;
368        Maali.Image = teleporttikuva;
369        Maali.CollisionIgnoreGroup = 0;
370        Add(Maali);
371
372        AddCollisionHandler(robot, Maali, PaasetSeuraavaanTasoon);
373    }
374
375    void PaasetSeuraavaanTasoon(PhysicsObject robotti, PhysicsObject maali)
376    {
377        kenttaNro++;
378        AlustaKentta();
379    }
380
381    void LuoHaviavaMuuri(Vector paikka, double leveys, double korkeus)
382    {
383        PhysicsObject haviavamuuri = PhysicsObject.CreateStaticObject(leveys, korkeus);
384        haviavamuuri.Position = paikka;
385        haviavamuuri.CollisionIgnoreGroup = 0;
386        haviavamuuri.Color = Color.DarkGray;
387        haviavamuuri.Tag = "maaliseina";
388        Add(haviavamuuri);
389    }
390
391    void LuoLukko(Vector paikka, double leveys, double korkeus)
392    {
393        PhysicsObject lukko = PhysicsObject.CreateStaticObject(leveys, korkeus);
394        lukko.Position = paikka;
395        lukko.Image = lukkokuva;
396        lukko.CollisionIgnoreGroup = 0;
397        lukko.Tag = "lukko";
398        Add(lukko);
399    }
400
401    void Avaalukko(PhysicsObject tormaaja, PhysicsObject kohde)
402    {
403        if (robot.avain)
404        {
405            kohde.Destroy();
406            pisteLaskuri.Value += 250;
407
408            foreach (PhysicsObject maaliseina in GetObjectsWithTag("maaliseina"))
409            {
410                TuhoaJaRajahda(maaliseina);
411                //maaliseina.Destroy();
412            }
413        }
414    }
415
416    void LuoAvain(Vector paikka, double leveys, double korkeus)
417    {
418        PhysicsObject Avain = PhysicsObject.CreateStaticObject(leveys, korkeus);
419        Avain.Position = paikka;
420        Avain.Image = avainkuva;
421        Avain.CollisionIgnoreGroup = 0;
422        Avain.Tag = "avain";
423        Add(Avain);
424    }
425
426    void KeraaAvain(PhysicsObject tormaaja, PhysicsObject kohde)
427    {
428        robot.avain = true;
429        kohde.Destroy();
430    }
431
432
433
434    void LuoPelaaja(Vector paikka, double leveys, double korkeus)
435    {
436        robot = new Robot(leveys, korkeus, 10);
437        robot.Position = paikka;
438        robot.Shape = Shape.Hexagon;
439        robot.Color = Color.Cyan;
440        robot.LinearDamping = 0.6;
441        robot.CollisionIgnoreGroup = 1;
442        robot.CanRotate = false;
443        robot.Tag = "Pelaaja";
444        //AddCollisionHandler(robot, );
445        Add(robot);
446        ProgressBar elamaPalkki = new ProgressBar(150, 20);
447        elamaPalkki.X = Screen.Left + 150;
448        elamaPalkki.Y = Screen.Top - 20;
449        elamaPalkki.BindTo(robot.Elamat);
450        //Taustaväri:
451        elamaPalkki.Color = Color.Yellow;
452
453        //Palkin väri:
454        elamaPalkki.BarColor = Color.Red;
455
456        //Reunan väri:
457        elamaPalkki.BorderColor = Color.Black;
458
459        Add(elamaPalkki);
460
461        robot.Elamat.LowerLimit += delegate
462        {
463            TuhoaJaRajahda(robot);
464
465            kenttaNro = 1;
466
467            for (int i = 0; i < 60; i++)
468            {
469                Timer.SingleShot(0.1 + i / 40.0, delegate
470                {
471                    Explosion rajahdys = new Explosion(400);
472                    rajahdys.Sound = rajahdysaani;
473                    rajahdys.Position = robot.Position + RandomGen.NextVector(100, 200);
474                    Add(rajahdys);
475                });
476            }
477        };
478        robot.Destroyed += PeliLoppui;
479
480        ase = new PhysicsObject(tykkiKuva);
481        ase.Shape = Shape.FromImage(tykkiKuva);
482        ase.Position = robot.Position;
483        ase.AngularDamping = 0.9;
484        ase.Tag = "ase";
485        ase.Size *= 0.5;
486        ase.CollisionIgnoreGroup = 1;
487        Add(ase);
488
489        AxleJoint liitos = new AxleJoint(robot, ase, robot.Position);
490        Add(liitos);
491
492        AddCollisionHandler(robot, "Tahti", delegate(PhysicsObject tormaaja, PhysicsObject kohde)
493        {
494            pisteLaskuri.AddValue(500);
495            kohde.Destroy();
496        });
497
498        AddCollisionHandler(robot, "avain", KeraaAvain);
499        AddCollisionHandler(robot, "lukko", Avaalukko);
500
501
502        /*
503        ase = new Cannon(leveys, korkeus/5);
504        ase.Image = tykkiKuva;
505        ase.Size *= 2;
506        robot.Add(ase);
507         */
508
509
510    }
511
512    void PeliLoppui()
513    {
514        topLista.EnterAndShow(pisteLaskuri.Value);
515        topLista.HighScoreWindow.Closed += PeliLoppuiValikko;
516    }
517
518    void PeliLoppuiValikko(Window sender)
519    {
520        kenttaNro = 1;
521        MultiSelectWindow ikkuna = new MultiSelectWindow("Game Over!", "Aloita alusta", "Lopeta");
522        ikkuna.ItemSelected += ValikkoValinta;
523        Add(ikkuna);
524
525    }
526
527
528    void ValikkoValinta(int valinta)
529    {
530        switch (valinta)
531        {
532            case 0:
533                Aloitapeli();
534                break;
535            case 1:
536                Exit();
537                break;
538            default:
539                break;
540        }
541    }
542
543
544    void TuhoaJaRajahda(PhysicsObject obj)
545    {
546        Explosion rajahdys = new Explosion(100);
547        rajahdys.Sound = rajahdysaani;
548        rajahdys.Position = obj.Position;
549        Add(rajahdys);
550        obj.Destroy();
551    }
552
553    void LuoTaso(Vector paikka, double leveys, double korkeus)
554    {
555        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
556        taso.Position = paikka;
557        //taso.Image = groundImage;
558        taso.CollisionIgnoreGroup = 2;
559        taso.Color = new Color(66, 83, 240);
560        Add(taso);
561    }
562
563    void Alkuvalikko()
564    {
565        Level.Background.Image = alkutaustakuva;
566        Level.Background.FitToLevel();
567        Level.BackgroundColor = Color.Black;
568        MultiSelectWindow alkuValikko = new MultiSelectWindow("Pelin alkuvalikko", "Aloita peli", "Parhaat pisteet", "Lopeta");
569        alkuValikko.AddItemHandler(0, Aloitapeli);
570        alkuValikko.AddItemHandler(1, NaytaParhaatPisteet);
571        alkuValikko.AddItemHandler(2, Exit);
572
573        Add(alkuValikko);
574    }
575
576    void NaytaParhaatPisteet()
577    {
578        topLista.Show();
579        topLista.HighScoreWindow.Closed += delegate(Window sender) { Alkuvalikko(); };
580
581    }
582}
583
584public class Robot : PhysicsObject
585{
586    IntMeter elamat;
587    public bool avain;
588    public IntMeter Elamat { get { return elamat; } }
589
590    public Robot(double leveys, double korkeus, int elamia)
591        : base(leveys, korkeus)
592    {
593        elamat = new IntMeter(elamia, 0, elamia);
594        avain = false;
595    }
596}
597
598class Muuri : PhysicsObject
599{
600    private IntMeter elamaLaskuri = new IntMeter(5, 0, 5);
601    public IntMeter ElamaLaskuri { get { return elamaLaskuri; } }
602
603    public Muuri(double leveys, double korkeus)
604        : base(leveys, korkeus)
605    {
606        elamaLaskuri.LowerLimit += delegate { this.Destroy(); };
607        this.Tag = "muuri";
608    }
609}
Note: See TracBrowser for help on using the repository browser.