Die Bibliotheken, die für die funktional-reaktive Programmierung
benötigt werden sind im selben Verzeichnis wie die Module für den Roboter-Simulator installiert. Deswegen
muss Hugs mit denselben Parametern gestartet werden.
Nun stehen (u.a.) die Module Animation und Fal
zur Verfügung, die die in Vorlesung vorgestellten Funktionen
bereitstellen. Zusätzlich finden sich im Verzeichnis
/afs/informatik.uni-tuebingen.de/pu/fp-2003/lib/hugs/common
noch zahlreiche Beispiele zur Verwendung.
Es ist möglich die Module zur funktional-reaktiven Programmierung un den Roboter-Simulator auf dem heimischen Rechner (das gilt für diverse Unix und Windows) zu installieren. Wir empfehlen euch aber die zentrale Installation am WSI zu benutzen, denn die funktioniert. Aber so könnte es funktionieren: 1. Die Grafik-Bibliothek für Hugs in der Version 2.0.5 (wichtig!) runterladen, eventuell kompilieren und installieren. 2. Die Dateien aus /afs/informatik.uni-tuebingen.de/pu/fp-2003/lib/hugs/common auf deinen Rechner kopieren.
Die Bibliothek Geometry stellt neben dem Typ Figure noch eine Erweiterung Shape bereit. Auf diesem Datentyp ist eine Kollisionserkennung möglich, wichtig für die Spieleprogrammierung!
Der Typ Shape ist abstrakt, es gibt jedoch eine Funktion shape :: Figure -> Shape mit der sich aus einer Figure eine Shape erzeugen lässt. Kollisionen kann man dann mit der Funktion intersect :: Shape -> Shape -> Bool erkennen, außerdem gibt es noch die Funktion contains :: Shape -> Point -> Bool die anzeigt, ob eine Shape einen Punkt enthält. Elemente vom Typ Shape zeichnet die Funktion drawShape :: Shape -> Graphic, allerdings nur in einer Farbe und links oben platziert. Das ist aber nicht weiter schlimm, man kann einfach die zugehörige Figure zeichnen, und Shape nur zur Kollisionserkennung verwenden.Für die funktional-reaktive Programmierung ist es noch notwendig, Shape zu Behaviors zu machen, das ist jedoch einfach:
cont = lift2 contains inters = lift2 intersect shap = lift1 shape drawShap = lift1 drawShape -- nicht wirklich notwendigEin kleines Beispiel zeigt einen großen, roten Ball, der sich einem kleinen, blauen Ball nähert, und ihm bei einer Berührung ängstlich ausweicht:
ex :: Beh Graphic ex = paint red movingC `over` paint blue fixC where movingC = translate (pairB y (round' (10 * time))) (circ 30) movingCS = shap movingC y = 250 `untilB` hit ->> 400 fixC = translate (pairB 250 250) (circ 20) fixCS = shap fixC hit = when (movingCS `inters` fixCS)