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

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