Funktional-reaktive Programmierung

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.

Installation auf dem heimischen Rechner

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.

Kollisionserkennung für Figure

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 notwendig
    

Ein 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)
    

Martin Gasbichler
Last modified: Wed Jul 16 10:12:09 MST 2003