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

Revision 5913, 11.7 KB checked in by otrolig, 7 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 tasokuva = LoadImage("Betoni");
31    Image seinakuva = LoadImage("seina");
32    Image zombikuva = LoadImage("zombi");
33    Image puukkokuva = LoadImage("puukko");
34    Image laatikkokuva = LoadImage("laatikko");
35    Image alienkuva = LoadImage("alien");
36    PhysicsObject puukko;
37    List<PhysicsObject> laatikkoLista = new List<PhysicsObject>();
38
39    SoundEffect maaliAani = LoadSoundEffect("maali");
40
41    public override void Begin()
42    {
43        Gravity = new Vector(0, -1450);
44        SmoothTextures = false;
45
46        LuoKentta();
47        LisaaNappaimet();
48        LisaaElamaLaskuri();
49        IsMouseVisible = true;
50        Camera.Follow(pelaaja1);
51        Camera.ZoomFactor = 1.5;
52        Camera.StayInLevel = true;
53
54        Timer esineAjastin = new Timer();
55        esineAjastin.Interval = RandomGen.NextInt(5, 10);
56        esineAjastin.Timeout += delegate
57        {
58            if (laatikkoLista.Count < 5)
59            {
60                esineAjastin.Interval = RandomGen.NextInt(5, 10);
61
62                PhysicsObject laatikko = new PhysicsObject(RUUDUN_KOKO, RUUDUN_KOKO);
63                laatikko.Position = new Vector(RandomGen.NextDouble(Level.Left, Level.Right), 500);
64                laatikko.Mass = 170.0;
65                laatikko.Image = laatikkokuva;
66                laatikko.Tag = "laatikko";
67                laatikkoLista.Add(laatikko);
68                Add(laatikko);
69            }
70        };
71        esineAjastin.Start();
72    }
73
74    void LuoKentta()
75    {
76        TileMap kentta = TileMap.FromLevelAsset("kentta1");
77        kentta.SetTileMethod('N', LisaaPelaaja);
78        kentta.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
79
80        TileMap kentta2 = TileMap.FromLevelAsset("kentta1");
81        kentta2.SetTileMethod('#', LisaaTaso);
82        kentta2.SetTileMethod('*', LisaaTahti);
83        kentta2.SetTileMethod('S', Lisaaseina);
84        kentta2.SetTileMethod('Z', Lisaazombi);
85        kentta2.SetTileMethod('A', LisaaAlien);
86        kentta2.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
87
88        Level.CreateBorders();
89
90
91        Level.Background.CreateGradient(Color.White, Color.SkyBlue);
92    }
93
94    void LisaaTaso(Vector paikka, double leveys, double korkeus)
95    {
96        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
97        taso.Position = paikka;
98        taso.Image = tasokuva;
99        taso.Tag = "Betoni";
100        Add(taso);
101    }
102
103    void Lisaaseina(Vector paikka, double leveys, double korkeus)
104    {
105        PhysicsObject seina = PhysicsObject.CreateStaticObject(leveys, korkeus);
106        seina.Position = paikka;
107        seina.Image = seinakuva;
108        seina.Tag = "seina";
109        Add(seina);
110    }
111
112    void LisaaTahti(Vector paikka, double leveys, double korkeus)
113    {
114        PhysicsObject tahti = PhysicsObject.CreateStaticObject(leveys, korkeus);
115        tahti.IgnoresCollisionResponse = true;
116        tahti.Position = paikka;
117        tahti.Image = tahtiKuva;
118        tahti.Tag = "tahti";
119        Add(tahti);
120    }
121
122    void LisaaPelaaja(Vector paikka, double leveys, double korkeus)
123    {
124        pelaaja1 = new PlatformCharacter(leveys - 5, korkeus * 2 - 5);
125        pelaaja1.Position = paikka;
126        pelaaja1.Mass = 20.0;
127        pelaaja1.Image = pelaajanKuva;
128        AddCollisionHandler(pelaaja1, "tahti", TormaaTahteen);
129        pelaaja1.AnimWalk = new Animation(pelaajankavely);
130        pelaaja1.AnimWalk.FPS = 7.5;
131        pelaaja1.AnimIdle = pelaajanKuva;
132       
133        pelaaja1.AnimJump = pelaajaJump;
134        pelaajaPutoaa = new Animation(pelaajanFall);
135        pelaaja1.AnimFall = pelaajaPutoaa;
136        pelaaja1.AnimFall.FPS = 7.5;
137        pelaaja1.LoopFallAnim = true;
138        pelaaja1.CollisionIgnoreGroup = 1;
139        elamat.LowerLimit +=new Action(ElamatLoppu);
140        pelaaja1.DirectionChanged += delegate
141        {
142            if (puukko != null) puukko.MirrorImage();
143        };
144
145        Add(pelaaja1, 1);
146    }
147
148    void LisaaElamaLaskuri()
149    {
150        Label pisteNaytto = new Label();
151        pisteNaytto.X = Screen.Left + 100;
152        pisteNaytto.Y = Screen.Bottom + 100;
153        pisteNaytto.TextColor = Color.Black;
154        pisteNaytto.Color = Color.White;
155
156        pisteNaytto.BindTo(elamat);
157        Add(pisteNaytto);
158
159    }
160
161    void ElamatLoppu()
162    {
163        MessageDisplay.Add("Kuolit");
164        pelaaja1.Destroy();
165    }
166
167    void Lisaazombi(Vector paikka, double leveys, double korkeus)
168    {
169        Zombi zombi = new Zombi(RUUDUN_KOKO - 5, RUUDUN_KOKO * 1.99 - 5);
170        zombi.Position = paikka;
171        zombi.Mass = 20.0;
172        zombi.Image = zombikuva;
173        zombi.CollisionIgnoreGroup = 1;
174        zombi.CanRotate = false;
175        zombi.Tag = "zombi";
176
177
178        RandomMoverBrain satunnaisAivot = new RandomMoverBrain(100);
179        FollowerBrain seurausaivot = new FollowerBrain(pelaaja1);
180       
181
182
183        //Ominaisuuksien muokkaaminen
184        satunnaisAivot.ChangeMovementSeconds = 5; 
185
186        //Aivot käyttöön oliolle
187        zombi.Brain = satunnaisAivot;
188
189
190        Timer ajastin = new Timer();
191        ajastin.Interval = RandomGen.NextDouble(1, 2);
192        bool liiku = true;
193        ajastin.Timeout += delegate
194        {
195            if (zombi.IsDestroyed)
196            {
197                ajastin.Stop();
198                return;
199            }
200
201            ajastin.Interval = RandomGen.NextDouble(1, 4);
202            if (Math.Abs(pelaaja1.Position.X - zombi.Position.X) < 450 && Math.Abs(pelaaja1.Position.Y - zombi.Position.Y) < 170 && !pelaaja1.IsDestroyed)
203            {
204                zombi.Brain = seurausaivot;
205            }
206            else
207            {
208                zombi.Brain = satunnaisAivot;
209                liiku = !liiku;
210                satunnaisAivot.Active = liiku;
211            }
212
213        };
214        ajastin.Start();
215
216        Timer tarkistaOsuma = new Timer();
217        tarkistaOsuma.Interval = 0.5;
218        tarkistaOsuma.Timeout += delegate
219        {
220            if (zombi.IsDestroyed)
221            {
222                tarkistaOsuma.Stop();
223                return;
224            }
225            if (Vector.Distance(zombi.Position, pelaaja1.Position) < RUUDUN_KOKO) elamat.Value -= 4;
226        };
227        tarkistaOsuma.Start();
228
229
230        zombi.AnimWalk = new Animation(zombikavely);
231        zombi.AnimWalk.FPS = 3.5;
232        zombi.AnimIdle = zombikuva;
233
234        //zombi.AnimJump = pelaajaJump;
235        //zombi.AnimFall = new Animation(zombiFall);
236        //zombi.AnimFall.FPS = 7.5;
237        //zombi.LoopFallAnim = true;
238        Add(zombi);
239    }
240
241    void LisaaAlien(Vector paikka, double leveys, double korkeus)
242    {
243        PlatformCharacter alien = new PlatformCharacter(76, 42);
244        alien.Mass = 10.0;
245        alien.Position = paikka;
246        alien.Image = alienkuva;
247        alien.CollisionIgnoreGroup = 1;
248        alien.CanRotate = false;
249        alien.Tag = "alien";
250        Add(alien);
251}
252
253    void LisaaNappaimet()
254    {
255        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
256        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
257
258        Keyboard.Listen(Key.A, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, -nopeus);
259        Keyboard.Listen(Key.D, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, nopeus);
260        Keyboard.Listen(Key.W, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
261
262        Keyboard.Listen(Key.E, ButtonState.Pressed, AvaaLaatikko, "Avaa laatikko");
263
264        ControllerOne.Listen(Button.Back, ButtonState.Pressed, Exit, "Poistu pelistä");
265
266        Mouse.Listen(MouseButton.Left, ButtonState.Pressed, Käytä, "käyttää esinettä", pelaaja1);
267
268        ControllerOne.Listen(Button.DPadLeft, ButtonState.Down, Liikuta, "Pelaaja liikkuu vasemmalle", pelaaja1, -nopeus);
269        ControllerOne.Listen(Button.DPadRight, ButtonState.Down, Liikuta, "Pelaaja liikkuu oikealle", pelaaja1, nopeus);
270        ControllerOne.Listen(Button.A, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
271
272        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
273    }
274
275    void Liikuta(PlatformCharacter hahmo, double nopeus)
276    {
277        hahmo.Walk(nopeus);
278    }
279
280    void Hyppaa(PlatformCharacter hahmo, double nopeus)
281    {
282        hahmo.Jump(nopeus);
283    }
284
285    void TormaaTahteen(PhysicsObject hahmo, PhysicsObject tahti)
286    {
287        maaliAani.Play();
288        MessageDisplay.Add("Keräsit tähden!");
289        tahti.Destroy();
290    }
291
292    void Käytä(PlatformCharacter hahmo)
293    {
294        //switch (ase)
295        //{
296        //    case "puukko":
297               
298               
299               
300               
301        //        break;
302        //    case "pistooli":
303        //        break;
304
305        //}
306       
307        if (puukko == null && pelaaja1.Animation != pelaajaPutoaa && pelaaja1.Image != pelaajaJump)
308        {
309            puukko = new PhysicsObject(20, 10);
310            puukko.Image = puukkokuva;
311
312
313            puukko.IgnoresCollisionResponse = true;
314            puukko.IgnoresGravity = true;
315            AddCollisionHandler(puukko, "zombi", PuukkoOsui);
316            if (hahmo.FacingDirection == Direction.Left) puukko.MirrorImage();
317            Add(puukko);
318
319            Animation puukotus = new Animation(puukotuskuva);
320            puukotus.FPS = 1;
321            puukotus.Start(1);
322            pelaaja1.AnimIdle = puukotus;
323
324            Timer.SingleShot(0.3, delegate { pelaaja1.AnimIdle = pelaajanKuva; puukko.Destroy(); });
325
326
327
328            Timer ajastin = new Timer();
329            ajastin.Interval = 0.01;
330            ajastin.Timeout += delegate
331            {
332                if (puukko.IsDestroyed)
333                {
334                    ajastin.Stop();
335                    puukko = null;
336                    return;
337                }
338                puukko.Position = hahmo.Position + hahmo.FacingDirection.GetVector() * 22;
339
340            };
341            ajastin.Start();
342        }
343    }
344
345    void PuukkoOsui(PhysicsObject puukko, PhysicsObject vihu)
346    {
347        Zombi zombi = (Zombi)vihu;
348        zombi.ElamaLaskuri.Value -= 4.5;
349    }
350
351    void AvaaLaatikko()
352    {
353        PhysicsObject lahinLaatikko = null;
354
355        foreach (PhysicsObject laatikko in laatikkoLista)
356        {
357            if (Vector.Distance(pelaaja1.Position, laatikko.Position) < 65) lahinLaatikko = laatikko;
358        }
359
360        if (lahinLaatikko != null)
361        {
362            lahinLaatikko.Destroy();
363            laatikkoLista.Remove(lahinLaatikko);
364        }
365    }
366}
367
368
369class Zombi : PlatformCharacter
370{
371    private DoubleMeter elamaLaskuri = new DoubleMeter(15, 0, 15);
372    public DoubleMeter ElamaLaskuri { get { return elamaLaskuri; } }
373
374    public Zombi(double leveys, double korkeus)
375        : base(leveys, korkeus)
376    {
377        elamaLaskuri.LowerLimit += delegate { this.Destroy(); };
378    }
379}
380
381
382
Note: See TracBrowser for help on using the repository browser.