Skip to content

Commit

Permalink
[dlatikay 20210418] #44 levelbeschreibungssprache vereinfachungen und…
Browse files Browse the repository at this point in the history
… erweiterungen
  • Loading branch information
dlatikaynen committed Apr 18, 2021
1 parent 4886965 commit 7b97d31
Show file tree
Hide file tree
Showing 8 changed files with 104 additions and 21 deletions.
5 changes: 3 additions & 2 deletions Aufzaehlungen/ZeichnungsBefehl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@ internal enum ZeichnungsBefehl
/// eine linie ist ein pfad mit nur zwei koordinaten.
/// ein rechteck ist ein pfad mit nur zwei koordinaten und B suffix.
/// ein gefülltes rechteck ist ein pfad mit nur zwei koordinaten und F suffix.
/// ein kreis ist ein ei mit quadratischer umschreibung.
/// </summary>
Pfad,
Bogen,
Ellipse,
Ei,
Gummiband,
Kurve
Kurva
}
}
20 changes: 17 additions & 3 deletions Klassen/Farbverwaltung.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,19 +39,33 @@ public static Brush BuersteVonMedium(Medium vonMedium)
}
}

public static Pen StiftVonMedium(Medium vonMedium)
public static Pen StiftVonMedium(Medium vonMedium, int stiftDicke = 0)
{
Pen derStift;
switch (vonMedium)
{
case Medium.Berg:
return Farbverwaltung.Bergstift;
derStift = Farbverwaltung.Bergstift;
break;

case Medium.Stahl:
return Farbverwaltung.Stahlstift;
derStift = Farbverwaltung.Stahlstift;
break;

default:
throw new ArgumentOutOfRangeException(nameof(vonMedium), vonMedium, nameof(Medium));
}

if (stiftDicke > 1)
{
derStift.Width = (float)stiftDicke;
}
else
{
derStift.Width = 1f;
}

return derStift;
}
}
}
27 changes: 18 additions & 9 deletions Klassen/LevelArchitekturPfad.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,14 @@ internal class LevelArchitekturPfad
protected internal ZeichnungsBefehl zeichnungBefehl = ZeichnungsBefehl.Pfad;
protected internal bool wirdRechteck;
protected internal bool hatFuellung;
protected internal int stiftDicke;

public LevelArchitekturPfad() => this.promilleKoordinaten = new List<Point>();
public bool IstPunkt => this.promilleKoordinaten.Count() == 1;
public bool IstLinie => this.promilleKoordinaten.Count() == 2;
public bool IstRechteck => this.wirdRechteck;
public bool IstGefuellt => this.hatFuellung;
public int StiftDicke => this.stiftDicke;

