internal static LevelBeschreibungsSkript Laden(LevelBeschreibung levelBeschreibung) { var levelSkript = new LevelBeschreibungsSkript(); levelSkript.LevelDateiLaden(levelBeschreibung.LevelNummer); return(levelSkript); }
public static void Zeichne(Control woBinIch, Bitmap levelBild, LevelBeschreibung levelBeschreibung, Graphics zeichenFlaeche) { var verfuegbareBergHoehe = woBinIch.Height - Main.obererRand; for ( var obenUnten = ObenUnten.BergTeil; obenUnten <= (levelBeschreibung.IstHoehle ? ObenUnten.HoehlenTeil : ObenUnten.BergTeil); ++obenUnten ) { var minimumHoehe = Convert.ToInt32(Convert.ToDecimal(verfuegbareBergHoehe) * Convert.ToDecimal(levelBeschreibung.MinHoeheProzent(obenUnten)) / 100M); var maximumHoehe = Convert.ToInt32(Convert.ToDecimal(verfuegbareBergHoehe) * Convert.ToDecimal(levelBeschreibung.MaxHoeheProzent(obenUnten)) / 100M); var steilHeit = Convert.ToInt32(5 + levelBeschreibung.RauhheitProzent(obenUnten)); var rauhHeit = 10M - Convert.ToDecimal(levelBeschreibung.RauhheitProzent(obenUnten) / 20M); var zufallsZahl = new Random(levelBeschreibung.BergZufallszahl); var maximumHoehenunterschied = maximumHoehe - minimumHoehe; var aktuelleHoehe = Convert.ToDecimal(minimumHoehe + zufallsZahl.Next(maximumHoehenunterschied)); var aktuelleRichtung = (zufallsZahl.Next(100) % 2) == 0; var aktuelleSteilheit = Convert.ToDecimal(Math.Max(1, zufallsZahl.Next(steilHeit)) * 0.22); var unveraenderteSteigung = Convert.ToInt32(zufallsZahl.NextDouble() * (double)rauhHeit); var zeichenAbschnitt = zeichenFlaeche.BeginContainer(); if (obenUnten == ObenUnten.BergTeil) { /* den himmel zeichnen wir nur beim ersten mal */ zeichenFlaeche.FillRectangle(Farbverwaltung.Himmelsbuerste, zeichenFlaeche.ClipBounds); } else { LevelZeichner.ObenWirdUnten(woBinIch, zeichenFlaeche); } if (levelBeschreibung.IstBerg || levelBeschreibung.IstHoehle) { Plateau binInPlateau = null; for (var bergX = 0; bergX < woBinIch.Width; bergX += 2) { /* berg/stalaktitten höhenänderung berechnen */ var hoehenAenderung = 0M; if (aktuelleRichtung) { hoehenAenderung += aktuelleSteilheit; } else { hoehenAenderung -= aktuelleSteilheit; } aktuelleHoehe += hoehenAenderung; if (aktuelleHoehe < 0) { aktuelleRichtung = true; aktuelleHoehe = aktuelleSteilheit / 2M; } else if (aktuelleHoehe > maximumHoehenunterschied) { aktuelleRichtung = false; aktuelleHoehe = maximumHoehenunterschied - aktuelleSteilheit / 2M; } /* berg/stalaktitten zeichnen */ var pixelHoehe = minimumHoehe + Convert.ToInt32(aktuelleHoehe); if (binInPlateau == null) { if (levelBeschreibung.Plateaus.ContainsKey(bergX)) { binInPlateau = levelBeschreibung.Plateaus[bergX]; } } if (binInPlateau != null) { if (binInPlateau.EndetX < bergX) { binInPlateau = null; } else { pixelHoehe = binInPlateau.Elevation; } } zeichenFlaeche.FillRectangle(Farbverwaltung.Bergbuerste, bergX, (float)woBinIch.Height - pixelHoehe, 2f, (float)woBinIch.Height); /* zacken in den berg/in die stalaktitten machen */ if (--unveraenderteSteigung <= 0) { woBinIch.Refresh(); aktuelleRichtung = (zufallsZahl.Next(100) % 2) == 0; aktuelleSteilheit = Convert.ToDecimal(Math.Max(1, zufallsZahl.Next(steilHeit)) * 0.22); unveraenderteSteigung = Convert.ToInt32(zufallsZahl.NextDouble() * (double)rauhHeit); } } } zeichenFlaeche.EndContainer(zeichenAbschnitt); } if (levelBeschreibung.IstGeskriptet) { var zeichenAbschnitt = zeichenFlaeche.BeginContainer(); LevelZeichner.ObenWirdUnten(woBinIch, zeichenFlaeche); zeichenFlaeche.ScaleTransform(2f, 2f); zeichenFlaeche.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None; zeichenFlaeche.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; zeichenFlaeche.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half; foreach (var architekturPfad in levelBeschreibung.BeschreibungsSkript.Pfade) { if (architekturPfad.terrainMaterial == Medium.Gras) { /* gras kann immer nur linien folgen */ LevelZeichner.ZeichneGras(woBinIch, zeichenFlaeche, architekturPfad); } else { switch (architekturPfad.zeichnungBefehl) { case ZeichnungsBefehl.Bogen: break; case ZeichnungsBefehl.Gummiband: LevelZeichner.ZeichneGummiband(woBinIch, zeichenFlaeche, architekturPfad); break; case ZeichnungsBefehl.Kurva: break; case ZeichnungsBefehl.Ei: LevelZeichner.ZeichneEi(woBinIch, zeichenFlaeche, architekturPfad); break; default: LevelZeichner.ZeichnePfad(woBinIch, zeichenFlaeche, architekturPfad); break; } } } zeichenFlaeche.EndContainer(zeichenAbschnitt); } }
/// <summary> /// Das Zufallslevel im "Übungsmodus" hat die Nummer 0 /// </summary> public static LevelBeschreibung ErzeugeLevelBeschreibung(int laufendeLevelNummer) { var levelBeschreibung = new LevelBeschreibung { LevelNummer = laufendeLevelNummer }; switch (laufendeLevelNummer) { case 0: /* das ist (sind) das (die) übungslevel */ break; case 1: levelBeschreibung.MissionsNummer = 1; levelBeschreibung.LevelNummerInMission = 1; levelBeschreibung.LevelName = "The Blue Mountains"; levelBeschreibung.BergMinHoeheProzent = 13; levelBeschreibung.BergMaxHoeheProzent = 48; levelBeschreibung.BergRauhheitProzent = 21; levelBeschreibung.BergZufallszahl = LevelSequenzierer.zufallsZahlenGenerator; levelBeschreibung.Plateau(645 - 460, 82, 200); levelBeschreibung.SpielerPosition1 = new Point(112, Main.spielerBasisHoehe); levelBeschreibung.Plateau(645 - 415, 638, 700); levelBeschreibung.SpielerPosition2 = new Point(673, Main.spielerBasisHoehe); break; case 2: levelBeschreibung.MissionsNummer = 1; levelBeschreibung.LevelNummerInMission = 2; levelBeschreibung.LevelName = "The Blue Cave"; levelBeschreibung.BergMinHoeheProzent = 10; levelBeschreibung.BergMaxHoeheProzent = 39; levelBeschreibung.BergRauhheitProzent = 19; levelBeschreibung.HoehleMinHoeheProzent = 13; levelBeschreibung.HoehleMaxHoeheProzent = 48; levelBeschreibung.HoehleRauhheitProzent = 50; levelBeschreibung.IstHoehle = true; levelBeschreibung.BergZufallszahl = LevelSequenzierer.zufallsZahlenGenerator; levelBeschreibung.SpielerPosition1 = new Point(Main.spielerBreite, 300); levelBeschreibung.SpielerPosition2 = new Point(800 - Main.spielerBreite, 300); break; case 3: levelBeschreibung.MissionsNummer = 1; levelBeschreibung.LevelNummerInMission = 3; levelBeschreibung.LevelName = "Dalí"; levelBeschreibung.IstBerg = true; levelBeschreibung.BergZufallszahl = LevelSequenzierer.zufallsZahlenGenerator; levelBeschreibung.BergMinHoeheProzent = 3; levelBeschreibung.BergMaxHoeheProzent = 17; levelBeschreibung.BergRauhheitProzent = 8; levelBeschreibung.BeschreibungsSkript = LevelBeschreibungsSkript.Laden(levelBeschreibung); levelBeschreibung.SpielerPosition1 = new Point(112, Main.spielerBasisHoehe); levelBeschreibung.SpielerPosition2 = new Point(673, Main.spielerBasisHoehe); break; case 4: levelBeschreibung.MissionsNummer = 2; levelBeschreibung.LevelNummerInMission = 1; levelBeschreibung.LevelName = "Vah Miaw"; break; default: /* spielende */ return(null); } levelBeschreibung.MisisonsnameSetzen(); return(levelBeschreibung); }