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

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