source: 2014/koodauskerho/38/OttoR/Last Light/Last Light/Last Light/Last_Light.cs @ 6030

Revision 6030, 18.6 KB checked in by otrolig, 5 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 Last_Light : PhysicsGame
10{
11
12    const double nopeus = 165;
13    const double hyppyNopeus = 850;
14    const int RUUDUN_KOKO = 40;
15    const int ZOMBI_SPAWN_AIKA = 3;
16
17
18
19    PlatformCharacter pelaaja1;
20    GameObject TAHTAIN;
21
22    Direction edellinenKavelysuunta = Direction.Right;
23    IntMeter elamat = new IntMeter(100, 0, 100);
24    IntMeter tappomittari = new IntMeter(0);
25    List<Vector> Zombienpaikat = new List<Vector>();
26
27
28    Image puukotuskuva = LoadImage("puukotus");
29    Image[] zombikavely = LoadImages("zombi1", "zombi2");
30    Image pelaajaJump = LoadImage("pelaajaJump");
31    Image pelaajanKuva = LoadImage("pelaaja");
32    Image tahtiKuva = LoadImage("tahti");
33    Image[] pelaajankavely = LoadImages("pelaaja1", "pelaaja2");
34    Image[] pelaajanFall = LoadImages("pelaajaFall1", "pelaajaFall2");
35    Animation pelaajaPutoaa;
36    Image Hiirikuva = LoadImage("TAHTAIN");
37    Image tasokuva = LoadImage("Betoni");
38    Image seinakuva = LoadImage("seina");
39    Image zombikuva = LoadImage("zombi");
40    Image puukkokuva = LoadImage("puukko");
41    Image laatikkokuva = LoadImage("laatikko");
42    Image LootaKuva = LoadImage("LootaKuva");
43    Image alienkuva = LoadImage("alien");
44    Image uzikuva = LoadImage("Uzi");
45    Image luotikuva = LoadImage("ammus");
46    Image TAHTAINkuva = LoadImage("TAHTAIN");
47    Image sydankuva = LoadImage("sydan");
48    Image tappokuva = LoadImage("tapot");
49    Image[] sydanKuvat = LoadImages("sydan", "sydan1", "sydan2","sydan3");
50   
51    PhysicsObject puukko;
52    Label sydamenKuva;
53    AssaultRifle pelaajan1Ase;
54    List<PhysicsObject> laatikkoLista = new List<PhysicsObject>();
55
56    SoundEffect maaliAani = LoadSoundEffect("maali");
57
58    public override void Begin()
59    {
60        Gravity = new Vector(0, -1400);
61        SmoothTextures = false;
62        IsMouseVisible = true;
63
64        LuoKentta();
65        LisaaNappaimet();
66        LisaaElamaLaskuri();
67        LisaaTappoLaskuri();
68        LisaaZombiAjastin();
69
70
71        LisaaHiiriKuva();
72        IsMouseVisible = false;
73        Camera.Follow(pelaaja1);
74        Camera.ZoomFactor = 1.2;
75        Camera.StayInLevel = true;
76
77        Timer esineAjastin = new Timer();
78        esineAjastin.Interval = RandomGen.NextInt(5, 10);
79        esineAjastin.Timeout += delegate
80        {
81            if (laatikkoLista.Count < 5)
82            {
83                esineAjastin.Interval = RandomGen.NextInt(5, 10);
84               
85                PhysicsObject laatikko = new PhysicsObject(RUUDUN_KOKO, RUUDUN_KOKO);
86                laatikko.Position = new Vector(RandomGen.NextDouble(Level.Left, Level.Right), 500);
87                laatikko.Mass = 10.0;
88                laatikko.Image = laatikkokuva;
89                laatikko.Tag = "laatikko";
90                laatikkoLista.Add(laatikko);
91                Add(laatikko);
92            }
93        };
94        esineAjastin.Start();
95    }
96
97    void LuoKentta()
98    {
99        TileMap kentta = TileMap.FromLevelAsset("kentta1");
100        kentta.SetTileMethod('N', LisaaPelaaja);
101        kentta.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
102
103        TileMap kentta2 = TileMap.FromLevelAsset("kentta1");
104        kentta2.SetTileMethod('#', LisaaTaso);
105        kentta2.SetTileMethod('*', LisaaTahti);
106        kentta2.SetTileMethod('S', Lisaaseina);
107        kentta2.SetTileMethod('Z', Lisaazombi);
108        kentta2.SetTileMethod('A', LisaaAlien);
109        kentta2.SetTileMethod('L', LisaaLoota);
110        kentta2.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
111       
112        Level.CreateBorders();
113
114
115
116        Level.Background.CreateGradient(Color.White, Color.SkyBlue);
117    }
118    void SpawnaaZombeja()
119    {
120        List<Vector> sopivatPaikat = new List<Vector>();
121
122        foreach (Vector paikka in Zombienpaikat)
123        {
124            if ((pelaaja1.Position - paikka).Magnitude > Screen.Width * 0.5)
125            {
126                sopivatPaikat.Add(paikka);
127            }
128        }
129
130        ZombinLuonti(sopivatPaikat[RandomGen.NextInt(sopivatPaikat.Count)], pelaaja1.Width, pelaaja1.Height);
131
132    }
133    void LisaaZombiAjastin()
134    {
135        Timer Zombiajastin = new Timer();
136        Zombiajastin.Interval = ZOMBI_SPAWN_AIKA;
137        Zombiajastin.Timeout += SpawnaaZombeja;
138        Zombiajastin.Start();
139    }
140    void LisaaHiiriKuva()
141    {
142        TAHTAIN = new GameObject(20, 20);
143        TAHTAIN.Image = TAHTAINkuva;
144        Add(TAHTAIN, 1);
145
146        Mouse.ListenMovement(0.0, LiikutaTAHTAIN, null);
147    }
148
149    void LiikutaTAHTAIN(AnalogState Hiiri)
150    {
151        TAHTAIN.Position += Hiiri.MouseMovement;
152
153        //double raja = Camera.ScreenToWorld(new Vector(Window.ClientBounds.Width, Window.ClientBounds.Height)).Y;
154        //Vector suunta = TAHTAIN.Position - pelaaja1.Position;
155        //if (suunta.Magnitude > raja)
156        //{
157          //  TAHTAIN.Position = pelaaja1.Position + suunta.Normalize() * raja;
158        //}
159
160        /*
161        Vector min = Camera.ScreenToWorld(new Vector(Screen.Left, Screen.Bottom));
162        Vector max = Camera.ScreenToWorld(new Vector(Screen.Right, Screen.Top));
163
164        if (TAHTAIN.X < min.X) TAHTAIN.X = min.X;
165        if (TAHTAIN.Y < min.Y) TAHTAIN.X = min.Y;
166        if (TAHTAIN.X > max.X) TAHTAIN.X = max.X;
167        if (TAHTAIN.X > max.Y) TAHTAIN.X = max.Y;
168        */
169    }
170   
171    void LisaaTaso(Vector paikka, double leveys, double korkeus)
172    {
173        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
174        taso.Position = paikka;
175        taso.Image = tasokuva;
176        taso.Tag = "Betoni";
177        Add(taso);
178    }
179
180    void LisaaLoota(Vector paikka, double leveys, double korkeus)
181    {
182        Loota loota = new Loota (leveys, korkeus);
183        loota.Position = paikka;
184        loota.Mass = 20.0;
185        loota.Image = LootaKuva;
186        loota.Tag = "loota";
187        Add(loota);
188    }
189    void Lisaaseina(Vector paikka, double leveys, double korkeus)
190    {
191        Seina seina = new Seina (leveys, korkeus);
192        seina.MakeStatic();
193        seina.Position = paikka;
194        seina.Image = seinakuva;
195        seina.Tag = "seina";
196        Add(seina);
197    }
198
199    void LisaaTahti(Vector paikka, double leveys, double korkeus)
200    {
201        PhysicsObject tahti = PhysicsObject.CreateStaticObject(leveys, korkeus);
202        tahti.IgnoresCollisionResponse = true;
203        tahti.Position = paikka;
204        tahti.Image = tahtiKuva;
205        tahti.Tag = "tahti";
206        Add(tahti);
207    }
208
209    void LisaaPelaaja(Vector paikka, double leveys, double korkeus)
210    {
211        pelaaja1 = new PlatformCharacter(leveys - 5, korkeus * 2 - 5);
212        pelaaja1.Position = paikka;
213        pelaaja1.Mass = 20.0;
214        pelaaja1.Image = pelaajanKuva;
215        AddCollisionHandler(pelaaja1, "tahti", TormaaTahteen);
216        pelaaja1.AnimWalk = new Animation(pelaajankavely);
217        pelaaja1.AnimWalk.FPS = 7.5;
218        pelaaja1.AnimIdle = pelaajanKuva;
219       
220        pelaaja1.AnimJump = pelaajaJump;
221        pelaajaPutoaa = new Animation(pelaajanFall);
222        pelaaja1.AnimFall = pelaajaPutoaa;
223        pelaaja1.AnimFall.FPS = 7.5;
224        pelaaja1.LoopFallAnim = true;
225        pelaaja1.CollisionIgnoreGroup = 1;
226        elamat.LowerLimit +=new Action(ElamatLoppu);
227        pelaaja1.DirectionChanged += delegate
228        {
229            if (puukko != null) puukko.MirrorImage();
230        };
231
232        Add(pelaaja1, 1);
233    }
234
235    void LisaaElamaLaskuri()
236    {
237        Label pisteNaytto = new Label();
238        pisteNaytto.X = Screen.Left + 100;
239        pisteNaytto.Y = Screen.Bottom + 100;
240        pisteNaytto.TextColor = Color.Black;
241        pisteNaytto.Color = Color.White;
242       
243       pisteNaytto.BindTo(elamat);
244       Add(pisteNaytto);
245       sydamenKuva = new Label();
246       sydamenKuva.Image = sydankuva;
247       sydamenKuva.X = Screen.Left + 50;
248       sydamenKuva.Y = Screen.Bottom + 100;
249       sydamenKuva.Width = sydankuva.Width *3;
250       sydamenKuva.Height = sydankuva.Height *3;
251        Add(sydamenKuva);
252    }
253
254    void LisaaTappoLaskuri()
255    {
256        Label tapot = new Label();
257        tapot.BindTo(tappomittari);
258        tapot.X = Screen.Left + 200;
259        tapot.Y = Screen.Bottom + 100;
260       
261        Add(tapot);
262
263        Label tapotkuva = new Label();
264        tapotkuva.Image = tappokuva;
265        tapotkuva.Width = sydankuva.Width * 3;
266        tapotkuva.Height = sydankuva.Height * 3;
267        tapotkuva.X = Screen.Left + 155;
268        tapotkuva.Y = Screen.Bottom + 100;
269
270        Add(tapotkuva);
271    }
272
273    void ElamatLoppu()
274    {
275        MessageDisplay.Add("Kuolit");
276        pelaaja1.Destroy();
277    }
278
279    void Lisaazombi(Vector paikka, double leveys, double korkeus)
280    {
281        Zombienpaikat.Add(paikka);
282
283       
284        ZombinLuonti(paikka, leveys, korkeus);
285
286       
287    }
288
289    void ZombinLuonti(Vector paikka, double width, double height)
290    {
291        if (RandomGen.NextInt(100) < 0)
292        {
293            return;
294        }
295
296        Zombi zombi = new Zombi(RUUDUN_KOKO - 5, RUUDUN_KOKO * 1.99 - 5);
297        zombi.Position = paikka;
298        zombi.Mass = 20.0;
299        zombi.Image = zombikuva;
300        zombi.CollisionIgnoreGroup = 1;
301        zombi.CanRotate = false;
302        zombi.Tag = "zombi";
303
304
305        PlatformWandererBrain satunnaisAivot = new PlatformWandererBrain();
306        FollowerBrain seurausaivot = new FollowerBrain(pelaaja1);
307        satunnaisAivot.TriesToJump = true;
308
309
310        //Ominaisuuksien muokkaaminen
311        //satunnaisAivot.ChangeMovementSeconds = 5;
312
313
314        //Aivot käyttöön oliolle
315        zombi.Brain = satunnaisAivot;
316
317
318
319        Timer ajastin = new Timer();
320        ajastin.Interval = RandomGen.NextDouble(1, 2);
321        bool liiku = true;
322        ajastin.Timeout += delegate
323        {
324            if (zombi.IsDestroyed)
325            {
326                ajastin.Stop();
327                tappomittari.Value++;
328                return;
329            }
330
331            ajastin.Interval = RandomGen.NextDouble(1, 4);
332            if (Math.Abs(pelaaja1.Position.X - zombi.Position.X) < 450 && Math.Abs(pelaaja1.Position.Y - zombi.Position.Y) < 170 && !pelaaja1.IsDestroyed)
333            {
334                zombi.Brain = seurausaivot;
335            }
336            else
337            {
338                zombi.Brain = satunnaisAivot;
339                liiku = !liiku;
340                satunnaisAivot.Active = liiku;
341            }
342
343        };
344        ajastin.Start();
345
346        Timer tarkistaOsuma = new Timer();
347        tarkistaOsuma.Interval = 0.5;
348        tarkistaOsuma.Timeout += delegate
349        {
350            if (zombi.IsDestroyed)
351            {
352                tarkistaOsuma.Stop();
353                return;
354            }
355            if (Vector.Distance(zombi.Position, pelaaja1.Position) < RUUDUN_KOKO)
356            {
357                elamat.Value -= 4;
358                if (elamat.Value < 20)
359                {
360                    sydamenKuva.Image = sydanKuvat[3];
361                }
362                else if (elamat.Value < 50)
363                {
364                    sydamenKuva.Image = sydanKuvat[2];
365                }
366                else if (elamat.Value < 70)
367                {
368                    sydamenKuva.Image = sydanKuvat[1];
369                }
370            }
371        };
372        tarkistaOsuma.Start();
373
374
375        zombi.AnimWalk = new Animation(zombikavely);
376        zombi.AnimWalk.FPS = 3.5;
377        zombi.AnimIdle = zombikuva;
378
379        //zombi.AnimJump = pelaajaJump;
380        //zombi.AnimFall = new Animation(zombiFall);
381        //zombi.AnimFall.FPS = 7.5;
382        //zombi.LoopFallAnim = true;
383        Add(zombi);
384    }
385
386    void LisaaAlien(Vector paikka, double leveys, double korkeus)
387    {
388        PlatformCharacter alien = new PlatformCharacter(76, 42);
389        alien.Mass = 10.0;
390        alien.Position = paikka;
391        alien.Image = alienkuva;
392        alien.CollisionIgnoreGroup = 1;
393        alien.CanRotate = false;
394        alien.Tag = "alien";
395        Add(alien);
396}
397
398    void LisaaNappaimet()
399    {
400        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
401        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
402
403        Keyboard.Listen(Key.A, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, -nopeus);
404        Keyboard.Listen(Key.D, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, nopeus);
405        Keyboard.Listen(Key.W, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
406
407        Keyboard.Listen(Key.E, ButtonState.Pressed, AvaaLaatikko, "Avaa laatikko");
408
409        ControllerOne.Listen(Button.Back, ButtonState.Pressed, Exit, "Poistu pelistä");
410
411        Mouse.Listen(MouseButton.Left, ButtonState.Pressed, Käytä, "käyttää esinettä", pelaaja1);
412        Mouse.ListenMovement(0.0, HiirenLiikutus, "tähtää");
413
414        ControllerOne.Listen(Button.DPadLeft, ButtonState.Down, Liikuta, "Pelaaja liikkuu vasemmalle", pelaaja1, -nopeus);
415        ControllerOne.Listen(Button.DPadRight, ButtonState.Down, Liikuta, "Pelaaja liikkuu oikealle", pelaaja1, nopeus);
416        ControllerOne.Listen(Button.A, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
417
418        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
419    }
420
421    void Liikuta(PlatformCharacter hahmo, double nopeus)
422    {
423        hahmo.Walk(nopeus);
424    }
425
426    void Hyppaa(PlatformCharacter hahmo, double nopeus)
427    {
428        hahmo.Jump(nopeus);
429    }
430
431    void TormaaTahteen(PhysicsObject hahmo, PhysicsObject tahti)
432    {
433        maaliAani.Play();
434        MessageDisplay.Add("Keräsit tähden!");
435        tahti.Destroy();
436    }
437
438    void HiirenLiikutus(AnalogState Hiiri)
439    {
440       
441
442        if (pelaajan1Ase != null)
443        {
444            pelaajan1Ase.AbsoluteAngle = (TAHTAIN.Position - pelaaja1.Position).Angle;
445        }
446    }
447    void Käytä(PlatformCharacter hahmo)
448    {
449        if (elamat.Value == elamat.MinValue)
450        {
451            return;
452        }
453
454        if (pelaajan1Ase != null)
455        {
456            PhysicsObject ammus = pelaajan1Ase.Shoot();
457
458            if (ammus != null)
459            {
460                ammus.CollisionIgnoreGroup = 2;
461                ammus.Size *=1 ;
462                ammus.Image = luotikuva;
463                ammus.MaximumLifetime = TimeSpan.FromSeconds(20.0);
464            }
465
466        }
467        else if (puukko == null && pelaaja1.Animation != pelaajaPutoaa && pelaaja1.Image != pelaajaJump)
468        {
469            puukko = new PhysicsObject(20, 10);
470            puukko.Image = puukkokuva;
471
472            puukko.IgnoresCollisionResponse = true;
473            puukko.IgnoresGravity = true;
474            AddCollisionHandler(puukko, "zombi", PuukkoOsui);
475            AddCollisionHandler(puukko, "seina", SeinaanOsui);
476            AddCollisionHandler(puukko, "loota", LootaanOsui);
477            if (hahmo.FacingDirection == Direction.Left) puukko.MirrorImage();
478            Add(puukko);
479
480            Animation puukotus = new Animation(puukotuskuva);
481            puukotus.FPS = 1;
482            puukotus.Start(1);
483            pelaaja1.AnimIdle = puukotus;
484
485            Timer.SingleShot(0.3, delegate { pelaaja1.AnimIdle = pelaajanKuva; puukko.Destroy(); });
486
487            Timer ajastin = new Timer();
488            ajastin.Interval = 0.01;
489            ajastin.Timeout += delegate
490            {
491                if (puukko.IsDestroyed)
492                {
493                    ajastin.Stop();
494                    puukko = null;
495                    return;
496                }
497                puukko.Position = hahmo.Position + hahmo.FacingDirection.GetVector() * 22;
498
499            };
500            ajastin.Start();
501        }
502    }
503
504    void PuukkoOsui(PhysicsObject puukko, PhysicsObject vihu)
505    {
506        Zombi zombi = (Zombi)vihu;
507        zombi.ElamaLaskuri.Value -= 4.5;
508
509       
510    }
511    void SeinaanOsui(PhysicsObject puukko, PhysicsObject kohdeseina)
512    {
513        Seina seina = (Seina)kohdeseina;
514        seina.ElamaLaskuri.Value -= 4;
515    }
516
517    void LootaanOsui(PhysicsObject puukko, PhysicsObject kohdeloota)
518    {
519        Loota loota = (Loota)kohdeloota;
520        loota.ElamaLaskuri.Value -= 4;
521   
522    }
523    void AvaaLaatikko()
524    {
525        PhysicsObject lahinLaatikko = null;
526
527        foreach (PhysicsObject laatikko in laatikkoLista)
528        {
529            if (Vector.Distance(pelaaja1.Position, laatikko.Position) < 65) lahinLaatikko = laatikko;
530        }
531
532        if (lahinLaatikko != null)
533        {
534            lahinLaatikko.Destroy();
535            laatikkoLista.Remove(lahinLaatikko);
536            PoimiAse();
537        }
538    }
539
540    void PoimiAse()
541    {
542        if (pelaajan1Ase != null)
543        {
544            pelaajan1Ase.Destroy();
545        }
546
547        pelaajan1Ase = new AssaultRifle(23, 20);
548        pelaajan1Ase.InfiniteAmmo = true;
549        pelaajan1Ase.ProjectileCollision = AmmusOsui;
550        pelaaja1.Add(pelaajan1Ase);
551        pelaajan1Ase.Image = uzikuva;
552       
553
554    }
555
556    void AmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
557    {
558        ammus.Destroy();
559
560        if (kohde is Seina)
561        {
562            Seina seina = (Seina)kohde;
563            seina.ElamaLaskuri.Value -= 5.0;
564
565       
566        }
567        if (kohde is Zombi)
568        {
569            Zombi zombi = (Zombi)kohde;
570            zombi.ElamaLaskuri.Value -= 5.0;
571        }
572           
573   
574        if (kohde is Loota)
575        {
576        Loota loota = (Loota)kohde;
577        loota.ElamaLaskuri.Value -= 5.0;
578       
579        }
580
581
582}
583
584
585class Zombi : PlatformCharacter
586{
587    private DoubleMeter elamaLaskuri = new DoubleMeter(15, 0, 15);
588    public DoubleMeter ElamaLaskuri { get { return elamaLaskuri; } }
589
590    public Zombi(double leveys, double korkeus)
591        : base(leveys, korkeus)
592    {
593        elamaLaskuri.LowerLimit += delegate { this.Destroy(); };
594    }
595
596 
597}
598class Seina : PhysicsObject
599{
600    private DoubleMeter elamaLaskuri = new DoubleMeter(25, 0, 25);
601    public DoubleMeter ElamaLaskuri { get { return elamaLaskuri; } }
602
603    public Seina(double leveys, double korkeus)
604        : base(leveys, korkeus)
605    {
606        elamaLaskuri.LowerLimit += delegate { this.Destroy(); };
607    }
608}
609class Loota : PhysicsObject
610{
611    private DoubleMeter elamaLaskuri = new DoubleMeter(20, 0, 20);
612    public DoubleMeter ElamaLaskuri { get { return elamaLaskuri; } }
613
614    public Loota(double leveys, double korkeus)
615        : base(leveys, korkeus)
616    {
617        elamaLaskuri.LowerLimit += delegate { this.Destroy(); };
618    }
619
620}
621
622}
623
624
625
Note: See TracBrowser for help on using the repository browser.