RIC-Beispiel: Neuer Zeichensatz
Das nächste Beispiel zeigt die mögliche Realisierung eines Wunsches, der schon mehrfach geäußert wurde: Einen neuen Zeichensatz für den NXT. Egal ob er nun größer oder kleiner als der im NXT verfügbare Zeichensatz mit seiner 6x8 Matrix sein soll - mit der richtigen RIC-Datei und ein paar Zeilen Programmcode kann auch dieser Wunsch realisiert werden.
Am Anfang steht die Frage, wie groß die Buchstaben des neuen Zeichensatzes sein sollen. Für unser Beispiel verwenden wir 10 x 10 Punkte großes Raster, welches für die bessere Erkennbarkeit der Buchstaben links und unten einen Abgrenzungsstrich enthält:
Selbstverständlich kann später auf die linke untere Markierung verzichtet werden. An dieser Stelle hilft diese uns aber, den Aufbau der RIC-Datei besser zu verstehen.
In wie weit der Zeichensatz innerhalb der RIC-Datei abgebildet werden soll, ist jedem selbst überlassen - jedoch reicht es in der Regel aus, wenn nur die Zeichen 32 bis 128 definiert werden, da die Zeichen unterhalb von 32 in der Regel nur Steuerzeichen sind und jenseits der 128 nur Sonderzeichen, die oft nicht gebraucht werden.
Somit wird die RIC-Datei für den neuen Zeichensatz wie folgt aufgebaut sein:
RIC-Element |
Realisierung |
Parameter |
Anmerkung |
Grafik für den Zeichensatz |
Sprite |
|
Enthält die Grafik für alle darzustellende Zeichen |
Umrechnungsfunktion X-Wert |
VarMap |
|
Basis für die Berechnung der Zeichenmatrix-Position |
Umrechnungsfunktion Y-Wert |
VarMap |
|
Basis für die Berechnung der Zeichenmatrix-Position |
Ausgabe des Buchstabens |
CopyBits |
0 : Zeichen |
Kopiert die Buchstabenmatrix auf den NXT-Bildschirm |
Hier nun die notwendigen Schritte, um die RIC-Datei zu erstellen:
Schritt |
Beschreibung |
||||||||||||||||||||||||||||||||||||||||||||||
0 |
Starten wir nun das Programm nxtRICeditV2 und beginnen mit einer neuen RIC-Datei |
||||||||||||||||||||||||||||||||||||||||||||||
1 |
Zuerst wird ein neues Sprite-Element eingefügt, welches die Grafik für die Buchstaben des neuen Zeichensatz enthalten wird. Hierzu einfach einmal auf den Button mit folgendem Icon drücken:
Danach eine Grafik mit folgendem Bild erstellen:
Wichtig ist, dass das Sprite-Element die Sprite-ID 1 bekommt!
Jeder Buchstaben wird innerhalb eines 10 x 10 Punkte großen Rasters definiert. 16 Buchstaben in einer Zeile. Unten links steht das erste Zeichen - hier mit dem ASCII-Code 32, was einem Leerzeichen entspricht.
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 Element in der RIC-Liste wird ein VarMap-Element benötigt. Dieses dient zur Umrechnung der Nummer des Buchstabens (ASCII-Wert) in den X-Wert der Position innerhalb der Sprite-Matrix. Zum Glück muss nicht für jeden Buchstaben ein eigener Stützwert erstellt werden! Wir benötigen nur immer für das erste und das letzte Zeichen in einer Zeile den Stützwert - die Positionen dazwischen werden dann wieder über lineare Interpolation ermittelt. Somit sieht die "Umrechnung" für den ASCII-Wert in den X-Positionswert wie folgt aus:
Um die Eingabe der Punkte zu erleichtern, können auch die Domain/Range-Paare aus folgender Tabelle dafür kopiert werden:
Für das Kopieren kann wieder der Button rechts von der List mit den Domain/Range-Werten mit folgendem Icon verwendet werden:
|
||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
3 |
Neben der Umrechnung von ASCII-Wert in die horizontale Startposition, benötigen wir auch eine Umrechnung in die vertikale Startposition. Auch dieses wird wieder über ein VarMap-Element erfolgen. Dieses sieht jedoch, im Gegensatz zum letzten VarMap-Element, etwas anders aus:
Auch hier kann die Eingabe der Domain/Range-Paare erleichtert werden, wenn die Werte aus folgender Tabelle dafür kopiert werden:
Für das Kopieren kann wieder der Button rechts von der List mit den Domain/Range-Werten mit folgendem Icon verwendet werden:
|
||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
4 |
Das letzte - aber auch das wichtigste - RIC-Element in dieser Datei ist natürlich das CopyBits, welches aus der oben definierten Sprite mit der ID 1 und mit Hilfe der beiden VarMap-Elementen mit der ID 2 und 3 den richtigen Ausschnitt mit dem gewünschten Buchstaben auf den NXT-Bildschirm bringt. Um das notwendige RIC-Element CopyBits an das Ende der Liste einzufügen muss einfach nur auf folgenden Button gedrückt werden:
Folgende Einstellungen müssen nun für das CopyBits-Element definiert werden:
Hellblau markierte Felder müssen als VarMap-Werte definiert werden! |
Nachdem nun alle notwendigen RIC-Elemente definiert wurden, kann das Ergebnis über folgenden Button betrachtet werden:
Wenn nun der Parameter 0 verändert wird, so sollte für die Werte 32 bis 127 der gewünschte Buchstabe des eigenen Fonts unten links auf dem Display angezeigt werden.
Natürlich reicht dieses noch nicht aus, um ganze Texte auszugeben. Hierzu wird ein wenig NXC-Code benötigt, der jedoch recht einfach ist und sich leicht in eigene Programme integrieren lässt:
void BigLettersOut( int
x, int y, string s )
task main() BigLettersOut( 0,40, "Hello" ); BigLettersOut( 30,25, "world!" );
; |
Nach Ausführung des Programms erscheint folgender Text auf dem NXT-Bildschirm:
Die in diesem Programm enthaltene Prozedur BigLettersOut kann so in jedes eigene NXC-Programm mit übernommen werden. Es muss jedoch darauf geachtet werden, dass der Inkrementfaktor von 10 (Zeile x += 10;) an den jeweiligen Font angepasst wird. Die Routine kann auch noch so angepasst werden, dass Sonderzeichen wie z.B. Zeilenvorschub mit berücksichtigt werden, so dass auch mehrzeilige Ausgaben mit nur einem Aufruf möglich sind