public void TiettyPeliValittu() { LisaaPelaajaPeliin(); LataaKentta(); if (ValittuMusiikki != null) { Sound biisi = ValittuMusiikki.CreateSound(); biisi.IsLooped = true; biisi.Play(); } Timer.SingleShot(0.1, KaynnistaPeli); }
/// <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); }