Ejemplo n.º 1
0
    /// <summary>
    /// Aliohjelma luo pelikentän.
    /// </summary>
    ///< param name="kentanKuva">Mistä kuvasta kenttä piirretään</param>
    ///<param name = "painovoima">Kentän painovoima</param>
    ///<param name = "paljonkoBensaa">Pelaajan bensamäärä kentän alussa</param>
    /// <param name="tormaysparametrit">törmäysparametrit</param>
    /// <param name="bensanMaara">intmeter jota kuljetetaan mukana bensanmäärän asettamiseksi</param>
    /// <param name="leveys">kentän leveys</param>
    private void LuoKentta(Image kentanKuva, double painovoima, int paljonkoBensaa, CollisionShapeParameters tormaysparametrit, IntMeter bensanMaara, int leveys = 1600)
    {
        Level.CreateBorders();
        pelaajaOnTuhoutunut  = false;
        pelaajaOnLaskeutunut = false;
        //Shape maastonMuoto;
        //maastonMuoto = Shape.FromImage(kentanKuva);
        PhysicsObject maasto = PhysicsObject.CreateStaticObject(leveys, 900);

        maasto.Image = kentanKuva;
        Add(maasto);
        Gravity           = new Vector(0, painovoima);
        bensanMaara.Value = paljonkoBensaa;
    }