public GraphicsPath AlsGrafikPfad(int absoluteWidth, int absoluteHeight)
{
Expand Down Expand Up @@ -51,29 +53,36 @@ internal static LevelArchitekturPfad AusLevelDatei(Medium aktuellesMaterial, str
terrainMaterial = aktuellesMaterial
};

if (levelZeile.ToUpperInvariant().EndsWith(LevelArchitekturPfad.modifiziererVollesRechteck))
var kommandoTeile = levelZeile.Split('*');
if (kommandoTeile.Length > 1 && int.TryParse(kommandoTeile[1].Trim(), out int stiftDicke))
{
architekturPfad.stiftDicke = stiftDicke;
}

var kommandoZeile = kommandoTeile[0].Trim();
if (kommandoZeile.ToUpperInvariant().EndsWith(LevelArchitekturPfad.modifiziererVollesRechteck))
{
architekturPfad.wirdRechteck = true;
architekturPfad.hatFuellung = true;
levelZeile = levelZeile.Substring(0, levelZeile.Length - LevelArchitekturPfad.modifiziererVollesRechteck.Length);
kommandoZeile = kommandoZeile.Substring(0, kommandoZeile.Length - LevelArchitekturPfad.modifiziererVollesRechteck.Length);
}
else if (levelZeile.ToUpperInvariant().EndsWith(LevelArchitekturPfad.modifiziererRechteck))
else if (kommandoZeile.ToUpperInvariant().EndsWith(LevelArchitekturPfad.modifiziererRechteck))
{
architekturPfad.wirdRechteck = true;
levelZeile = levelZeile.Substring(0, levelZeile.Length - LevelArchitekturPfad.modifiziererRechteck.Length);
kommandoZeile = kommandoZeile.Substring(0, kommandoZeile.Length - LevelArchitekturPfad.modifiziererRechteck.Length);
}
else if(levelZeile.ToUpperInvariant().EndsWith(LevelArchitekturPfad.modifiziererFuellung))
else if(kommandoZeile.ToUpperInvariant().EndsWith(LevelArchitekturPfad.modifiziererFuellung))
{
architekturPfad.hatFuellung = true;
levelZeile = levelZeile.Substring(0, levelZeile.Length - LevelArchitekturPfad.modifiziererFuellung.Length);
kommandoZeile = kommandoZeile.Substring(0, kommandoZeile.Length - LevelArchitekturPfad.modifiziererFuellung.Length);
}

if(levelZeile.EndsWith(";"))
if(kommandoZeile.EndsWith(";"))
{
levelZeile = levelZeile.Substring(0, levelZeile.Length - ";".Length);
kommandoZeile = kommandoZeile.Substring(0, kommandoZeile.Length - ";".Length);
}

var geleseneKoordinaten = levelZeile.Split(';').Select(koordinatenPaar =>
var geleseneKoordinaten = kommandoZeile.Split(';').Select(koordinatenPaar =>
{
var koordinatenTeile = koordinatenPaar.Split(',');
return new Point(int.Parse(koordinatenTeile[0]), int.Parse(koordinatenTeile[1]));
Expand Down
6 changes: 5 additions & 1 deletion Klassen/LevelSequenzierer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,11 @@ public static LevelBeschreibung ErzeugeLevelBeschreibung(int laufendeLevelNummer
levelBeschreibung.MissionsNummer = 1;
levelBeschreibung.LevelNummerInMission = 3;
levelBeschreibung.LevelName = "Dalí";
levelBeschreibung.IstBerg = false;
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);
Expand Down
8 changes: 4 additions & 4 deletions Klassen/LevelZeichner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ public static void Zeichne(Control woBinIch, Bitmap levelBild, LevelBeschreibung
if (architekturPfad.IstPunkt)
{
zeichenFlaeche.DrawLine(
Farbverwaltung.StiftVonMedium(architekturPfad.terrainMaterial),
Farbverwaltung.StiftVonMedium(architekturPfad.terrainMaterial, architekturPfad.StiftDicke),
grafikPfad.PathPoints[0],
grafikPfad.PathPoints[0]
);
Expand All @@ -152,7 +152,7 @@ public static void Zeichne(Control woBinIch, Bitmap levelBild, LevelBeschreibung
}

zeichenFlaeche.DrawRectangle(
Farbverwaltung.StiftVonMedium(architekturPfad.terrainMaterial),
Farbverwaltung.StiftVonMedium(architekturPfad.terrainMaterial, architekturPfad.StiftDicke),
grafikPfad.PathPoints[0].X,
grafikPfad.PathPoints[0].Y,
Math.Abs(grafikPfad.PathPoints[1].X - grafikPfad.PathPoints[0].X) + 1,
Expand All @@ -162,7 +162,7 @@ public static void Zeichne(Control woBinIch, Bitmap levelBild, LevelBeschreibung
else
{
zeichenFlaeche.DrawLine(
Farbverwaltung.StiftVonMedium(architekturPfad.terrainMaterial),
Farbverwaltung.StiftVonMedium(architekturPfad.terrainMaterial, architekturPfad.StiftDicke),
grafikPfad.PathPoints[0],
grafikPfad.PathPoints[1]
);
Expand All @@ -180,7 +180,7 @@ public static void Zeichne(Control woBinIch, Bitmap levelBild, LevelBeschreibung
else
{
zeichenFlaeche.DrawPath(
Farbverwaltung.StiftVonMedium(architekturPfad.terrainMaterial),
Farbverwaltung.StiftVonMedium(architekturPfad.terrainMaterial, architekturPfad.StiftDicke),
grafikPfad
);
}
Expand Down
53 changes: 53 additions & 0 deletions Klassen/LinienFolger.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ScorchGore.Klassen
{
/// <summary>
/// Eine Implementierung des Bresenham Linienalgorithmus
/// basierend auf einer Idee von https://stackoverflow.com/a/11683720/1132334
/// </summary>
internal class LinienFolger
{
public IEnumerable<Point> Bresenham(int startX, int startY, int endX, int endY)
{
var w = endX - startX;
var h = endY - startY;
var dx1 = Math.Sign(w);
var dy1 = Math.Sign(h);
var dx2 = dx1;
var dy2 = 0;
var longest = Math.Abs(w);
var shortest = Math.Abs(h);
if (longest <= shortest)
{
longest = Math.Abs(h);
shortest = Math.Abs(w);
dx2 = 0;
dy2 = Math.Sign(h);
}

var numerator = longest >> 1;
for (var i = 0; i <= longest; ++i)
{
yield return new Point(startX, startY);
numerator += shortest;
if (numerator < longest)
{
startX += dx2;
startY += dy2;
}
else
{
numerator -= longest;
startX += dx1;
startY += dy1;
}
}
}
}
}
1 change: 1 addition & 0 deletions ScorchGore.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@
<Compile Include="Klassen\LevelBeschreibungsSkript.cs" />
<Compile Include="Klassen\LevelSequenzierer.cs" />
<Compile Include="Klassen\LevelZeichner.cs" />
<Compile Include="Klassen\LinienFolger.cs" />
<Compile Include="Klassen\Plateau.cs" />
<Compile Include="Klassen\Sprite.cs" />
<Compile Include="Klassen\Treffer.cs" />
Expand Down
5 changes: 3 additions & 2 deletions Zeug/Levels/Level003.dat
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
0,0;100,100;200,100;300,50;400,20;1000,0F
0,0;100,200;200,150;300,50;400,20;1000,0F
STAHL
10,100;200,100
10,100;200,100*4
210,500;400,555;B*3
10,500;200,520;B
10,530;200,555;BF
BERG
Expand Down

0 comments on commit 7b97d31

Please sign in to comment.