source: 2016/23/MiroN/Tasohyppelypeli1/Tasohyppelypeli1/Tasohyppelypeli1/Tasohyppelypeli1.cs @ 7235

Revision 7235, 12.5 KB checked in by jotapoti, 3 years ago (diff)

Hero Jumper

Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9public class Tasohyppelypeli1 : PhysicsGame
10{
11    const double nopeus = 200;
12    const double hyppyNopeus = 750;
13    const int RUUDUN_KOKO = 40;
14
15    Image taustakuva = LoadImage("City");
16
17    private Animation ukkelinkavelu;
18    private Animation herohyppy;
19    private Animation heropunch;
20    private Animation badguykavelu;
21
22    Pelihahmo pelaaja1;
23    DoubleMeter aika = new DoubleMeter(0);
24
25    Timer aikaLaskuri;
26
27    Image pelaajanKuva = LoadImage("Hero");
28    Image tahtiKuva = LoadImage("tahti");
29    Image tasonkuva = LoadImage("Blockie");
30
31
32    bool lyontiMenossa = false;
33
34
35    SoundEffect maaliAani = LoadSoundEffect("maali");
36
37    Image vihollisenkuva = LoadImage("Badguy1");
38    private Animation ammuskeluanimaatio;
39
40    Image lipunkuva = LoadImage("Flag");
41    Image platforminkuva = LoadImage("Platform1");
42
43    ScoreList topLista = new ScoreList(10, true, 99999);
44
45    int Kenttanumero = 1;
46
47    //TODO scoreboard
48    //TODO aloitusnauttio
49    //TODO texturechnaget
50
51
52
53
54    public override void Begin()
55    {
56        topLista = DataStorage.TryLoad<ScoreList>(topLista, "pisteet.xml");
57
58        SeuraavaKentta();
59    }
60
61    void SeuraavaKentta()
62    {
63        ClearAll();
64        Gravity = new Vector(0, -1000);
65
66        LuoKentta();
67        LisaaNappaimet();
68
69        SmoothTextures = false;
70        Camera.Follow(pelaaja1);
71        Camera.ZoomFactor = 2.0;
72        Camera.StayInLevel = true;
73
74    }
75
76    void LuoKentta()
77    {
78        if (Kenttanumero > 5)
79        {
80            Voitit();
81            return;
82        }
83        TileMap kentta = TileMap.FromLevelAsset("kentta" + Kenttanumero);
84        kentta.SetTileMethod('#', LisaaLattia);
85        kentta.SetTileMethod('M', LisaaMaali);
86        kentta.SetTileMethod('N', LisaaPelaaja);
87        kentta.SetTileMethod('P', LisaaPlatform);
88        kentta.Optimize('#');
89        kentta.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
90
91        TileMap vihuKentta = TileMap.FromLevelAsset("kentta" + Kenttanumero);
92        vihuKentta.SetTileMethod('V', LisaaVihollinen);
93        vihuKentta.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
94
95        Level.CreateBorders();
96        Level.Background.Image = taustakuva;
97        Level.Background.FitToLevel();
98        Level.Background.TextureWrapSize = new Vector(6, 1);
99
100        LuoElamaLaskuri();
101        LuoAikaLaskuri();
102        //TODO Erilaiset tasot
103        //evel.Height = 180;
104        //Lvel.Width = 320;
105
106    }
107
108    void LisaaPlatform(Vector paikka, double leveys, double korkeus)
109    {
110        PhysicsObject platform = PhysicsObject.CreateStaticObject(leveys, korkeus);
111        platform.Position = paikka;
112        platform.Image = platforminkuva;
113        Add(platform);
114    }
115
116    void TormaaMaaliin(PhysicsObject pelaaja, PhysicsObject maali)
117    {
118        Kenttanumero++;
119        SeuraavaKentta();
120
121    }
122
123    void LisaaLattia(Vector paikka, double leveys, double korkeus)
124    {
125        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
126        taso.Position = paikka;
127        taso.Image = tasonkuva;
128        taso.TextureWrapSize = new Vector(leveys / RUUDUN_KOKO, korkeus / RUUDUN_KOKO);
129        Add(taso);
130    }
131
132
133    void LisaaMaali(Vector paikka, double leveys, double korkeus)
134    {
135        PhysicsObject lippu = PhysicsObject.CreateStaticObject(leveys, korkeus);
136        lippu.IgnoresCollisionResponse = true;
137        lippu.Position = paikka;
138        lippu.Image = lipunkuva;
139        lippu.Tag = "lippu";
140        Add(lippu);
141    }
142
143    void LisaaPelaaja(Vector paikka, double leveys, double korkeus)
144    {
145        ukkelinkavelu = LoadAnimation("HeroAnimation");
146        herohyppy = LoadAnimation("HeroJump");
147        heropunch = LoadAnimation("HeroPunch");
148        pelaaja1 = new Pelihahmo(leveys, korkeus, 3, paikka);
149        pelaaja1.Position = paikka;
150        pelaaja1.Mass = 4.0;
151        pelaaja1.Image = pelaajanKuva;
152        AddCollisionHandler(pelaaja1, "lippu", TormaaMaaliin);
153        LataaNormaalitAnimaatiot();
154        pelaaja1.Tag = "pelaaja1";
155        pelaaja1.Weapon = new AssaultRifle(30, 10);
156        pelaaja1.Weapon.ProjectileCollision = AmmusOsui;
157        pelaaja1.Weapon.FireRate = 10;
158        pelaaja1.Weapon.CanHitOwner = false;
159        pelaaja1.Weapon.Image = null;
160        pelaaja1.Weapon.Color = Color.Transparent;
161        pelaaja1.Weapon.AttackSound = null;
162        pelaaja1.Weapon.X = 0.0;
163        pelaaja1.Weapon.Y = 0.0;
164
165
166        Add(pelaaja1);
167    }
168    void PelaajaAmpuu()
169    {
170        if (pelaaja1.Weapon != null)
171        {
172            pelaaja1.Weapon.Power.Value = 50;
173            PhysicsObject ammus = pelaaja1.Weapon.Shoot();
174
175
176            if (ammus != null)
177            {
178                ammus.LifetimeLeft = TimeSpan.FromSeconds(0.1);
179                ammus.CollisionIgnoreGroup = 54;
180                ammus.Image = null;
181                ammus.Color = Color.Transparent;
182            }
183        }
184    }
185
186
187    void LisaaNappaimet()
188    {
189        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
190        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
191
192        Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, -nopeus);
193        Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, nopeus);
194        Keyboard.Listen(Key.Up, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
195
196        Keyboard.Listen(Key.Space, ButtonState.Released, Lyo, "Pelaaja lyö", pelaaja1);
197
198
199
200        ControllerOne.Listen(Button.Back, ButtonState.Pressed, Exit, "Poistu pelistä");
201
202        ControllerOne.Listen(Button.DPadLeft, ButtonState.Down, Liikuta, "Pelaaja liikkuu vasemmalle", pelaaja1, -nopeus);
203        ControllerOne.Listen(Button.DPadRight, ButtonState.Down, Liikuta, "Pelaaja liikkuu oikealle", pelaaja1, nopeus);
204        ControllerOne.Listen(Button.A, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
205
206        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
207    }
208
209    void Liikuta(PlatformCharacter hahmo, double nopeus)
210    {
211        hahmo.Walk(nopeus);
212    }
213
214    void Hyppaa(PlatformCharacter hahmo, double nopeus)
215    {
216        hahmo.Jump(nopeus);
217    }
218
219    void Lyo(PlatformCharacter hahmo)
220    {
221
222
223        if (lyontiMenossa == false)
224        {
225
226
227            hahmo.Animation = heropunch;
228            hahmo.AnimIdle = heropunch;
229            hahmo.AnimWalk = null;
230            hahmo.Animation.Start(1);
231            Timer.SingleShot(0.5, LataaNormaalitAnimaatiot);
232            lyontiMenossa = true;
233            PelaajaAmpuu();
234        }
235    }
236
237    void LataaNormaalitAnimaatiot()
238    {
239        pelaaja1.Animation = new Animation(ukkelinkavelu);
240        pelaaja1.Animation = new Animation(herohyppy);
241        pelaaja1.AnimWalk = new Animation(ukkelinkavelu);
242        pelaaja1.AnimIdle = new Animation(pelaajanKuva);
243        pelaaja1.AnimJump = new Animation(herohyppy);
244        lyontiMenossa = false;
245        //MessageDisplay.Add("lyonti loppui");
246    }
247
248
249
250
251    void LisaaVihollinen(Vector paikka, double leveys, double korkeus)
252    {
253        badguykavelu = LoadAnimation("walking");
254        Pelihahmo badguy = new Pelihahmo(leveys, korkeus, 2, paikka);
255        badguy.Tag = "badguy";
256        badguy.Image = vihollisenkuva;
257        badguy.Position = paikka;
258        badguy.Mass = 4.0;
259        badguy.Animation = new Animation(badguykavelu);
260        badguy.AnimWalk = new Animation(badguykavelu);
261
262        badguy.Weapon = new AssaultRifle(30, 10);
263        badguy.Weapon.InfiniteAmmo = true;
264        badguy.Weapon.ProjectileCollision = VihollisenAmmusOsui;
265        badguy.Weapon.FireRate = 0.5;
266        badguy.Weapon.CanHitOwner = false;
267        badguy.Weapon.Image = null;
268        badguy.Weapon.Color = Color.Transparent;
269        badguy.Weapon.AttackSound = null;
270        badguy.Weapon.X = 0.0;
271        badguy.Weapon.Y = 0.0;
272        badguy.elamaLaskuri.LowerLimit += delegate { VihollisenElamaLoppui(badguy); };
273
274
275        badguy.Brain = VihollisenAivot(badguy);
276
277        Add(badguy);
278
279        //TODO vihollisille health bar
280
281    }
282    void VihollisenAmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
283    {
284        if (kohde.Tag.Equals("pelaaja1"))
285        {
286            (kohde as Pelihahmo).elamaLaskuri.Value--;
287
288        }
289
290        ammus.Destroy();
291    }
292    void AmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
293    {
294        if (kohde.Tag.Equals("badguy"))
295        {
296            (kohde as Pelihahmo).elamaLaskuri.Value--;
297
298        }
299
300        ammus.Destroy();
301    }
302
303    Brain VihollisenAivot(Pelihahmo badguy)
304    {
305        FollowerBrain vihollisenAivot = new FollowerBrain(pelaaja1);
306        vihollisenAivot.Speed = 200;
307        vihollisenAivot.DistanceFar = 600;
308        vihollisenAivot.DistanceClose = 10;
309        vihollisenAivot.StopWhenTargetClose = true;
310        vihollisenAivot.TurnWhileMoving = false;
311        vihollisenAivot.Active = true;
312        Timer ampumisajastin = new Timer();
313        ampumisajastin.Timeout += delegate { VihollinenAmpuu(badguy); };
314
315        vihollisenAivot.DistanceToTarget.AddTrigger(200, TriggerDirection.Down,
316            delegate()
317            {
318                VihollinenAmpuu(badguy);
319                ampumisajastin.Interval = 2.0;
320                ampumisajastin.Start();
321            }
322        );
323
324        vihollisenAivot.DistanceToTarget.AddTrigger(200, TriggerDirection.Up, delegate()
325        {
326            ampumisajastin.Stop();
327        });
328
329        return vihollisenAivot;
330
331
332
333
334
335    }
336    void VihollinenAmpuu(Pelihahmo badguy)
337    {
338        if (badguy.Weapon == null)
339        {
340            return;
341        }
342        badguy.Weapon.Power.Value = 50;
343        PhysicsObject ammus = badguy.Weapon.Shoot();
344
345
346        if (ammus != null)
347        {
348            ammus.CollisionIgnoreGroup = 54;
349            ammus.Position += badguy.Weapon.AbsoluteAngle.GetVector() * 20;
350            ammus.IgnoresCollisionResponse = true;
351            ammus.Shape = Shape.Circle;
352            ammus.Size = new Vector(RUUDUN_KOKO, RUUDUN_KOKO);
353            if (ammuskeluanimaatio == null)
354            {
355                ammuskeluanimaatio = LoadAnimation("LaserAmmus_Animation");
356            }
357            ammus.Animation = ammuskeluanimaatio;
358            ammus.Animation.Start();
359        }
360    }
361    void LuoElamaLaskuri()
362    {
363        /*
364        elamaLaskuri = new DoubleMeter(3);
365        elamaLaskuri.MaxValue = 3;
366        elamaLaskuri.LowerLimit += ElamaLoppui;*/
367
368        pelaaja1.elamaLaskuri.LowerLimit += ElamaLoppui;
369
370        ProgressBar elamaPalkki = new ProgressBar(180, 70.5);
371        elamaPalkki.X = Screen.Left + 200;
372        elamaPalkki.Y = Screen.Bottom + 20;
373        elamaPalkki.BindTo(pelaaja1.elamaLaskuri);
374        elamaPalkki.Image = LoadImage("HearthEmpty");
375        elamaPalkki.BarImage = LoadImage("HearthFull");
376        Add(elamaPalkki);
377    }
378    void ElamaLoppui()
379    {
380
381        pelaaja1.Weapon = null;
382        pelaaja1.Destroy();
383        MessageDisplay.Add("You ran ouf of lives");
384        SeuraavaKentta();
385
386    }
387    void VihollisenElamaLoppui(Pelihahmo badguy)
388    {
389
390        badguy.Weapon = null;
391        badguy.Destroy();
392    }
393
394    void Voitit()
395    {
396        MessageDisplay.Add("You Win");
397
398        aikaLaskuri.Stop();
399
400        HighScoreWindow topIkkuna = new HighScoreWindow(
401                             "Parhaat pisteet",
402                             "Onneksi olkoon, pääsit listalle pisteillä %p! Syötä nimesi:",
403                             topLista, aika.Value);
404        topIkkuna.List.ScoreFormat = "{0:0.00}";
405        topIkkuna.Closed += TallennaPisteet;
406        Add(topIkkuna);
407
408    }
409
410    void TallennaPisteet(Window sender)
411    {
412        DataStorage.Save<ScoreList>(topLista, "pisteet.xml");
413        Exit();
414    }
415
416    void LuoAikaLaskuri()
417    {
418        aikaLaskuri = new Timer();
419        aikaLaskuri.Interval = 0.1;
420        aikaLaskuri.Timeout += () => aika.Value += 0.1;
421        aikaLaskuri.Start();
422
423        Label aikaNaytto = new Label();
424        aikaNaytto.TextColor = Color.White;
425        aikaNaytto.DecimalPlaces = 1;
426        aikaNaytto.BindTo(aika);
427        aikaNaytto.X = Screen.Left + 100;
428        aikaNaytto.Y = Screen.Top - 100;
429        Add(aikaNaytto);
430
431    }
432
433
434}
Note: See TracBrowser for help on using the repository browser.