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

Revision 5846, 11.3 KB checked in by sieerinn, 5 years ago (diff)

:D

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