Ejemplo n.º 2
0
    /// <summary>
    /// Pelin tosiasiallinen "pääohjelma", jossa luodaan pelimaailma ja valikot jokaista kenttää varten sekä asetetaan oletusarvoiset törmäyksenkäsittelijät ja arvot.
    /// Kentästä riippuen luodaan myös kentälle ominaiset arvot, oliot ja asetukset.
    /// </summary>
    public override void Begin()
    {
        SetWindowSize(resoluutioLeveys, resoluutioKorkeus);
        Level.Width  = resoluutioLeveys;
        Level.Height = resoluutioKorkeus;
        Camera.ZoomToLevel();

        Label    bensamittari = new Label();
        IntMeter bensanMaara  = new IntMeter(500, 0, 10000);
        CollisionShapeParameters tormaysparametrit = new CollisionShapeParameters();

        tormaysparametrit.DistanceGridSpacing = 25; // Törmäysparametrien muuttaminen, jotta fysiikat törmäyksissä ovat tarkempia.
        tormaysparametrit.MaxVertexDistance   = 25;
        PhysicsObject pelaaja = new PhysicsObject(50, 50);

        //moottori = LoadAnimation("Moottori");
        rakettimoottoriKayta = rakettimoottori.CreateSound(); // Muutetaan äänet Soundeffectistä Soundiksi, jotta saadaan oikeanlainen ääni.
        tormaysKayta         = tormays.CreateSound();
        LuoOhjaimet(pelaaja, alkuteksti, bensamittari, bensanMaara);
        IsPaused = false;

        switch (mikaKentta)
        {
        case 0:     // Case 0 tarkoitus on luoda ensimmäisellä käynnistyskerralla pelin aloitusteksti ennen pelin aloittamista.
            LuoAlkuvalikko(alkuteksti, bensamittari, pelaaja);
            LuoKentta(maastonKuva, -200, 700, tormaysparametrit, bensanMaara);
            Level.Background.CreateGradient(Color.White, Color.Azure);
            LuoLaskeutumisalusta(700, -176, 100);
            LuoPelaaja(pelaaja, -400, 0);
            mikaKentta++;
            break;

        case 1:
            LuoAlkuteksti(alkuteksti, pelaaja);
            LuoKentta(maastonKuva, -200, 700, tormaysparametrit, bensanMaara);
            Level.Background.CreateGradient(Color.White, Color.Azure);
            LuoLaskeutumisalusta(700, -176, 100);
            LuoPelaaja(pelaaja, -400, 0);
            break;

        case 2:
            LuoAlkuteksti(alkuteksti, pelaaja);
            LuoKentta(maaston2Kuva, -100, 300, tormaysparametrit, bensanMaara);
            Level.Background.CreateStars();
            LuoLaskeutumisalusta(210, -440, 100);
            LuoPelaaja(pelaaja, -700, -50);

            PhysicsObject maa = PhysicsObject.CreateStaticObject(400, 400);
            maa.CollisionIgnoreGroup = 1;
            maa.Image    = maanKuva;
            maa.Position = new Vector(Level.Left + 400, Level.Top - 300);
            Add(maa, 0);
            break;

        case 3:
            LuoAlkuteksti(alkuteksti, pelaaja);

            LuoKentta(maaston3Kuva, -150, 1100, tormaysparametrit, bensanMaara);
            Level.Background.CreateStars();
            LuoPelaaja(pelaaja, -500, 25);
            PhysicsObject aurinko = PhysicsObject.CreateStaticObject(2000, 1100);
            aurinko.Image                = auringonKuva;
            aurinko.Position             = new Vector(-700, 500);
            aurinko.CollisionIgnoreGroup = 1;
            Add(aurinko, -1);

            //Shape sukkulanMuoto = Shape.FromImage(sukkulanKuva);
            PhysicsObject sukkula = new PhysicsObject(800, 400);
            sukkula.Angle                = Angle.FromDegrees(-10);
            sukkula.Position             = new Vector(-550, 80);
            sukkula.Image                = sukkulanKuva;
            sukkula.CollisionIgnoreGroup = 2;
            Add(sukkula);

            PhysicsObject sukkulanKatto = new PhysicsObject(360, 60);
            sukkulanKatto.CollisionIgnoreGroup     = 1;
            sukkulanKatto.IgnoresCollisionResponse = true;
            sukkula.IgnoresPhysicsLogics           = true;
            sukkulanKatto.IgnoresGravity           = true;
            sukkulanKatto.Angle    = Angle.FromDegrees(-10);
            sukkulanKatto.Position = new Vector(sukkula.X - 10, sukkula.Y - 110);
            sukkulanKatto.Image    = katonKuva;
            Add(sukkulanKatto, 1);

            LuoLaskeutumisalusta(sukkula.X, sukkula.Y - 76, 400, Color.Transparent);
            laskeutumisAlusta.CollisionIgnoreGroup = 1;
            laskeutumisAlusta.Color = Color.Transparent;
            laskeutumisAlusta.Angle = Angle.FromDegrees(-10);

            PhysicsObject mineraali = new PhysicsObject(20, 20);
            mineraali.Image = mineraalinKuva;
            //mineraali.Shape = Shape.FromImage(mineraalinKuva);
            mineraali.Position = new Vector(700, -321);
            Add(mineraali);

            AddCollisionHandler(pelaaja, mineraali, delegate(PhysicsObject luotain, PhysicsObject kohde) { laskeutumisAlusta.CollisionIgnoreGroup = 0; mineraali.Destroy(); pelaaja.Mass += 0.75; });

            Image kipina = LoadImage("Kipina");
            Flame liekki = new Flame(kipina);
            liekki.MinLifetime = -40;
            liekki.MaxLifetime = 2;
            liekki.Position    = pelaaja.Position;
            FollowerBrain liekinAivo = new FollowerBrain(pelaaja);
            liekki.Brain     = liekinAivo;
            liekinAivo.Speed = 10;
            liekki.MinScale  = 0;
            liekki.MaxScale  = 10;

            Timer    merkuriusAjastin = new Timer();
            IntMeter merkuriusAika    = new IntMeter(25, 0, 25);
            merkuriusAjastin.Interval = 1;
            merkuriusAjastin.Timeout += delegate { if (merkuriusAika == 22)
                                                   {
                                                       Add(liekki);
                                                   }
                                                   if (liekki.MinLifetime < 1.5)
                                                   {
                                                       liekki.MinLifetime += 2;
                                                   }
                                                   merkuriusAika.Value -= 1; };
            merkuriusAjastin.Start();
            merkuriusAika.LowerLimit += delegate { TuhoaPelaaja(pelaaja); };

            Label aikanaytto = new Label("moro");
            aikanaytto.TextColor = Color.White;
            aikanaytto.Position  = new Vector(Screen.Left + 100, Screen.Top - 130);
            aikanaytto.BindTo(merkuriusAika);
            aikanaytto.IntFormatString = "Time: {0:D2}";
            Add(aikanaytto);

            Sound oviKayta = ovi.CreateSound();

            AddCollisionHandler(pelaaja, laskeutumisAlusta, delegate(PhysicsObject luotain, PhysicsObject laskeutumisAlusta) { if (pelaajaOnTuhoutunut == false)
                                                                                                                               {
                                                                                                                                   merkuriusAjastin.Stop(); sukkulanKatto.MoveTo(new Vector(sukkula.X - 15, sukkula.Y - 47), 50); liekki.Destroy(); oviKayta.Play();
                                                                                                                               }
                                });

            break;

        case 4:
            LuoAlkuteksti(alkuteksti, pelaaja);
            LuoKentta(maaston4Kuva, -200, 3000, tormaysparametrit, bensanMaara);
            Level.Background.Color = Color.Black;
            LuoLaskeutumisalusta(700, -370, 100);
            LuoPelaaja(pelaaja, Level.Left + 70, Level.Top - 200);
            Level.AmbientLight = 0.075;

            Light valo = new Light();
            valo.Intensity = 0.0;
            valo.Distance  = 30;
            Add(valo);

            Timer aika = new Timer();
            aika.Interval = 0.1;

            Keyboard.Listen(Key.Up, ButtonState.Pressed, delegate { aika.Start(); aika.Timeout += delegate { valo.Position = pelaaja.Position; valo.Intensity = 1.0; }; }, "Valo, joka seuraa pelaajaa aina, kun rakettimoottoria käytetään");
            Keyboard.Listen(Key.Up, ButtonState.Released, delegate { aika.Stop(); valo.Intensity = 0.0; }, "Avaruusluotaimen rakettimoottorin animaation lopetus");
            AddCollisionHandler(pelaaja, delegate(PhysicsObject luotain, PhysicsObject kohde)
            {
                const int NOPEUSRAJA = 100;
                if (pelaaja.Velocity.Y > NOPEUSRAJA || pelaaja.Velocity.Y < -NOPEUSRAJA || pelaaja.Velocity.X > NOPEUSRAJA || pelaaja.Velocity.X < -NOPEUSRAJA)
                {
                    aika.Start(); aika.Timeout += delegate { valo.Position = pelaaja.Position; }; valo.Intensity = 2.0;
                }
            });
            break;

        case 5:
            Level.Width  = 4800;
            Level.Height = 900;
            LuoKentta(maaston5Kuva, -150, 2150, tormaysparametrit, bensanMaara, 4800);
            Level.Background.CreateStars();
            LuoAlkuteksti(alkuteksti, pelaaja);
            LuoLaskeutumisalusta(2250, -357, 200);
            LuoPelaaja(pelaaja, 100, -150, true);

            PhysicsObject luola = PhysicsObject.CreateStaticObject(840, 510);
            luola.CollisionIgnoreGroup = 1;
            luola.Image    = luolanKuva;
            luola.Position = new Vector(1247, 155);
            Add(luola, 1);

            PhysicsObject luolanSuu = PhysicsObject.CreateStaticObject(270, 30, Shape.Circle);
            luolanSuu.Image = Image.FromGradient(100, 10, Color.Black, Color.Charcoal);
            luolanSuu.CollisionIgnoreGroup = 1;
            luolanSuu.Angle    = Angle.FromDegrees(5);
            luolanSuu.Position = new Vector(luola.X - 80, luola.Bottom + 150);
            Add(luolanSuu);

            PhysicsObject esteYlin = TeeEste(470, -138);
            esteYlin.Mass = 45;
            TeeEste(470, -240);
            TeeEste(470, -342);

            PhysicsObject kivi = new PhysicsObject(100, 100, Shape.Circle);
            kivi.Position = new Vector(-2000, 100);
            kivi.Image    = kivenKuva;
            kivi.Mass     = 10;
            Add(kivi);

            PhysicsObject planeetta = PhysicsObject.CreateStaticObject(400, 400);
            planeetta.CollisionIgnoreGroup = 1;
            planeetta.Image            = planeetankuva;
            planeetta.AbsolutePosition = new Vector(Level.Right - 100, Level.Top - 100);
            Add(planeetta, 0);
            break;

        case 6:
            Keyboard.Clear();
            LuoOhjaimet(pelaaja, alkuteksti, bensamittari, bensanMaara, 450);
            LuoAlkuteksti(alkuteksti, pelaaja);
            LuoKentta(maaston6Kuva, -400, 2400, tormaysparametrit, bensanMaara);
            Level.Background.Image = LoadImage("JupiterTausta");
            Level.Background.CreateStars();
            LuoLaskeutumisalusta(700, -195, 70);
            LuoPelaaja(pelaaja, -700, 400);
            LopetaNappainkomennot();
            break;

        case 7:
            mustaAukkoKayta = mustaAukko.CreateSound();
            //mustaAukkoAnimaatio = LoadAnimation("MustanAukonAnimaatio");
            LuoAlkuteksti(alkuteksti, pelaaja);
            Level.Width = 8000;
            Level.CreateBorders();
            Level.Background.CreateStars();
            LuoLaskeutumisalusta(Level.Right, Level.Bottom, 1);
            LuoPelaaja(pelaaja, Level.Left + 100, 0, true);
            pelaajaOnTuhoutunut  = false;
            pelaajaOnLaskeutunut = false;
            bensanMaara.Value    = 1500;
            for (int i = 0; i < 15; i++)
            {
                PhysicsObject a = LuoAsteroidit(200, 500);

                if (Vector.Distance(a.Position, pelaaja.Position) < a.Height)
                {
                    a.Destroy();
                    i--;
                }
            }

            int[,] mustanAukonKohdat = new int[, ] {
                { -2500, 300 }, { 0, -300 }, { 1500, 0 }, { 2500, 100 }
            };
            for (int i = 0; i < 4; i++)
            {
                LuoMustaAukko(mustanAukonKohdat[i, 0], mustanAukonKohdat[i, 1], 5000, pelaaja);
            }

            Timer lapi = new Timer();
            lapi.Start();
            lapi.Interval = 0.1;
            lapi.Timeout += delegate
            {
                if (pelaaja.X >= Level.Right - 100 && pelaajaOnTuhoutunut == false)
                {
                    pelaaja.Image = pelaajanKuva;
                    LopetaNappainkomennot();
                    pelaajaOnLaskeutunut = true;
                    LuoKentanPaatosteksti();
                    Pause();
                }
            };
            break;

        case 8:
            LuoAlkuteksti(alkuteksti, pelaaja);
            LuoKentta(maaston8Kuva, -210, 330, tormaysparametrit, bensanMaara);
            Level.Background.CreateGradient(Color.White, Color.Azure);
            LuoLaskeutumisalusta(677, -307, 200, Color.DarkGray);
            LuoPelaaja(pelaaja, -700, -100);

            PhysicsObject tukikohta = PhysicsObject.CreateStaticObject(200, 100);
            tukikohta.Position             = new Vector(674, -255);
            tukikohta.Image                = asema;
            tukikohta.CollisionIgnoreGroup = 1;
            Add(tukikohta);

            PhysicsObject pikkuKivi = PhysicsObject.CreateStaticObject(14, 14);
            pikkuKivi.Image    = pienenKivenKuva;
            pikkuKivi.Position = new Vector(530, -300);
            Add(pikkuKivi);
            AddCollisionHandler(pelaaja, pikkuKivi, delegate(PhysicsObject luotain, PhysicsObject murikka) { pelaaja.AngularVelocity = -5; });
            break;

        case 9:
            Level.Background.Image = LoadImage("Loppu");
            LuoLaskeutumisalusta(700, -175, 100);
            LuoPelaaja(pelaaja, -400, 0);
            pelaaja.Destroy();
            laskeutumisAlusta.Destroy();
            bensamittari.Destroy();
            rakettimoottoriKayta.Volume = 0;

            string[] lopputekstit = new string[] { "Congratulations, Mission Accomplished", "You destroyed " + pelaajanTuhoutumiset + " probes during your journey",
                                                   "The managers of the space program wish you good retirement", "They really hope you retire", "", "Credits:", "Game created by Antti Franssila", "",
                                                   "Licence free stuff:", "Space probe image - historicspacecraft.com", "Images used in creating levels - pixabay.com", "Black hole animation - bestanimations.com", "Sounds - freesound.org" };

            Timer tekstiAjastin = new Timer();
            tekstiAjastin.Interval = 3;
            tekstiAjastin.Start();
            int tekstilaskuri = 0;
            tekstiAjastin.Timeout += delegate {
                Label lopputeksti = new Label(lopputekstit[tekstilaskuri]);
                lopputeksti.TextColor = Color.White;
                lopputeksti.Y         = -200;
                lopputeksti.X         = 30;
                Add(lopputeksti);
                lopputeksti.MoveTo(new Vector(30, 10), 10, lopputeksti.Destroy);
                tekstilaskuri++;
                if (tekstilaskuri == lopputekstit.Length)
                {
                    tekstiAjastin.Stop();
                }
            };
            break;
        }
        LuoBensa(bensamittari, bensanMaara, pelaaja);
        AddCollisionHandler(pelaaja, Tuhoutuminen);
        AddCollisionHandler(pelaaja, tormaaminen);
        AddCollisionHandler(pelaaja, laskeutumisAlusta, Laskeutuminen);
    }