source: 2017/27/RasmusL/ZombiSurvi/ZombiSurvi/ZombiSurvi/ZombiSurvi.cs @ 9014

Revision 9014, 16.3 KB checked in by npo17_50, 2 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
9class Hahmo : PlatformCharacter
10{
11    private IntMeter elamaLaskuri;
12
13    public IntMeter ElamaLaskuri { get { return elamaLaskuri; } }
14
15    public Hahmo(double leveys, double korkeus, int elama)
16        : base(leveys, korkeus)
17    {
18        elamaLaskuri = new IntMeter(elama, 0, elama);
19        elamaLaskuri.LowerLimit += delegate { this.Destroy(); };
20    }
21
22}
23
24public class ZombiSurvi : PhysicsGame
25{
26   
27    const double nopeus = 200;
28    const double hyppyNopeus = 950;
29    const int RUUDUN_KOKO = 40;
30
31    EasyHighScore topLista = new EasyHighScore();
32
33    int vahinko = 999;
34    double ammusnopeus = 1.0;
35    bool ammusräjähtää = false;
36
37    bool onkom16 = false;
38    bool onkosnipu = false;
39
40
41    Label slot1;
42    Label slot2;
43
44    IntMeter round = new IntMeter(1);
45    Label pisteNaytto;
46
47    Hahmo pelaaja1;
48    GameObject tahtain;
49
50    AssaultRifle pisla;
51    AssaultRifle m16;
52    AssaultRifle awp;
53
54    Image taustakuva = LoadImage("tausta");
55    Image taskulamppu = LoadImage("lampu");
56    Image pelaajanKuva = LoadImage("oikeajuoksu2_1");
57    Image zombi = LoadImage("zombi");
58    Image asekuva = LoadImage("m9kadessa");
59    Image panos = LoadImage("panos");
60    Image tahtainkuva = LoadImage("crosshairs_144");
61    GameObject valo;
62    GameObject laser;
63    SoundEffect maaliAani = LoadSoundEffect("maali");
64    SoundEffect snipu = LoadSoundEffect("awp");
65    SoundEffect pistooli = LoadSoundEffect("pisla");
66    SoundEffect asenosto = LoadSoundEffect("aseenosto");
67    Image puukuva = LoadImage("dramaattinenmaa");
68    Image ruohokuva = LoadImage("ruoho");
69    Image kivikuva = LoadImage("maakivi");
70    Image awpkuva = LoadImage("kädetönawp");
71    Image awpkäsi = LoadImage("awspa");
72    Image m16kuva = LoadImage("M16Maassa");
73    Image m16käsi = LoadImage("M16Kadessa");
74    Image pistoolikäsi = LoadImage("m9kadessa");
75    Image tunneli = LoadImage("luola");
76    Image takakuva = LoadImage("zombisurvitausta");
77    Image laaser = LoadImage("Laaseri");
78    Image m16slot = LoadImage("m16slot");
79    Image awpslot = LoadImage("Awpslot");
80    Image m9slot = LoadImage("m9slot");
81    Image lamppuslot = LoadImage("lamppuslot");
82    Image tyhjä2 = LoadImage("tyhjaslot2");
83    Image valittulamppu = LoadImage("valittulamppu");
84    Image valittum16 = LoadImage("m16pickedslot");
85    Image valittum9 = LoadImage("m9pickedslot");
86    Image valittuawp = LoadImage("awppickedslot");
87    Image kädet = LoadImage("lamppukadessa");
88
89    public override void Begin()
90    {
91        IsFullScreen = false;
92        topLista.HighScoreWindow.Closed += (Window w) => alkuvalikko();
93        alkuvalikko();
94    }
95
96    void alkuvalikko()
97    {
98
99        Level.Background.Image = takakuva;
100        MultiSelectWindow alkuValikko = new MultiSelectWindow("ZombiSurvi", "Aloita peli", "Parhaat pisteet", "Lopeta");
101        Add(alkuValikko);
102
103        alkuValikko.AddItemHandler(0, aloitauusipeli);
104        alkuValikko.AddItemHandler(1, parhaatpisteet);
105        alkuValikko.AddItemHandler(2, Exit);
106    }
107
108    void parhaatpisteet()
109    {
110        topLista.Show();
111    }
112
113    void aloitauusipeli()
114
115    {
116        round.Value = 1;
117        onkom16 = false;
118        onkosnipu = false;
119        aloitapeli();
120
121
122    }
123
124    void aloitapeli()
125    {
126        Mouse.IsCursorVisible = false;
127        SmoothTextures = false;
128        Gravity = new Vector(0, -1000);
129
130pisla = new AssaultRifle(255 * 0.2, 15 * 1);
131        pisla.Image = pistoolikäsi;
132        pisla.Image = asekuva;
133        pisla.FireRate = 2.5;
134        pisla.Ammo.Value = 5000;
135        pisla.ProjectileCollision = AmmusOsui;
136        pisla.AttackSound = pistooli;
137
138        m16 = new AssaultRifle(200 * 0.5, 35 * 0.4);
139        m16.Image = m16käsi;
140        m16.FireRate = 8.5;
141        m16.Ammo.Value = 500;
142        m16.ProjectileCollision = AmmusOsui;
143
144        awp = new AssaultRifle(250 * 0.5, 50 * 0.4);
145        awp.Image = awpkäsi;
146        awp.FireRate = 1;
147        awp.Ammo.Value = 350;
148        awp.ProjectileCollision = AmmusOsui;
149        awp.AttackSound = snipu;
150
151        luoasekuvat();
152        LuoKentta();
153        LisaaNappaimet();
154        LuoAikaLaskuri();
155        LuoroundLaskuri();
156
157       
158
159
160        Camera.Follow(pelaaja1);
161        Camera.ZoomFactor = 1.25;
162        //Camera.StayInLevel = true;
163    }
164
165    void luoasekuvat()
166    {
167        slot1 = new Label(50, 50);
168        slot1.Color = Color.White;
169        slot1.Image = lamppuslot;
170        slot1.X = Screen.Left + 100;
171        slot1.Y = Screen.Bottom + 50;
172        Add(slot1);
173
174        slot2 = new Label(50, 50);
175        slot2.Color = Color.White;
176        slot2.Image = m9slot;
177        slot2.X = Screen.Left + 155;
178        slot2.Y = Screen.Bottom + 50;
179        Add(slot2);
180
181    }
182    void LuoKentta()
183    {
184        ColorTileMap ruudut = ColorTileMap.FromLevelAsset("kenttä1");
185        ruudut.SetTileMethod(Color.FromHexCode("282323"), LisaaTunneli);
186        ruudut.SetTileMethod(Color.FromHexCode("FF0000"), LisaaPelaaja);
187        ruudut.SetTileMethod(Color.FromHexCode("4FFF51"), LisaaTaso, puukuva);
188        ruudut.SetTileMethod(Color.FromHexCode("F5FF49"), LisaaTaso, ruohokuva);
189        ruudut.SetTileMethod(Color.FromHexCode("FF388A"), LisaaTaso, kivikuva);
190        ruudut.SetTileMethod(Color.FromHexCode("4CFF00"), Lisaazombi);
191        ruudut.SetTileMethod(Color.FromHexCode("0037FF"), Lisaazombispawn);
192        ruudut.SetTileMethod(Color.FromHexCode("DD8EFF"), Lisaasnipu);
193        ruudut.SetTileMethod(Color.FromHexCode("BF00FF"), Lisaam16);
194        ruudut.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
195        Level.CreateBorders();
196        //Level.Background.CreateGradient(Color.White, Color.SkyBlue);
197        //Level.Background.Image = taustakuva;
198        //Level.Background.FitToLevel();
199
200        GameObject taustaPilvet = new GameObject(Screen.Width, Screen.Height);
201        taustaPilvet.Image = taustakuva;
202        Add(taustaPilvet, -3);
203        Layers[-3].RelativeTransition = new Vector(0, 0);
204
205        tahtain = new GameObject(100, 100);
206        tahtain.Image = tahtainkuva;
207        Add(tahtain, 3);
208    }
209    void Lisaasnipu(Vector paikka, double leveys, double korkeus)
210    {
211        PhysicsObject snipu = new PhysicsObject(leveys * 1.3, korkeus / 2);
212        Add(snipu);
213        snipu.Position = paikka;
214        snipu.Image = awpkuva;
215
216        Timer.SingleShot(5, delegate
217       {
218           snipu.Tag = "snipukuva";
219       });
220
221    }
222
223    void Lisaam16(Vector paikka, double leveys, double korkeus)
224    {
225        PhysicsObject m16 = new PhysicsObject(leveys * 1.3, korkeus / 2);
226        Add(m16);
227        m16.Position = paikka;
228        m16.Image = m16kuva;
229
230        Timer.SingleShot(5, delegate
231        {
232            m16.Tag = "m16kuva";
233        });
234    }
235
236    void LisaaTaso(Vector paikka, double leveys, double korkeus, Image kuva)
237    {
238        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
239        taso.Position = paikka;
240        taso.Image = kuva;
241        Add(taso);
242    }
243    void LisaaTunneli(Vector paikka, double leveys, double korkeus)
244    {
245        GameObject taso = new GameObject(leveys, korkeus);
246        taso.Position = paikka;
247        taso.Image = tunneli;
248        Add(taso, -2);
249    }
250    void Lisaazombispawn(Vector paikka, double leveys, double korkeus)
251    {
252        Timer spawnAjastin = new Timer();
253        spawnAjastin.Interval = 7;
254        spawnAjastin.Timeout += delegate
255        {
256            if (Vector.Distance(pelaaja1.Position, paikka) > 600 && RandomGen.NextInt(0, 100) < round.Value * 10)
257            {
258                Lisaazombi(paikka, leveys, korkeus);
259            }
260        };
261        spawnAjastin.Start();
262    }
263    void Lisaazombi(Vector paikka, double leveys, double korkeus)
264    {
265        Hahmo zombi = new Hahmo(leveys, korkeus, round.Value);
266        zombi.Position = paikka;
267        zombi.Image = this.zombi;
268        zombi.Tag = "zombi";
269        Add(zombi);
270
271        FollowerBrain seuraajanAivot = new FollowerBrain("pelaaja");
272        seuraajanAivot.Speed = 300;
273
274        Timer hyppyAjastin = new Timer();
275        hyppyAjastin.Interval = 1;
276        hyppyAjastin.Timeout += delegate { zombi.Jump(1000); };
277        hyppyAjastin.Start();
278
279        zombi.Brain = seuraajanAivot;
280    }
281
282    void LisaaPelaaja(Vector paikka, double leveys, double korkeus)
283    {
284        pelaaja1 = new Hahmo(leveys * 0.5, korkeus, 3);
285        pelaaja1.Position = paikka;
286        pelaaja1.Mass = 4.0;
287        pelaaja1.Image = pelaajanKuva;
288        pelaaja1.Tag = "pelaaja";
289
290        pelaaja1.ElamaLaskuri.LowerLimit += pelipäättyy;
291
292
293        AddCollisionHandler(pelaaja1, "zombi", osuizombiin);
294        AddCollisionHandler(pelaaja1, "snipukuva", osuisnipuun);
295        AddCollisionHandler(pelaaja1, "m16kuva", osuim16);
296
297
298        Add(pelaaja1);
299
300        ProgressBar elamaPalkki = new ProgressBar(150, 20);
301        elamaPalkki.X = Screen.Left + 150;
302        elamaPalkki.Y = Screen.Top - 20;
303        elamaPalkki.BindTo(pelaaja1.ElamaLaskuri);
304        Add(elamaPalkki);
305
306        valo = new GameObject(taskulamppu);
307        valo.Position = pelaaja1.Position;
308        valo.IsVisible = true;
309        Add(valo, 3);
310
311        laser = new GameObject(laaser);
312        laser.Width *= 10;
313        laser.Position = pelaaja1.Position;
314        laser.IsVisible = false;
315        Add(laser, 3);
316
317       
318       
319        otapistooli();
320        LuopanosLaskuri();
321    }
322
323    void osuipistooliin(PhysicsObject pelaaja, PhysicsObject pisla)
324    {
325        pisla.Destroy();
326        otapistooli();
327    }
328    void otapistooli()
329    {
330        pelaaja1.Weapon = pisla;
331        asenosto.Play();
332        vahinko = 4;
333        laser.IsVisible = false;
334        ammusräjähtää = false;
335        slot2.Image = valittum9;
336
337        if(pisteNaytto != null) pisteNaytto.BindTo(pelaaja1.Weapon.Ammo);
338
339        if (onkom16) slot1.Image = m16slot;
340        else if (onkosnipu) slot1.Image = awpslot;
341        else slot1.Image = lamppuslot;
342
343    }
344    void osuisnipuun(PhysicsObject pelaaja, PhysicsObject kädetönawp)
345    {
346        kädetönawp.Destroy();
347
348        if (onkom16) Lisaam16(pelaaja1.Position, RUUDUN_KOKO, RUUDUN_KOKO);
349
350        slot1.Image = awpslot;
351
352        onkosnipu = true;
353        onkom16 = false;
354        otasnipu();
355    }
356    void otasnipu()
357    {
358        if (onkosnipu)
359        {
360
361            pelaaja1.Weapon = awp;
362            asenosto.Play();
363            laser.IsVisible = true;
364            vahinko = 15;
365            ammusnopeus = 1.75;
366
367            ammusräjähtää = true;
368            slot1.Image = valittuawp;
369            slot2.Image = m9slot;
370
371            pisteNaytto.BindTo(pelaaja1.Weapon.Ammo);
372        }
373    }
374
375    void osuim16(PhysicsObject pelaaja, PhysicsObject M16Maassa)
376    {
377        M16Maassa.Destroy();
378
379        if (onkosnipu) Lisaasnipu(pelaaja1.Position, RUUDUN_KOKO, RUUDUN_KOKO);
380
381        onkom16 = true;
382        onkosnipu = false;
383        otam16();
384    }
385    void otam16()
386    {
387        if (onkom16)
388        {
389
390            pelaaja1.Weapon = m16;
391            asenosto.Play();
392            vahinko = 3;
393            ammusnopeus = 1.3;
394            laser.IsVisible = false;
395            ammusräjähtää = false;
396            slot1.Image = valittum16;
397            slot2.Image = m9slot;
398
399            pisteNaytto.BindTo(pelaaja1.Weapon.Ammo);
400
401
402        }
403    }
404
405    void otakädet()
406    {
407        if (!onkom16 && !onkosnipu)
408        {
409            pelaaja1.Weapon = new AssaultRifle(50 * 0.5, 35 * 0.4);
410            pelaaja1.Weapon.Image = kädet;
411            pelaaja1.Weapon.FireRate = 0;
412            laser.IsVisible = false;
413            ammusräjähtää = false;
414
415            slot1.Image = valittulamppu;
416            slot2.Image = m9slot;
417        }
418    }
419    void AmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
420    {
421        ammus.Destroy();
422
423        if (ammusräjähtää)
424
425        {
426            Explosion rajahdys = new Explosion(50);
427            rajahdys.Position = ammus.Position;
428            Add(rajahdys);
429        }
430
431        if (kohde is Hahmo)
432        {
433
434            ((Hahmo)kohde).ElamaLaskuri.Value -= vahinko;
435        }
436    }
437    void LisaaNappaimet()
438    {
439        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
440        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
441
442        Keyboard.Listen(Key.A, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, -nopeus);
443        Keyboard.Listen(Key.D, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, nopeus);
444        Keyboard.Listen(Key.Space, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
445
446        Keyboard.Listen(Key.D2, ButtonState.Pressed, otapistooli, "");
447        Keyboard.Listen(Key.D1, ButtonState.Pressed, otam16, "");
448        Keyboard.Listen(Key.D1, ButtonState.Pressed, otasnipu, "");
449        Keyboard.Listen(Key.D1, ButtonState.Pressed, otakädet, "");
450
451        Mouse.Listen(MouseButton.Left, ButtonState.Down, AmmuAseella, "Ammu", pelaaja1);
452
453
454        Mouse.ListenMovement(0.0, KuunteleLiiketta, null);
455
456
457    }
458
459    void KuunteleLiiketta(AnalogState hiirenTila)
460    {
461        pelaaja1.Weapon.AbsoluteAngle = (Mouse.PositionOnWorld - pelaaja1.Position).Angle;
462        valo.AbsoluteAngle = (Mouse.PositionOnWorld - pelaaja1.Position).Angle;
463        laser.AbsoluteAngle = (Mouse.PositionOnWorld - pelaaja1.Position).Angle;
464
465        tahtain.Position = Mouse.PositionOnWorld;
466    }
467
468    protected override void Update(Time time)
469    {
470        if (pelaaja1 != null)
471        {
472            valo.Position = pelaaja1.Position;
473            laser.Position = pelaaja1.Position;
474        }
475
476        base.Update(time);
477    }
478
479    void AmmuAseella(PlatformCharacter pelaaja)
480    {
481        PhysicsObject ammus = pelaaja.Weapon.Shoot();
482
483        if (ammus != null)
484        {
485         
486            //snipu.Play(0.1, 0.0, 0.0);
487            ammus.Position += ammus.Angle.GetVector() * -1;
488            ammus.Position += (ammus.Angle + Angle.FromDegrees(90)).GetVector() * 2.5;
489            ammus.Size = new Vector(10, 6);
490            ammus.Image = panos;
491            ammus.Velocity *= ammusnopeus;
492
493
494
495
496
497
498            //ammus.MaximumLifetime = TimeSpan.FromSeconds(2.0);
499        }
500    }
501    void Liikuta(PlatformCharacter hahmo, double nopeus)
502    {
503        hahmo.Walk(nopeus);
504    }
505
506    void Hyppaa(PlatformCharacter hahmo, double nopeus)
507    {
508        hahmo.Jump(nopeus);
509    }
510
511    void LuoAikaLaskuri()
512    {
513        Timer aikaLaskuri = new Timer();
514        aikaLaskuri.Start();
515
516        Label aikaNaytto = new Label();
517        aikaNaytto.TextColor = Color.White;
518        aikaNaytto.DecimalPlaces = 1;
519        aikaNaytto.BindTo(aikaLaskuri.SecondCounter);
520        Add(aikaNaytto);
521        aikaNaytto.X = Screen.Right - 50;
522        aikaNaytto.Y = Screen.Bottom + 50;
523    }
524
525    void LuopanosLaskuri()
526    {
527
528        pisteNaytto = new Label();
529        pisteNaytto.X = 850;
530        pisteNaytto.Y = Screen.Bottom + 45;
531        pisteNaytto.TextColor = Color.Yellow;
532        //pisteNaytto.Color = Color.White;
533
534        pisteNaytto.BindTo(pelaaja1.Weapon.Ammo);
535        Add(pisteNaytto);
536    }
537
538    void LuoroundLaskuri()
539    {
540        Timer aikaLaskuri = new Timer();
541        aikaLaskuri.Interval = 30;
542        aikaLaskuri.Timeout += delegate { round.Value += 1; };
543        aikaLaskuri.Start();
544
545        Label roundNaytto = new Label();
546        roundNaytto.TextColor = Color.White;
547        roundNaytto.Y = Screen.Bottom + 50;
548        roundNaytto.Title = "Round";
549        roundNaytto.BindTo(round);
550        Add(roundNaytto);
551
552    }
553
554    void LuoVihollinen(Vector paikka, double leveys, double korkeus)
555    {
556        PhysicsObject vihollinen = new PhysicsObject(leveys, korkeus);
557        vihollinen.Position = paikka;
558        vihollinen.Tag = "zombi";
559        Add(vihollinen);
560    }
561    void osuizombiin(PhysicsObject pelaaja, PhysicsObject zombi)
562    {
563        pelaaja1.ElamaLaskuri.Value -= 1;
564    }
565    void pelipäättyy()
566    {
567        ClearAll();
568        topLista.EnterAndShow(round.Value);
569    }
570}
Note: See TracBrowser for help on using the repository browser.