Guten Morgen,
ich arbeite derzeit fleißig daran, mich mit der Spieleprogrammierung auseinanderzusetzen und sitze derzeit vor einem Snake Klon. Derzeit lässt sich die Schlange steuern…und das wars im Moment auch schon.
Das Problem besteht darin, dass ich beim Bewegen der Schlange ja nichtnur einen ‚neuen‘ Kopf bauen, sondern auch das letzte Stück der Schlange entfernen muss. Und letzteres bereitet mir Schwierigkeiten.
Das gesamte Spielfeld wird in einem 2D-Array gespeichert. Den Array habe ich gewählt, da ich plane, später eine Art „Levelbuilder“ zu schreiben, der eine Textdatei ausliest und bestimmte Zeichen in Spielelemente umwandelt (Items, Wände etc). Zum Beispiel:
##########
#000100###
#00020000#
##000000##
##00000###
#0000000##
##00##000#
#000##0#0#
#00000003#
##########
- Wand, 0 - leer, 1 - Körper, 2 - Kopf, 3 - Item
Die eigentliche Frage: Wie finde ich das Schwanzteil? Gibt es einen einfacheren Weg, um das Spielfeld zu zeichnen?
Die Board.cs:
class Board
{
#region Variablen
Rectangle drawArea = ScreenSpace.DrawArea;
Material2D mBackground = new Material2D(„SpaceBackground“);
Material2D mHead = Material2D.Default;
int iHeadPositionX = 0;
int iHeadPositionY = 49;
float fSpeed = 0.25f;
float fTime = 0.0f;
public static int[,] boardArray = new int[100, 100];
string sDirection = „r“;
#endregion
#region Constructor
public Board()
{
//Spielbrett mit 0’en füllen
fillBoard();
}
#endregion
#region Run
public void Run()
{
#region Input
//Auf Tastatureingaben reagieren
if (Input.Keyboard.CursorUpIsPressed && sDirection != „d“)
sDirection = „u“;
if (Input.Keyboard.CursorDownIsPressed && sDirection != „u“)
sDirection = „d“;
if (Input.Keyboard.CursorLeftIsPressed && sDirection != „r“)
sDirection = „l“;
if (Input.Keyboard.CursorRightIsPressed && sDirection != „l“)
sDirection = „r“;
#endregion
#region UpdateSnake
//Snake bewegen
move(sDirection);
#endregion
#region Draw
mBackground.Draw(Rectangle.One);
Font.Default.DrawTopLeft("FPS: " + Time.Fps);
//Das Spielbrett zeichnen
//0 - leer; 1 - Körper; 2 - Kopf;
for (int i = 0; i = fSpeed)
{
if (Direction == „u“)
{
//Kopf im boardArray verschieben
boardArray[iHeadPositionX, iHeadPositionY - 1] = 2;
//‚alten Kopf‘ zum Körper machen
boardArray[iHeadPositionX, iHeadPositionY] = 1;
//Variable mit der Kopfposition updaten
iHeadPositionY–;
//TODO: Letztes Stück der Schlange entfernen
}
else if (Direction == „d“)
{
boardArray[iHeadPositionX, iHeadPositionY + 1] = 2;
boardArray[iHeadPositionX, iHeadPositionY] = 1;
iHeadPositionY++;
}
else if (Direction == „r“)
{
boardArray[iHeadPositionX + 1, iHeadPositionY] = 2;
boardArray[iHeadPositionX, iHeadPositionY] = 1;
iHeadPositionX++;
}
else if (Direction == „l“)
{
boardArray[iHeadPositionX - 1, iHeadPositionY] = 2;
boardArray[iHeadPositionX, iHeadPositionY] = 1;
iHeadPositionX–;
}
//reseten des Timers
fTime = 0.0f;
}
}
}