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.