Mittwoch, 30. März 2011

Pong - C# XNA - Bitspielerei

Mit Pong ist es jetzt schon das dritte Minigame das wir innerhalb einer Woche umgesetzt haben. Diesmal stellen wir euch hier das Komplette Visual Studio 2008 Projekt als Download zur Verfügung.

Hier im Blog möchte ich nur einen kleinen Teil des Quellcodes vorstellen und euch die Arbeit auf Bit- und Byteebene etwas näher bringen.

Die Anzeigetafel:

Eine Ziffer der Anzeigetafel besteht aus 3 x 5 Feldern.

3 x 5 = 15

Insgesamt sind also 15 Felder für die Darstellung einer Ziffer nötig. Jedes dieser Felder kann entweder "leuchten" oder "aus" sein.
Das bedeutet, dass für die Anzeige einer Ziffer 15 Bits benötigt werden.

Die Signatur der Methode, die eine Ziffer zeichnen soll benötigt also nur einen Parameter und könnte so aussehen:

void DrawDigit(int bitField);

Soll in dieser Methode eine 8 gezeichnet werden muss also als Parameter

1 1 1
1 0 1
1 1 1
1 0 1
1 1 1

übergeben werden.

Zu beachten ist jetzt noch die Bitwertigkeit. Links oben soll sich das LSB (Least Significant Bit) befinden und rechts unten das MSB (Most Significant Bit).

Das heißt, der zu übergebende Wert ist 111101111101111, also 31727.

DrawDigit(31727); zeichnet eine 8.
Auf diese Art und Weise lässt sich also jedes beliebige Bild darstellen, das auf 3 x 15 Feldern passt. (Zum Beispiel Buchstaben und sonstige Symbole wie Smilies).

Die Komplette ausprogrammierte Methode zum Zeichen der Ziffer sieht dann folgendermaßen aus:
public void DrawDigit(int bitField)
{
   double count = 0;
   Vector2 startPos = new Vector2(0, 0);
   for (int i = 0; i < 5; i++)
   {
      for (int y = 0; y < 3; y++)
      {
         if ((bitField & (int)Math.Pow(2, count)) > 0)
            spriteBatch.Draw(mPixel, new Rectangle((int)startPos.X + 17 * y, (int)startPos.Y + 17 * i, 15, 15), Color.White);

         count++;
      }
   }
}

Den Quellcode findet ihr hier:
Download

1 Kommentar: