Menuoberfläche
-
Hallo,
ich würde gerne wissen, wie man zb ein einfaches Hauptmenu eines Spieles macht.
Ich habe daran gedacht, Sprites zu benutzen. Dafür habe ich einfach eine Textur gemalt, auf welcher ein paar "Knöpfe" zu sehen sind und wollte die Eckpunkte mit der aktuellen Mausposition vergleichen.
Die Textur ist zB 512x512 und ich skaliere sie auf die Bildschirmauflösung hoch. Allerdings muss ich bei dieser Methode doch für jede Auflösung die Eckpunkte der Knöpfe (also die "Trefferzone der Maus") anders definieren.. scheint zu viel Aufwand zu sein, wenn man viele Auflösung anbieten will - und unprofessionell wirkt es auch (ganz davon abgesehen, dass ich hierbei nicht einmal richtige "Knöpfe" benutze..)
Hat jemand Anregungen für mich?
Danke schonmal im Voraus!
-
Bastel dir halt ein Menüfenster. Sprich du legst nen Child an und erstellst
die Buttons im WM_CREATE: wenn du das hast, kannst du locker flockig
Texturen für den Hintergrund und für die Buttons benutzen.
-
Klingt verlockend so ein Menu mit richtigen Buttons - allerdings habe ich mit WinApi noch nicht so viel gemacht, so dass ich mich erst einarbeiten müsste... oder gibt es eine einfache Alternative zur WinApi?
-
Ziemlich einfache Sache. Arbeitest du mit VStudio? Da kannst du das im VS_Editor machen, dann als Resource abspeichern und in dein Prog laden.
-
Ah, ok, noch nie gemacht... Probiere ich nachher zu Hause direkt aus - Danke dafür!
Gibts sonst noch Alternativen oder ist das so die gängige Lösung?
-
Glaub hab da mal nen Tutorial gesehen wo sich extra einer ne Lib includiert
hat und damit eine GUI geschrieben hat, such jenachdem ob du mit
DirectX/OpenGL arbeitest mal beo google nach "OpenGL/DirectX GUI"
etc.
-
Erstens muesstest du die Eckpunkte nicht fuer jede Aufloesung selbst definieren, das kann der Computer auch schoen selbst ausrechnen.
Was genau verwendest du denn?
So ein eigener Button ist eigentlich recht schnell gemacht
Du brauchst ja nur 3 Sprites und zeichnest immer den entsprechenden Sprite fuer den Status, den der Button grad hat (also normal, mouseover und mousedown)
-
So, also ich habe momentan eine einfache Textur, welche die Gestalt eines Menus hat. Die Knöpfe sollen nicht "animiert" sein, ganz einfach halt.
Powerpaule schrieb:
Erstens muesstest du die Eckpunkte nicht fuer jede Aufloesung selbst definieren, das kann der Computer auch schoen selbst ausrechnen.
Jau, hab mir dann überlegt, wie man das machen kann:
bei meiner 512x512 Textur ist die obere linke Ecke bei 147/154.
ich speichere erstmal die skalierungswerte für die achsen:
scalex = screen_breite / 512;
scaley = screen_hoehe / 512;
bei einer auflösung von 1280x800 macht das also folgendes:
scalex = 2.5f
scaley = 1.5f
nun "skaliere" ich die eckpunkte entsprechend der auflösung (also zB 147*scalex und 154*scaley) und gucke gleichzeitig, ob der cursor zwischen den eckpunkten liegt.soweit richtig? hat das überhaupt jemand nachvollziehen können?
naja, ich bin verwirrt, weil die berechneten eckpunkte anders sind als die von der skalierten gezeichneten textur... sieht jemand einen denkfehler?
@way: kannst du mir vielleicht noch einen genaueren wink in deine richtung geben? meinst du, ich soll ein neues projekt erstellen, dort ein fenster, menu nach wunsch erstellen, das als resource speichern und in meinem eigentlichen projekt als resource laden?
danke schonmal für eure antworten!
-
-
TGGC schrieb:
Ja, so etwa sollte es klappen. f'`8k
Ok, danke erstmal für die Antwort, aber meinst Du beide Varianten, nur mein Spritegedöns oder nur die ChildResourceVariante?
-
ich empfehle dir das ganze immer von 0.f bis 1.f zu betrachten, entsprechend auch die maus koordinaten immer auf diese skalierung zu bringen.
kurz vor dem zeichnen multiplizierst du deine koordinaten mit der aufloesung (benutzt du z.b. opengl/d3d, kannst du die koordinaten auch von der graka multiplizieren lassen).
wenn du die schnittstelle vom mausinput und zum rendern sauber machst, kannst du spaeter eventuell auch verschachtelte fenster bzw buttons in fenstern machen.
beispiel waere eine klasse CMyCoordinate mit
class CMyCoord { float m_x,m_y; public: CMyCoord(float x,float y): m_x(x), m_y(y) { } float ScreenX(){return m_x*width+offsetx;} float ScreenY(){return m_y*width+offsety;} }; class CMyCoordFromMouse : public CMyCoord { CMyCoordFromMouse(float x,float y): CMyCoord((x-offsetx)/width,(y-offsety)/height) { } };
die maus uebergibt also immer CMyCoordFromMaus, beim zeichnen nutzt du ScreenX und ScreenY, und sonst hast du immer zahlne von 0.f bis 1.f
(das ist nur beispiel source gerade zusammengehackt, er muss nicht schoen, nicht 100% richtig sein, sondern nur veranschaung der idee
)
btw. wenn du dir die viele arbeit sparen willst, kannst du auch eine der vielen gui libs nutzen, zZ scheinen viele die http://www.cegui.org.uk/wiki/index.php/Main_Page zu nutzen.