[SDL] Optionsmenü für ein Spiel



  • Hi,

    ich möchte ein Optionsmenü für ein Spiel programmieren. Jedoch hab ich keinerlei Ahnung von GUI programmierung. Was ich bräuchte ist ein Tutorial wie man für Spiele GUI's programmiert.

    Als Beispiel:

    http://www.celeris.com/games/vp3/help/images/esc01.JPG
    http://nwn.bioware.com/support/images/launcherversion.jpg

    (Und halt die ganzen anderen sachen die in einen normalen GUI vorkommen wie Editboxes, checkboxes, slider, etc)



  • Fuer so einfache Faelle:

    du klatscht ein paar Bitmaps wohin und merkst dir ihre Position. Sobald ein Mausklick reinkommt schaust du, ob die Mausposition sich innerhalb eines solchen Bitmaps befindet, und loest die entsprechende Option aus.

    Ganz triviales Beispiel:
    du hast ein Menu mit den 2 Optionen "start game" und "exit game".

    Das "start game"-Bitmap befindet sich an (10, 10) (obere linke Ecke) bis (100, 100) (untere rechte Ecke).

    "end game" hingegen befindet sich an (10, 110) bis (100, 200).

    Jetzt kommt ein Mausklick rein, und zwar an Position (55, 56). Das befindet sich also offensichtlich innerhalb des "start game"-Bitmaps, also startest du das Spiel.

    Fuer kompliziertere Anwendungen gibts bereits vorgefertigte Libs, je nachdem was fuer eine Grafik-Library du einsetzt.



  • danke für die antwort, aber was ist mit

    Und halt die ganzen anderen sachen die in einen normalen GUI vorkommen wie Editboxes, checkboxes, slider, etc



  • Genauso. Für den Slider z.B. machst du ein Bitmap mit dem Element ohne den Hebel und ein Bitmap für den Hebel. Dann abfragen, ob der Benutzer auf den Hebel klickt und diesen verschieben.

    Oder Checkboxes. Ganz einfach: Ein Bitmap "unchecked" und eins "checked". Vielleicht noch eins dazwischen, falls der Benutzer die Maustaste noch nicht losgelassen hat, "transition". Dann abfragen, ob der Cursor draufliegt und entsprechend die Bitmaps zeichnen.

    Aber schau dir mal vorhandene Libs an, ist vielleicht einfacher als alles neu zu machen.

    gruß
    Martin





  • Hallo

    Vielleicht ist guichan ja was für dich.

    chrische



  • GUIs werden meist durch Widgets realisiert. Widgets sind meist viereckige Malflaechen (wie Bilder), nur dass sie selbst wissen wie sie aussehen. So gibt es meist eine abstrakte Widget-Klasse von denen die verschiedenen Widgets dann abgeleitet werden (Buttons, Texteingabefelder, Checkboxen etc.). So haben alle Widgets für das GUI-System das gleiche Interface.

    Dabei spielen oft auch Z-Koordinaten eine Rolle. Die Z-Koordinate eines Widgets gibt im Grunde genommen die Malreihenfolge an, zuerst werden alle Widgets mit dem kleinsten Wert gemalt, dann die nächstgrösseren darüber. Ein aktives Widget wird immer am Schluss gemalt, ist z.B. bei Pull-Down-Widgets wichtig. Wenn man es öffnet wird es grösser und sollte andere GUI-Elemente überdecken.

    Meistens werden in solchen Systemen auch Parent<->Child Abhängigkeiten benutzt. Ein Fenster-Widget kann ja mehrere Buttons, Textfelder, Menus und alles haben. Also wird beim Malen eines Widgets auch darauf geachtet ob es Kind-Widgets besitzt um diese daraufhin auch zu malen.

    Natürlich drängt sich da auch der Gedanke auf mit Dirty-Rects zu arbeiten. Jedoch ist das ja eher Aufgabe des Renderers denn des GUI-Systems. Das GUI-System kann aber prüfen ob Widgets komplett verdeckt sind und sie so garnicht erst an den Renderer schicken.

    Klick-, Tastatur- oder sonstige Events werden vom Input-System einfach an den GUI-Manager geschickt, der dann die Message an das jeweilige Widget weiterschickt. So ungefähr könnte man Events in der GUI realisieren.

    Klingt alles recht einfach, ist es aber nicht 😛 In Wirklichkeit ist es eine ziemlich mühsame angelegenheit so ein GUI-System zu programmieren 🙂

    Edit:
    Gibt im Internet viele OpenSource Widget-Systeme, es kann sich lohnen eins davon zu laden und mal etwas im Code zu stöbern. Eventuell Doxygen-Docs generieren und mal bisschen anschauen.



  • Wenn du wirklich das ganze rein in SDL machen willst (ohne OGL o. ä.) und keine fertige Bibliothek nutzen willst, so wirst du unter http://sol.gfxile.net/imgui/ ein Tutorial finden.


Anmelden zum Antworten