Beispiel #1
0
        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);
        }