Die niedrigen Dezember-Temperaturen können die Arbeit mit Ihrem ST sehr erschweren. Aber das ist nun vorbei. Der patentierte Window-Eiskratzer aus unserem Gimmick-Labor schafft im Nu wieder einen klaren Bildschirm und Ihnen ein angenehmes Arbeiten.
Der Winter macht auch vor Ihrem Atari nicht halt. Zwischen den elektrischen Leitungen des 68000 Mikroprozessors, das ist der große Chip auf der Hauptplatine des ST, befindet sich oft Kondenswasser. Das ist normalerweise nicht weiter schlimm und durchaus normal. Ein Teil des Kondenswassers gelangt aber über den Videochip (meist über die Röhre mit den Adressen $FF8201 und $FF8203) an die Video-Out-Buchse des ST. Dort steigt es, durch die Arbeitswärme des Prozessors bedingt, bis an die obere Bildschirmzeile des Monitors. Durch die Öffnungen des Lautsprechers dringt es nach außen. Bei zu niedrigen Temperaturen passiert es manchmal, daß der Wasserdampf im Monitor zu kristallisieren beginnt. Und das hat sehr unangenehme Folgen: Es fängt an zu schneien, und der Bildschirm mitsamt den Fenstern vereist. Im Extremfall läßt sich das, was sich hinter den Fenstern befindet, nur noch erahnen. Über den Fenstern türmt sich schon nach kurzer Betriebsdauer der Schnee. Aber auch der Mauszeiger leidet unter den tiefen Temperaturen. Häufiges Ausrutschen auf den Drop-Down-Menüs macht die Bedienung des Desktops zur Tortour.
All dies ist dem Benutzer unseres diesmaligen Gimmicks nur noch ein müdes Lächeln wert. Der Window-Eiskratzer bringt wieder klare Fenster auf Ihren Bildschirm.
Kopieren Sie sich das Programm SNOW.PRG in Ihren Autoordner oder starten Sie es direkt vom Desktop aus. Das Programm finden Sie im Archiv »Gimmick« auf der TOS-Diskette. Nach dem Start aktivieren Sie den Window-Eiskratzer mit der rechten Maustaste. Anstatt des gewohnten Mauszeigers erscheint nun der Window-Eiskratzer. Drücken Sie die Maus etwas fester auf Ihren Schreibtisch, halten Sie die rechte Maustaste dabei immer noch gedrückt und schieben Sie den Mauszeiger in regelmäßigen Bahnen überein vereistes Fenster. Auf diese Weise sorgen Sie wieder für klare Sicht.
Bitte beachten Sie, daß das Programm nur in der hohen Grafikauflösung des ST funktioniert.
Dieses Gimmick entstand wieder mit dem Megamax-Modula-2-Entwicklungssystem. SNOW.TXT ist der Text des Hauptprogramms. MSINIT ist ein spezielles Initialisierungsmodul für residente Programme. In der Megamax-Modula-2-Shell geben Sie dieses Modul im Menü PARAMETER/LINKER anstatt des Moduls M2INIT an. Die Module MSSYSTEMS, MSGRAPHICS, MSSOUNDS, MSFIXREALS und MSMOUSE sind von den vorherigen Gimmicks bekannt. MSFIXREALS wird in diesem Gimmick nur von MSMOUSE importiert und benötigt von dort nur die Typendefinition FIXREAL. Beim optimierten Linken entfernen Sie deshalb dieses Modul.
Das Programm benötigt insgesamt drei Grafikseiten. Zwei Grafikseiten (WorkScreen und DisplayScreen) benutzt Snow für die Zwei-Seiten-Grafik. Die dritte Grafikseite (SnowScreen) dient für den liegengebliebenen Schnee, wobei dort jedes gelöschte Pixel (Bildpunkt) eine liegengebliebene Schneeflocke darstellt. Grundsätzlich verwenden wir in diesem Gimmick auch wieder unseren beliebten VBL-Trick, bei dem sich das Programm in den VBL-Interrupt einhängt und somit regelmäßig aktiviert wird. Solange kein Schnee fällt, ist nur während der Eiskratzerdarstellung die Zwei-Seiten-Grafik aktiv. Zunächst kopiert Snow den TOS-Screen (das ist der Bildschirmspeicher, den TOS benutzt) und setzt dann den Eiskratzer in diese Kopie ein.
Wie schon angedeutet, unterscheiden wir zwischen den Schneeflocken, die noch fallen und denen, die bereits liegengeblieben sind. Jede Schneeflocke beginnt ihr Leben als fallende Flocke. Maximal fallen 201 Schneeflocken gleichzeitig. Diesen Wert verändern Sie mit der Konstante »MaxNoOfSnowFlakes«. Für die Steuerung und das Zeichnen der fallenden Schneeflocken ist die Prozedur DrawAndAnimateSnowFlakes verantwortlich. Im Feld »SnowFlakes« merkt sich Snow die aktuellen Parameter für jede Schneeflocke. Bei Programmstart sind keine Schneeflocken vorhanden, so daß jedes Feldelement den Eintrag lsThere=sFALSE besitzt. Bei jedem neuen Bildaufbau werden alle Feldelemente untersucht. Ist ein Feldelement unbesetzt, versucht das Programm, eine neue Schneeflocke zu erzeugen. Ob dies geschieht, ist von der Schneerate (»SnowRate«) abhängig. Bei der Initialisierung einer neuen Schneeflocke ermittelt »Snow« die Startposition und die Fallgeschwindigkeit zufällig. Um beim Zeichnen der Flocke möglichst schnell zu sein, ist die Wortposition und eine entsprechende Bitmaske in den Parametern der Flocke vorhanden. Da aber der Hintergrund des Desktops aus einem einfachen Graumuster besteht, genügt es nicht, nur ein Pixel weiß zu zeichnen. Stattdessen ist es erforderlich, die vertikal und horizontal benachbarten Pixel der Flocke ebenfalls zu löschen. Aus diesem Grunde führen wir immer zwei Bitmuster zum Zeichnen mit (»ThreePointPattern« und »OnePointPattern«). Um eine Flocke vertikal weiterzubewegen, addieren wir einen festen Wert zu der aktuellen Adresse der Flocke hinzu. Soll eine Flocke z. B. je Bild eine Zeile weiter nach unten schweben, addieren wir den Speicherbedarf einer Bildsschirmzeile, also 80 Byte.
Das vorliegende Gimmick ist ein hübsches Beispiel für ein einfaches Partikelsystem, denn jede einzelne Schneeflocke reagiert für sich auf ihre Umwelt (hier: das Desktopbild) und auf die schon liegengebliebenen Schneeflocken. Die möglichen Reaktionen bestehen dabei aus »liegenbleiben«, »nach rechts fallen« und »nach links fallen«. Das Interessante an einem Partikelsystem: Selbst bei einer solch einfachen »Gesetzgebung« wie in unserem Gimmick ergibt das Zusammenspiel der vielen Partikel (Schneeflocken) ein übergeordnetes Verhalten. Wenn Sie das Gimmick einige Minuten ruhig vor sich hin laufen lassen, beobachten Sie die Bildung einer bestimmten Struktur. Es bilden sich Hügel und Täler.
Um den liegengebliebenen Schnee darzustellen, benutzen wir eine spezielle Kopierroutine, die ein logisches AND mit dem TOSScreen und dem SnowScreen durchführt und das Ergebnis in den WorkScreen schreibt. Der SnowScreen wird deshalb invers behandelt, d.h. Nullen stellen die liegengebliebenen Flocken dar. Beim Start des Programms füllt die Prozedur FillScreen den SnowScreen mit Einsen. Damit die Schneeflocken nicht aus dem Bildschirmbereich fallen, ist der SnowScreen einige Zeilen größer als normal. In diesen Zeilen befinden sich Nullen, wodurch eine dünne, nicht sichtbare Schneedecke entsteht. Sie stoppt die fallenden Schneeflocken. Dies hat den Vorteil, daß das Programm nicht jede Schneeflocke noch einmal extra auf eine Bildschirmüberschreitung hin überprüfen muß.
Das Bild zeigt, wie die einzelnen Schneeflocken während des Falls auf die verschiedenen Bitmuster in der darunterliegenden Zeile reagieren. Die Werte, die sich aufgrund dieser Bitmuster ergeben, sind von der horizontalen Position der Schneeflocke abhängig und werden daher für jede Schneeflocke in »Record SnowFlake« mitgeführt (Check... Value). Ein einfacher Vergleich genügt dann zur Reaktionsentscheidung. Da der Inhalt des SnowScreen invertiert ist, muß sich beim Test mit dem SnowScreen der Bildschirminhalt vor dem Test mit
not.l D1
nochmals invertieren.
Fällt eine Schneeflocke nach rechts oder links, müssen sämtliche Bitmasken neu angelegt werden. Dies geschieht - wie beim Initialisieren einer neuen Flocke -mit der Routine »SetUpPatterns«. Befindet sich die neue Position an einer Langwortgrenze, muß das Programm die Wortadresse der Flocke ebenfalls verändern. Gelangt die neue Position an die linke oder rechte Bildschirmgrenze, verschwindet die Schneeflocke.
Eine Schneeflocke beendet ihren Flug, wenn der Eintrag IsThere sFALSE enthält. Zuletzt zeichnet das Programm die liegengebliebene Schneeflocke in den SnowScreen ein.
Die Vereisung der Fenster funktioniert automatisch, weil diese nicht aus einem Graumuster bestehen. Startet eine neue Schneeflocke zufällig an einer Position, an der sich ein Fenster befindet, stoppt sie beim nächsten Durchlauf. Am entsprechenden Fenster entsteht auf diese Weise ein neues »Eiskristall«.
Sobald die rechte Maustaste gedrückt ist, verschwindet der normale Mauszeiger des TOS mit Hilfe der LineA-Funktion HIDE_MOUSE. Stattdessen zeichnet das Programm mit der Funktion Sprite aus dem Modul MSGRAPHICS das Bild des Window-Eiskratzers in die Bildschirmkopie (WorkScreen). Gleichzeitig zeichnet es von der alten Position des Mauszeigers bis zur aktuellen Position eine Linie von Sprites auf den SnowScreen, die die Kratzspur darstellen. Gleichzeitig verschwinden an dieser Stelle die schon liegengebliebenen Schneeflocken (Pixel). Das Eiskratzgeräusch (ScratchSound) startet bei jeder Bewegung des Eiskratzers, falls es zu dieser Zeit noch nicht aktiv sein sollte. (ah)