RIC-Beispiel: Pong

 

Jeder von uns kennt das kleine Spiel Pong, bei dem zwei Spieler je einen Schläger am linken und rechten Spielrand vertikal steuern, um einen Ball dazwischen abprallen zu lassen. Verloren hat derjenige, der den Ball verpasst. Natürlich kann man den Ball, die Schläger, die Seitenbegrenzung und den Punktestand mit einzelnen Grafikbefehlen in der Programmierung für den NXT ausgeben, jedoch benötigt man dafür doch einiges an Coding, ist in der Darstellung sehr begrenzt und kann nachträglich keine Änderungen mehr vornehmen.

 

Das folgende Beispiel zeigt nun, wie einfach man eine komplette Darstellung des Spielfeldes, incl. Punkteanzeige, mit nur einem einfachen RIC-Datei-Aufruf realisieren kann:

 

Spielelement

Realisierung

Parameter

Anmerkung

Punkteanzeige linker Spieler

NumBox

0 : Punkte

Anzahl der Punkte für den linken Spieler

Punkteanzeiger rechter Spieler

NumBox

1 : Punkte

Anzahl der Punkte für den rechten Spieler

Obere Spielfeldbegrenzung Line   Statisches Element
Mittellinie Line   Statisches Element

Untere Spielfeldbegrenzung

Line

 

Statisches Element

Linker Schläger

CopyBit 3 x 8 Punkte

2 : Y-Pos

Die Position des linken Schlägers

Rechter Schläger

CopyBit 3 x 8 Punkte

3 : Y-Pos

Die Position des rechten Schlägers

Ball

CopyBit 5 x 5 Punkte

4 : X-Pos

5 : Y-Pos

Die Position des Balles

 

Wir haben nun 8 Spielelemente - jedoch werden wir mehr als nur 8 RIC-Elemente verwenden, da für die Definition der Grafik für den Ball und die beiden Schläger noch ein zusätzliches Sprite-Element benötigt wird.

 

Hier nun die notwendigen Schritte, um eine solche RIC-Datei zu erstellen, damit am Ende folgender Output auf dem Display zu sehen ist:

 

 

Schritt

Beschreibung

0

Starten wir nun das Programm nxtRICeditV2 und beginnen mit einer neuen RIC-Datei

   

1

Einfügen eines neuen Sprite-Elements, welches die Grafik für den Ball und beide Schläger enthalten wird. Hierzu einfach einmal auf den Button mit folgendem Icon drücken:

 

 

Danach eine kleine Grafik mit folgendem Bild erstellen:

Das ist die Anordnung aller drei Elemente, die am wenigsten Speicher benötigt.

So werden lediglich 13 Byte für das Speichern dieser Grafik benötigt!

Damit diese besser erkannt werden können, sind sie rechts noch einmal gesondert eingefärbt dargestellt: Linker Schläger (rot), rechter Schläger (blau) und Ball (grün).

 

Die Platzierung der Grafik auf der zur Verfügung stehenden Zeichenfläche ist nicht wichtig, da ohnehin nur die benutzten Punkte später abgespeichert werden. Sollten Fehler bei der Eingabe der Grafik gemacht werden, so können die Punkte einfach dadurch entfernt werden, wenn der benötigte Speicherplatz wieder minimiert wird:

 

   

2

Als nächstes werden die beiden NumBox-Elemente für die Punkteanzeige eingefügt. Diese können durch zweimaliges Drücken auf folgenden Button hinzugefügt werden:

 

 

Diese beiden NumBox-Elemente sind die ersten, die einen Parameter für die Anzeige benötigen! Daher sollten die Einstellungen für diese Elemente wie folgt gesetzt werden:

 

 

NumBox

Pos X

Pos Y

Value

Beschreibung

1

43

0

P[0]

Punktezähler links

2

51

0

P[1]

Punktezähler rechts

 

Gelb markierte Felder müssen als Parameterwerte definiert werden! Ein Ändern der beiden Parameter 0 und 1 zeigen sofort eine Änderung in der Anzeige für das PreView.

   

3

Danach werden drei Line-Elemente eingefügt, die die Begrenzung des Spielfeldes und die Mittellinie darstellen. Am einfachsten können diese durch dreimaliges Drücken auf folgenden Butten eingefügt werden:

 

 

Die Koordinaten für Start- und Endpunkt der drei Linien kann per Maus oder über eine direkte Eingabe gemacht werden:

 

 

Startpunkt

Endpunkt

 

Linie

X-Wert

Y-Wert

X-Wert

Y-Wert

Beschreibung

1

0

0

99

0

Untere Begrenzungslinie

2

0

63

99

63

Obere Begrenzungslinie

3

49

1

49

62

Mittellinie

   

4

Nach den einfacheren Elementen müssen nun die drei CopyBits-Elemente definiert werden. Ein dreimaliges Drücken des folgenden Buttons fügt diese Elemente an das Ende der Liste ein:

 

 

Folgende Einstellungen sollten nun für alle drei CopyBits-Elemente eingegeben werden:

 

CopyBits

Sprite-ID

Pos X

Pos Y

Width

Height

Rel X

Rel Y

Beschreibung

1

1

0

5

3

8

2

P[2]

Schläger links

2

1

4

5

3

8

95

P[3]

Schläger Rechts

3

1

1

0

5

5

P[4]

P[5]

Spielball

 

Gelb markierte Felder müssen als Parameterwerte definiert werden! Dadurch werden die farbigen Bereiche dynamisch aus dem zuvor definierten Sprite wie folgt auf den NXT-Bildschirm kopiert:

 

   
5 Zuletzt muss die RIC-Datei unter dem Dateinamen Pong.ric abgespeichert werden.

Wie oben links in der Vorschau erkannt werden kann, ist das RIC-File nur 149 Bytes groß! Eine herkömmliche programmtechnische Realisierung würde ein Vielfaches dieses Speicherplatzes im NXT benötigen!

 

Nachdem nun alle notwendigen RIC-Elemente definiert wurden, kann das Ergebnis über folgenden Button betrachtet werden:

 

 

Wenn nun die Parameter 0 bis 5 verändert werden, so wird das Preview sofort entsprechend aktualisiert. Entsprechend wird auch der Aufruf innerhalb eines Programms erfolgen. Das folgende Code-Fragment zeigt jedoch nur ein Beispiel der Anwendung, wie sie auch im Pong-Programm verwendet wird:

 

 

task main()
{

   int pong[ 6 ];

 

   pong[ 0 ]= 0;    // Points of left player

   pong[ 1 ]= 0;    // Points of right player

   pong[ 2 ]= 28;   // Vertical position of left player

   pong[ 3 ]= 28;   // Vertical position of right player

   pong[ 4 ]= 37;   // Horizontal position of ball

   pong[ 5 ]= 19;   // Vertical position of ball

 

   // Draw complete Pong-Display with one call of RIC file!


   GraphicOutEx( 0,0, "Pong.ric" ,pong );


   while( 1 )

      ;
}

 

 

Für das eigentliche Spiel muss natürlich die Ausgabe innerhalb einer Schleife gemacht werden, wobei vor jedem Aufruf die 6 Übergabeparameter aktualisiert werden müssen! Die Position der beiden Spielerpositionen kann über den Rotationssensor der NXT-Motore ermittelt werden. Eine mögliche Implementierung findet man hier: Pong.nxc