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

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