GUI-Werte an Auflösung anpassen

  • Hallo Community,
    Ich habe des öfteren in anderen Beiträgen diese Frage gestellt, aber keine Antwort erhalten.
    Deshalb frage ich hier:
    Wie bekomme ich die GUI-Werte, damit ein GUI in jeder Auflösung gleich ist?
    Ich habe aus anderen Posts herauslesen können, dass das eine Prozentrechnung ist.
    Wie das gemeint ist verstehe ich bis heute nicht :D
    Also ich meine ich mache ein GUI in der Auflösung 1900x1600.
    Was muss man nun genau rechnen um den Wert zu bekommen?
    Ich meine man muss so rechnen:

    Lua
    sx, sy = guiGetScreenSize()
    dxDraw ( sx-sx*Wert, sy-sy*Wert, ... )


    So, diesen "Wert" brauche ich.


    Wäre nett wenn mir da jemand auf die Sprünge helfen könnte.
    Wenn ich mich irgendwo in der Rechnung irre, verbessert mich :)


    mfg

  • An einem Beispiel:
    Du hast ein Label mit der Breite 192 und der Höhe 160.
    Nun rechnest du aus wie viel Prozent das DEINER Auflösung entspricht.


    Das machst du mit Pw/PG = P% oder anders ausgedrückt Prozentwert/Grundwert = Prozentsatz
    192/1920 = 0.1
    160/1600 = 0.1


    Und das ist der Wert.

    [tabmenu]
    [tab=Signatur, 'http://tinyurl.com/cj7apxm']Sie werfen Steine auf meinen Thron - Doch sie kriegen diese Krone nicht!
    Krone | Futurama | Das Urteil

    [tab=Projekte, 'http://tinyurl.com/cen3v2a']Folgt
    [/tabmenu]

  • Wobei ich sowas i. d. R. nicht empfehle.
    Versuch deine Elemente in der Laufzeit dynamisch zu aktualisieren.
    Behalte immer im Hinterkopf:
    - wer ist links neben dem Steuerelement
    - wer ist rechts neben dem Steuerelement
    - wer ist über dem Steuerelement
    - wer ist unter dem Steuerelement
    ..sowie kleinere Berechnungen, welche anwendungsspezifisch sind.

    ~ Signatur in Bearbeitung ~

  • Nunja, die ersten 2 Parameter von dxDrawImage sind x,y^^
    Du meinst wahrscheinlich width und height.


    Bei width und height wäre es so:

    Lua
    sx*(192/1920), sy*(160/1600)

    [tabmenu]
    [tab=Signatur, 'http://tinyurl.com/cj7apxm']Sie werfen Steine auf meinen Thron - Doch sie kriegen diese Krone nicht!
    Krone | Futurama | Das Urteil

    [tab=Projekte, 'http://tinyurl.com/cen3v2a']Folgt
    [/tabmenu]

  • Äh, das ist wieder zu hoch :D
    Also muss ich die Breite des Elementes immer mit der Breite der Auflösung, mit der das Element geschaffen worden ist dividieren?
    Also nicht mit der derzeitigen Auflösung?
    sRec:

  • Du möchtest doch bei jeder Auflösung die gleiche prozentuale Größe, sodass sich die Elemente weder überlappen, noch zu klein/zu groß sind.
    Dazu sagen wir, dass das Element auf DEINEM Bildschirm 192 Pixel Breite beträgt. Das entspricht 0.1 bzw. 10%.
    Nun wollen wir, dass es auch 10% von dem Bildschirm des ANDEREN bedeckt.


    Dazu rechnen wir erstmal den Prozentsatz aus.
    AbsoluteBreite/AbsoluteBildschirmbreite = Wert
    192/1920 = 0.1


    Nun wollen wir diesen Wert mit der Bildschirmauflösung des ANDEREN multiplizieren, um nur tatsächlich 10 Prozent zu bedecken.
    sx * Wert = width
    sx * 0.1 = width -> Bei einer Bildschirmauflösung von 1024 wäre width dementsprechend 102.4.


    Das kannst du gerne mit dem Dreisatz überprüfen:
    1920 -> 192
    1 -> 0.1
    1024 -> 102.4


    Allgemein:
    seineWidth = seineScreenwidth * deineWidth / deineScreenwidth

    [tabmenu]
    [tab=Signatur, 'http://tinyurl.com/cj7apxm']Sie werfen Steine auf meinen Thron - Doch sie kriegen diese Krone nicht!
    Krone | Futurama | Das Urteil

    [tab=Projekte, 'http://tinyurl.com/cen3v2a']Folgt
    [/tabmenu]

  • Also ich mach das so:


    Lua
    guiCreateWindow(screenwidth/2-200/2, screenheight/2-300/2,200,300,"Titel",false)
    guiCreateWindow(screenwidth/2-Breite/2, screenheight/2-Länge/2,Breite,Länge,"Titel",false)


    So ist es in der Mitte und so lang und breit, wie du es erstellt hast. Du musst ausserdem beachten, dass die Standard-Schriftarten nicht grösser werden bei höheren Auflösungen (so habe ich es in Erinnerung). Daher arbeite ich nicht mit absoluten Grössen, sondern mache es so, dass die GUI's bei jedem User die selbe Grösse hat. In meinem Beispiel also 200/300 Pixel.


    Wenn du willst, dass das GUI bei jeder Auflösung genau gleich viel % des Bildschirms abdeckt, kannst du einfach absolute Werte verwenden:


    Lua
    guiCreateWindow ( 0.5, 0.5, 0.4, 0.6, "Titel", true )
    guiCreateWindow ( 0.5, 0.5, BreiteAbsolut, LängeAbsolut, "Titel", true )


    Die ersten beiden 0.5 bestimmen, dass das Fenster in der Mitte des Bildschirms auftaucht. Wenn du das nicht möchtest, musst du für diesen Wert die selbe Rechnung wie unten machen.


    Hier ist es so:


    BreiteAbsolut = PixelangabeBreite/DeineAuflösungBreite
    LängeAbsolut = PixelangabeLänge/DeineAuflösungLänge


    Bei 1920/1600:
    BreiteAbsolut = 200/1920 = 0.1042
    LängeAbsolut = 300/1600 = 0.1875


    Lua
    guiCreateWindow ( 0.5, 0.5, 0.1042, 0.1875, "Titel", true )
  • Ja okay, aber dann ist das Fenster/Bild ja bei kleineren Auflösungen größer als bei höheren.
    Genau das will ich nicht, sondern es soll ja überall die selben % anzeigen. :)
    Ich habs jetzt hinbekommen, mit dieser Rechnung:

    Lua
    local sx, sy = guiGetScreenSize()
    dxDrawImage ( sx*PosX/1920, sy*PosY/1600, sx*Höhe/1920, sy*Breite/1600,... )
  • Ja okay, aber dann ist das Fenster/Bild ja bei kleineren Auflösungen größer als bei höheren.
    Genau das will ich nicht, sondern es soll ja überall die selben % anzeigen. :)
    Ich habs jetzt hinbekommen, mit dieser Rechnung:

    Lua
    local sx, sy = guiGetScreenSize()
    dxDrawImage ( sx*PosX/1920, sy*PosY/1600, sx*Höhe/1920, sy*Breite/1600,... )


    Mit absoluten Werten wird dieses Problem gelöst. Mit dieser Rechnung rechnest du den absoluten Wert aus.
    Das Problem mit diesen Werten ist nur, dass wenn die verschiedenen Auflösungen nicht proportional zueinander stehen, dass Fenster verzerrt wird.

  • Im GUI-Editor ist "Absolut" ja schon standardmäßig angehackt.
    Als ich das aber ohne diese Rechnung machte, hat man bei niedrigeren Auflösungen nur Teile gesehen.
    Die oben genannte Rechnung funktionierte auch einwandfrei in der 800x600 Auflösung.


    Oder ich verstehe irgendwas an dem Editor nicht :D
    Dann würde ich mir sehr viel Schreibarbeit sparen.


    mfg

  • Im GUI-Editor ist "Absolut" ja schon standardmäßig angehackt.
    Als ich das aber ohne diese Rechnung machte, hat man bei niedrigeren Auflösungen nur Teile gesehen.
    Die oben genannte Rechnung funktionierte auch einwandfrei in der 800x600 Auflösung.


    Oder ich verstehe irgendwas an dem Editor nicht :D
    Dann würde ich mir sehr viel Schreibarbeit sparen.


    mfg


    Ja, weil bei niedrigeren Auflösungen das Fenster ja noch kleiner gemacht wird. Wenn du dann das Fenster bereits ganz knapp gemacht hast, wird es dann zu klein. Da die Schriftgrösse aber nicht kleiner wird, gibt es dann das Problem mit dem Überschneiden usw. Daher verwende ich immer die selbe Grösse, egal welche Auflösung vorhanden ist. Somit ist immer alles lesbar und es wird nichts zerquetscht.

  • xDWeediDx:
    Sehr gut :)
    Du kannst dir auch mit dieser Rechnung sehr viel Schreibarbeit sparen.


    Erstelle deine Sachen standardmäßig über den GUI-Editor und erstelle dir doch einfach eine Funktion, die das für dich automatisiert.
    Sprich irgendwas wie: adjustWindowSizeAndPosition(guiElement)
    Dazu nutzt du einfach guiSetSize/guiSetPosition

    [tabmenu]
    [tab=Signatur, 'http://tinyurl.com/cj7apxm']Sie werfen Steine auf meinen Thron - Doch sie kriegen diese Krone nicht!
    Krone | Futurama | Das Urteil

    [tab=Projekte, 'http://tinyurl.com/cen3v2a']Folgt
    [/tabmenu]

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!