source: 2017/27/OttoK/1v1MeBitch/1v1MeBitch/_1v1MeBitch/_1v1MeBitch.cs @ 10334

Revision 8997, 13.7 KB checked in by npo17_47, 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
9public class _1v1MeBitch : PhysicsGame
10{
11    //Nopeuksien ja ruutujen kokojen vakioiden määrittäminen.
12    const double nopeus = 200;
13    const double hyppyNopeus = 750;
14    const int RUUDUN_KOKO = 40;
15
16    Pelaaja pelaaja1;
17    Pelaaja pelaaja2;
18
19    //Kuvien lisääminen.
20
21    //Aseiden projektiilien kuvat.
22    Image ohjuksenKuva = LoadImage("ohjus");
23    Image laaserinkuva = LoadImage("laaseri");
24    Image jytkynkuva = LoadImage("jytky");
25
26    //Pelaajien kuvat.
27    Image pelaaja1kuva = LoadImage("pelaaja1");
28    Image pelaaja2kuva = LoadImage("pelaaja2");
29
30    //Tikkaiden kuva.
31    Image tikkaankuva = LoadImage("tikassejokapaistetaan");
32
33    //Kentän taustakuva.
34    Image taustakuva = LoadImage("takajeejee");
35
36    //PowerUpin kuva.
37    Image shrinenkuva = LoadImage("shrinejuttu");
38
39
40
41    //Äänien lisääminen.
42
43    SoundEffect ohjusaani = Game.LoadSoundEffect("quake");
44    SoundEffect lasersound = Game.LoadSoundEffect("pumpum1");
45    SoundEffect jytkynaani = Game.LoadSoundEffect("tntsound");
46    SoundEffect starttimartti = Game.LoadSoundEffect("start");
47    SoundEffect noclip = Game.LoadSoundEffect("emptyclip");
48    SoundEffect lopetaaani = Game.LoadSoundEffect("lopetahanet");
49
50    public override void Begin()
51    {
52        Alkuvalikko();
53    }
54    //Alkuvalikon luominen.
55    void Alkuvalikko()
56    {
57        MultiSelectWindow alkuValikko = new MultiSelectWindow("Pelin alkuvalikko","Aloita peli", "Lopeta");
58        Add(alkuValikko);
59
60        alkuValikko.AddItemHandler(0, Aloitapeli);
61        alkuValikko.AddItemHandler(1, Exit);
62    }
63    //Pelin aloitus.
64    void Aloitapeli()
65    {
66        ClearAll();
67        Gravity = new Vector(0, -1000);
68        LuoKentta();
69        LisaaNappaimet();
70        IsFullScreen = true;
71
72        //Ammuslaskurien sijaintien määrittäminen
73        pelaaja1.Ammuslaskuri = LuoAmmuslaskuri(Screen.Right - 100, Screen.Bottom + 100);
74        pelaaja2.Ammuslaskuri = LuoAmmuslaskuri(Screen.Left + 100, Screen.Bottom + 100);
75
76        //Kameran määrittäminen.
77        Camera.ZoomToLevel();
78        Camera.StayInLevel = true;
79
80        starttimartti.Play();
81    }   
82
83    //Kentän luonti.
84    void LuoKentta()
85    {
86        TileMap kentta = TileMap.FromLevelAsset("kentta1");
87        kentta.SetTileMethod('#', LisaaTaso);
88        kentta.SetTileMethod('T', LisaaTikas);
89        kentta.SetTileMethod('N', LisaaPelaaja1);
90        kentta.SetTileMethod('M', LisaaPelaaja2);
91        kentta.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
92        Level.CreateBorders();
93        Level.Background.Image = taustakuva;
94        Level.Background.FitToLevel();
95
96        //Shrinen ajastin(Kuinka usein shrinejä spawnaa).
97        Timer ajastin = new Timer();
98        ajastin.Interval = 4;
99        ajastin.Timeout += LuoShrine;
100        ajastin.Start();
101    }
102
103    //Luodaan kenttäpalikat.
104    void LisaaTaso(Vector paikka, double leveys, double korkeus)
105    {
106        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
107        taso.Position = paikka;
108        taso.Color = Color.Green;
109        Add(taso);
110    }
111    //Luodaan platformit, joiden läpi voi mennä ja joiden päällä voi myös seistä.
112    void LisaaTikas(Vector paikka, double leveys, double korkeus)
113    {     
114        Tikas tikas = new Tikas(leveys, korkeus);
115        tikas.MakeOneWay();
116        tikas.AloitusPaikka = paikka;
117        tikas.MakeStatic();
118        tikas.Color = Color.Beige;
119        tikas.Image = tikkaankuva;
120        tikas.Position = paikka;
121        tikas.Tag = "tikas";
122        Add(tikas);
123    }
124
125    //Pelaajan luonti
126    Pelaaja LisaaPelaaja(Vector paikka, double leveys, double korkeus, Color vari, Vector laskurinpaikka)
127    {
128        Pelaaja pelaaja = new Pelaaja(leveys, korkeus);
129        pelaaja.Position = paikka;
130        pelaaja.Mass = 4.0;
131        pelaaja.Color = vari;
132        pelaaja.Ammu = AmmuNolla;
133        pelaaja.Tag = "pelaaja";
134        Add(pelaaja);
135
136        //Elämäpalkin luominen.
137        ProgressBar elamaPalkki = new ProgressBar(150, 20);
138        elamaPalkki.Position = laskurinpaikka;
139        elamaPalkki.BindTo(pelaaja.ElamaLaskuri);
140        Add(elamaPalkki);
141
142        //Powerupin (shrinen) törmäyskäsittelijä.
143        AddCollisionHandler<Pelaaja, PhysicsObject>(pelaaja, "shrine", PowerUp);
144        return pelaaja;
145    }
146
147    void LisaaPelaaja1(Vector paikka, double leveys, double korkeus)
148    {
149        pelaaja1 = LisaaPelaaja(paikka, leveys, korkeus, Color.HotPink, new Vector(Screen.Right - 150, Screen.Top - 20));
150        pelaaja1.Image = pelaaja1kuva;
151    }
152
153    void LisaaPelaaja2(Vector paikka, double leveys, double korkeus)
154    {
155        pelaaja2 = LisaaPelaaja(paikka, leveys, korkeus, Color.JungleGreen, new Vector(Screen.Left + 150, Screen.Top - 20));
156        pelaaja2.Image = pelaaja2kuva;
157    }
158    //Näppäinten lisäys.
159    void LisaaNappaimet()
160    {
161        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
162        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Alkuvalikko, "Lopeta peli");
163
164        Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, -nopeus);
165        Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, nopeus);
166        Keyboard.Listen(Key.Up, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
167
168        Keyboard.Listen(Key.A, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja2, -nopeus);
169        Keyboard.Listen(Key.D, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja2, nopeus);
170        Keyboard.Listen(Key.W, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja2, hyppyNopeus);
171
172        Keyboard.Listen(Key.Down, ButtonState.Down, Alas, "Pelaaja menee alas", pelaaja1, hyppyNopeus, "tikas");
173        Keyboard.Listen(Key.S, ButtonState.Down, Alas, "Pelaaja menee alas", pelaaja2, hyppyNopeus, "tikas2");
174
175        Keyboard.Listen(Key.NumPad0, ButtonState.Pressed, Ammu, "Ammu ohjus", pelaaja1);
176        Keyboard.Listen(Key.H, ButtonState.Pressed, Ammu, "Ammu ohjus", pelaaja2);
177    }
178    //Pelaajien ammuslaskureiden luonti.
179    IntMeter LuoAmmuslaskuri(double sijaintix, double sijaintiy)
180    {
181        IntMeter ammuslaskuri = new IntMeter(4, 0, 4);
182
183        Label pisteNaytto = new Label();
184        pisteNaytto.X = sijaintix;
185        pisteNaytto.Y = sijaintiy;
186        pisteNaytto.TextColor = Color.Black;
187        pisteNaytto.Color = Color.White;
188        pisteNaytto.BindTo(ammuslaskuri);
189        Add(pisteNaytto);
190
191        //Ammuslaskurin 4 sekuntin latausaika.
192        ammuslaskuri.LowerLimit += delegate
193        {
194            Timer.SingleShot(4.0, delegate
195            {
196                ammuslaskuri.Value = ammuslaskuri.MaxValue;
197            });
198        };
199        return ammuslaskuri;
200    }
201
202    void Liikuta(Pelaaja hahmo, double nopeus)
203    {
204        hahmo.Walk(nopeus);
205    }
206    void Hyppaa(Pelaaja hahmo, double nopeus)
207    {
208        hahmo.Jump(nopeus);
209    }
210    void Alas(Pelaaja hahmo, double nopeus, string tag)
211    {
212        //Tikkaiden läpi meneminen.
213        List<GameObject> tikkaat = GetObjectsAt(new Vector(hahmo.X, hahmo.Bottom - 5));
214        bool voiPudota = false;
215        foreach (GameObject tikas in tikkaat)
216        {
217            if (tikas.Tag.ToString() == "tikas")
218            {
219                voiPudota = true;
220                break;
221            }
222        }
223        if (!hahmo.IsAboutToFall() && voiPudota)
224        {
225            hahmo.Y -= 50;
226        }
227    }
228
229    //Aloitusase, jolla ei voi ampua(tyhjää).
230    void AmmuNolla(Pelaaja hahmo)
231    {
232        noclip.Play();
233    }
234    void Ammu(Pelaaja hahmo)
235    {
236        if (hahmo.IsDestroyed || hahmo.Ammuslaskuri.Value == 0)
237            return;
238
239        hahmo.Ammu(hahmo);
240    }
241    //Ensimmäinen ase, joka ampuu ohjuksia.
242    void Ammu1(Pelaaja hahmo)
243    {
244        PhysicsObject ohjus = new PhysicsObject(40, 12);
245        ohjus.Position = hahmo.Position;
246        ohjus.X += hahmo.FacingDirection.GetVector().X * 60;
247        ohjus.Color = hahmo.Color;
248        ohjus.Image = ohjuksenKuva;
249        ohjus.CollisionIgnoreGroup = 1;
250        ohjus.IgnoresGravity = true;
251        ohjus.IgnoresCollisionResponse = true;
252        Add(ohjus);
253
254        ohjusaani.Play();
255
256        hahmo.Ammuslaskuri.AddValue(-1);
257
258        ohjus.Hit(hahmo.FacingDirection.GetVector() * 1200);
259        if (ohjus.Velocity.X < 0) ohjus.Angle += Angle.FromDegrees(180);
260        AddCollisionHandler(ohjus, delegate (PhysicsObject a, PhysicsObject b)
261        {
262            TuhoaOhjus(a, b, hahmo);
263        });
264    }
265    // Ohjuksen tuhoaminen ja osuminen.
266    void TuhoaOhjus(PhysicsObject ohjus, PhysicsObject kohde, PhysicsObject ampuja)
267    {
268        if (kohde.Tag != "tikas")
269        {
270
271            Explosion rajahdys = new Explosion(110);
272            rajahdys.Force = 15;
273            rajahdys.Position = ohjus.Position;
274            Add(rajahdys);
275            rajahdys.ShockwaveReachesObject += delegate (IPhysicsObject rajahdyksenKohde, Vector shokki)
276            {
277                Pelaaja kohdePelaaja = rajahdyksenKohde as Pelaaja;
278                if (kohdePelaaja != null && kohdePelaaja != ampuja)
279                {
280                    kohdePelaaja.ElamaLaskuri.Value--;
281
282                    if (kohdePelaaja.ElamaLaskuri.Value == 2)
283                        lopetaaani.Play();
284
285                    if (kohdePelaaja.IsDestroyed || kohdePelaaja.IsDestroying) Timer.SingleShot(2.0, Alkuvalikko);
286                }
287            };
288            ohjus.Destroy();
289        }
290    }
291    //Toinen ase, joka ampuu laaseria, joka ei osuessaan räjähdä.
292    void Ammu2(Pelaaja hahmo)
293    {
294        PhysicsObject laaseri = new PhysicsObject(70, 5);
295        laaseri.Position = hahmo.Position;
296        //Laaseri sijoitetaan ammuttaessa hieman pelaajan eteen, ettei laaseri tuhoudu osuessaan ampujaan.
297        laaseri.X += hahmo.FacingDirection.GetVector().X * 70;
298        laaseri.Image = laaserinkuva;
299        laaseri.CollisionIgnoreGroup = 1;
300        laaseri.IgnoresGravity = true;
301        laaseri.IgnoresCollisionResponse = true;
302        Add(laaseri);
303
304        lasersound.Play();
305
306        hahmo.Ammuslaskuri.AddValue(-1);
307
308        //Laaserin nopeus.
309        laaseri.Hit(hahmo.FacingDirection.GetVector() * 4000);
310        if (laaseri.Velocity.X < 0) laaseri.Angle += Angle.FromDegrees(180);
311        AddCollisionHandler(laaseri, delegate (PhysicsObject a, PhysicsObject b)
312        {
313            TuhoaLaser(a, b, hahmo);
314        });
315    }
316    //Laaserin tuhoaminen ja osuminen.
317   void TuhoaLaser(PhysicsObject laaseri, PhysicsObject kohde, PhysicsObject ampuja)
318    {
319        if (kohde.Tag != "pelaaja") return;
320        Pelaaja p = (Pelaaja)kohde;
321        p.ElamaLaskuri.AddValue(-2);
322        laaseri.Destroy();
323
324        if (p.ElamaLaskuri.Value == 2)
325                        lopetaaani.Play();
326
327        if (p.IsDestroyed || p.IsDestroying) Timer.SingleShot(2.0, Alkuvalikko);
328    }
329    //Kolmas ase, joka ampuu hitaita kanuunankuulia, jotka törmätessään tekevät ison räjähdyksen.
330    void Ammu3(Pelaaja hahmo)
331    {
332        PhysicsObject jytky = new PhysicsObject(40, 40);
333        jytky.Position = hahmo.Position;
334        jytky.X += hahmo.FacingDirection.GetVector().X * 80;
335        jytky.Image = jytkynkuva;
336        jytky.Shape = Shape.Circle;
337        jytky.CollisionIgnoreGroup = 1;
338        jytky.IgnoresGravity = true;
339        jytky.IgnoresCollisionResponse = true;
340        Add(jytky);
341
342        jytkynaani.Play();
343
344        hahmo.Ammuslaskuri.AddValue(-1);
345
346        jytky.Hit(hahmo.FacingDirection.GetVector() * 600);
347        if (jytky.Velocity.X < 0) jytky.Angle += Angle.FromDegrees(180);
348        AddCollisionHandler(jytky, delegate (PhysicsObject a, PhysicsObject b)
349        {
350            TuhoaJytky(a, b, hahmo);
351        });
352    }
353    //Kanuunankuulien tuhoaminen ja osuminen.
354    void TuhoaJytky(PhysicsObject jytky, PhysicsObject kohde, PhysicsObject ampuja)
355    {
356        if (kohde.Tag != "tikas")
357        {
358
359            Explosion rajahdys = new Explosion(200);
360            rajahdys.Force = 45;
361            rajahdys.Position = jytky.Position;
362            Add(rajahdys);
363            rajahdys.ShockwaveReachesObject += delegate (IPhysicsObject rajahdyksenKohde, Vector shokki)
364            {
365                Pelaaja kohdePelaaja = rajahdyksenKohde as Pelaaja;
366                if (kohdePelaaja != null && kohdePelaaja != ampuja)
367                {
368                    kohdePelaaja.ElamaLaskuri.Value--;
369
370                    if (kohdePelaaja.ElamaLaskuri.Value == 2)
371                        lopetaaani.Play();
372
373                    if (kohdePelaaja.IsDestroyed || kohdePelaaja.IsDestroying) Timer.SingleShot(2.0, Alkuvalikko);
374                }
375            };
376            jytky.Destroy();
377        }
378    }
379    //PowerUp shrinejen luonti.
380    void LuoShrine()
381    {
382        PhysicsObject shrine = new PhysicsObject(40, 40);
383        Vector powerupPiste = Level.GetRandomPosition();
384        shrine.Position = powerupPiste;
385        shrine.Color = Color.Red;
386        shrine.Shape = Shape.Circle;
387        shrine.IgnoresGravity = true;
388        shrine.Tag = "shrine";
389        shrine.Image = shrinenkuva;
390        Add(shrine);
391    }
392    //Aseiden arpominen yksi kolmesta.
393    void PowerUp(Pelaaja pelaaja, PhysicsObject shrine)
394    {
395        shrine.Destroy();
396
397        Action<Pelaaja> vanha = pelaaja.Ammu;
398        while (pelaaja.Ammu == vanha)
399            pelaaja.Ammu = RandomGen.SelectOne<Action<Pelaaja>>(Ammu1, Ammu2, Ammu3);
400    }
401}
Note: See TracBrowser for help on using the repository browser.