Mein MMBasic-Code für mein Vektorspiel entsteht überwiegend in MMB4L auf dem Mac, getestet wird dann auf dem CMM2. Beide reden MMBasic, die Grafik-Befehle heißen aber unterschiedlich. MMB4L nutzt GRAPHICS WINDOW, GRAPHICS BUFFER, GRAPHICS WRITE und GRAPHICS COPY. Auf dem CMM2 heißt das MODE, PAGE WRITE und PAGE COPY. Statt zwei Dateien zu pflegen, fahre ich beides aus einer Quelle.
Plattform erkennen
MM.DEVICE$ liefert den Namen der Plattform. Bei MMB4L steht da "MMB4L", beim CMM2 etwas anderes. Daraus mache ich zwei Flags, die ich überall sonst benutze.
DIM INTEGER IS_MMB4L, IS_CMM2
IF MM.DEVICE$ = "MMB4L" THEN
IS_MMB4L = 1
IS_CMM2 = 0
ELSE
IS_MMB4L = 0
IS_CMM2 = 1
ENDIF
Grafik einrichten
Bei MMB4L muss man das Fenster und einen Off-Screen-Buffer selbst anlegen. Auf dem CMM2 setzt MODE 1, 8 den Grafik-Modus, mehrere Pages stehen dann automatisch zur Verfügung.
IF IS_MMB4L THEN
GRAPHICS WINDOW 0, SCREEN_W, SCREEN_H, -1, -1, "Game"
GRAPHICS BUFFER 1, SCREEN_W, SCREEN_H
ELSEIF IS_CMM2 THEN
MODE 1, 8
CLS
ENDIF
In der Frame-Schleife
Ich zeichne immer auf den Off-Screen-Buffer und kopiere am Ende des Frames auf das Display. Das verhindert das Flackern, das man bei direktem Zeichnen sofort sieht.
IF IS_MMB4L THEN
GRAPHICS WRITE 1
GRAPHICS CLS 1, RGB(BLACK)
ELSEIF IS_CMM2 THEN
PAGE WRITE 1
CLS
ENDIF
' alle Objekte zeichnen
IF IS_MMB4L THEN
GRAPHICS COPY 1 TO 0
ELSEIF IS_CMM2 THEN
PAGE COPY 1 TO 0
ENDIF
Was mich am Anfang Stunden gekostet hat: die Logik mit Buffer 1 als Arbeitsfläche und 0 als Display ist auf beiden Plattformen gleich, die Befehle drumherum nicht. Wenn man eine Stelle vergisst, bekommt man Mischbilder oder einen schwarzen Screen. Ich lasse die zwei Pfade deshalb bewusst direkt nebeneinander stehen, dann sieht man auf einen Blick, ob beide Seiten gepflegt sind.
Die Geometrie- und Mathe-Befehle wie LINE, POLYGON, PIXEL und die MATH-Familie funktionieren bei beiden gleich. Für die meisten Routinen ist der Plattform-Switch deshalb nur in der Init-Phase und am Frame-Anfang/Ende relevant, der Rest des Codes bleibt sauber.