Ich schreibe ein kleines RTS-Spiel in Haskell, und die Zeit ist gekommen Erstellen Sie einige GUI dafür (Schaltflächen, Menüs und so). Aber ich nicht Ich habe Erfahrung mit der Erstellung von GUI-Werkzeugen, daher wäre ich dankbar für Ideen, wie man richtige Datentypen wählt, Routinen für die Ereignisbehandlung und so.
Gewünschte Funktionalität: Menü-Bildschirme (Haupt, Laden / Speichern, Einstellungen, Netzwerkspiel), Texteingaben, Spielschnittstelle (Hauptbildschirm (C & amp; C-ähnlich) mit Schaltflächen, Auswahl und Kontrollkästchen.
Mein aktueller Ansatz besteht darin, die gesamte GUI als Zustandsmaschine darzustellen Das hat eine Reihe von Zuständen und Übergängen zwischen ihnen ausgelöst, wenn ein Ereignis eintrifft:
%Vor%Widget ist etwas wie
%Vor%wo
%Vor% Wenn ein Ereignis kommt und das passende Widget gefunden wird, schaut mein Programm
für einen Handler für diese Art von Ereignis in wtEventHandlers
für dieses Widget,
und führt eine Aktion aus, wenn ein solcher Handler gefunden wird.
Wenn ein Widget erstellt wird, wird sein Rect zu QuadTree
hinzugefügt, was
abgefragt von findWidget
. Die Struktur wird aktualisiert, wenn Widgets erstellt werden
oder entfernt.
Es ist jedoch sehr schwierig, auf diese Weise zu programmieren, weil UI-Zustände sind bereits zahlreich (auch für eine einfache Benutzeroberfläche mit ein paar Tasten und keine Menüs).
Ich habe darüber nachgedacht, jedes Widget als Zustandsmaschine zu implementieren und Erstellen dieser Maschinen, so dass die Anzahl der Zustände und Übergänge wird reduziert. Vielleicht wäre es gut, es in eine Monade zu verpacken (wie es ist in XMonad getan).
Dinge, die ich angeschaut habe:
Meine Fragen sind:
Monad
eine gute Idee? E. g.
%Vor%Tags und Links haskell user-interface sdl