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:

 

VarMap-ID

2

 

Wichtig ist an dieser Stelle, das das VarMap die ID 2 bekommt, damit das zuvor definierte Sprite mit der ID 1 nicht "überschrieben" wird.

 

Die Domain- und Range-Werte der Stützpunkte lassen sich wie folgt erklären:

 

Links beginnt das Ausschneiden an der horizontalen Position 0, wogegen das letzte Zeichen in der Zeile den Wert 150 (linke untere Ecke des Zeichens in der Grafik) hat. Es müssen nun für alle Zeilen für jeweils das linke und das rechte Zeichen die horizontale Startposition definiert werden.

 

Die einzige Ausnahme ist der letzte Stützwert für das Zeichen 128, welches nicht mehr auf der Grafik im Sprite definiert ist. Hier wird hinterlegt, dass alles ab Zeichen 128 den X-Wert 0 bekommt.

Domain

Range

 

32

0

 

47

150

 

48

0

 

63

150

 

64

0

 

79

150

 

80

0

 

95

150

 

96

0

 

111

150

 

112

0

 

127

150

 

128

0

 

 

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:

 

VarMap-ID

3

 

Wichtig ist an dieser Stelle, das das VarMap die ID 3 bekommt, damit das zuvor definierte Sprite mit der ID 1 und das erste VarMap-Element mit der ID 2 nicht "überschrieben" werden.

 

Die Domain- und Range-Werte der Stützpunkte lassen sich wie folgt erklären:

 

Links beginnt das Ausschneiden an der vertikalen Position 0. Das Gleiche gilt auch für das letzte Zeichen in der Zeile. Eine Zeile höher wird ab der vertikalen Position 10 für die gesamte Zeile positioniert ... usw..

 

Zeichen ab 128 werden wieder auf die Zeile 0 gesetzt. Das bewirkt zusammen mit dem anderen VarMap, dass für diese Zeichen ein Leerzeichen ausgegeben wird ;-)

Domain

Range

 

47

0

 

48

10

 

63

10

 

64

20

 

79

20

 

80

30

 

95

30

 

96

40

 

111

40

 

112

50

 

127

50

 

128

0

 

 

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:

 

Sprite-ID

Pos X

Pos Y

Width

Height

Rel X

Rel Y

Beschreibung

1

V[2:0]

V[3:0]

10

10

0

0

Kopierbereich für das Zeichen

 

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 )
{
   int i;
   int v[1];

   for( i=0; i<StrLen( s ); i++ )
   {
      v[0] = s[i];
      GraphicOutEx( x,y, "Big_Letters.ric", v );
      x += 10;
   }
}

 

task main()
{

   BigLettersOut(  0,40, "Hello"  );

   BigLettersOut( 30,25, "world!" );


   while( 1 )

      ;
}

 

 

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