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

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