Bildschirmauflösung

  • Hey,
    Ich weiß nicht ob ich nur nen Denkfehler habe oder einfach zu blöd bin:
    Moderne Spiele passen sich ja immer auf die Auflösung des Bildschirms an.
    Egal wie ich es drehe und wende, ich kriege es nicht hin das alle Bilder eine passende Größe und Position zum Verhältnis haben.
    Gibts da irgendeinen Code oder ne Formel für?
    Mfg

  • Hallo,

    soweit ich das Problem richtig verstehe, hast du ein paar Grafiken, die bei deiner Auflösung gut Positioniert sind, aber bei einer anderen nicht?

    Sofern das der Fall ist habe ich hier ein paar Tipps:
    Wie du schon richtig gesagt hast musst du das in Abhängigkeit zur Bildschirmbreiter/Höhe machen.
    Beispiel:
    Du möchtest ein Bild genau mittig im Bildschirm anzeigen, dann musst du das so machen:

    Spoiler anzeigen
    [autoit]

    #include<Misc.au3> ; Für Tastendrücke
    #include<GDIPlus.au3> ; Für GDI+ ;)
    #include<WindowsConstants.au3> ; Für $GUI_POPUP ( s.u. )
    MsgBox(0, "", 'Mit "ESC" schließen')
    $hGui = GUICreate("", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP)
    GUISetState()
    _GDIPlus_Startup()
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui) ; Grafik-Context holen, damit man auf der GUI zeichnen kann
    ; Den Buffer lasse ich mal weg, sollte man aber eigentlich machen.
    $GUI_BREITE = @DesktopWidth
    $GUI_HOEHE = @DesktopHeight

    [/autoit] [autoit][/autoit] [autoit]

    $BILD_BREITE = 500
    $BILD_HOEHE = 500
    _GDIPlus_GraphicsFillRect($hGraphics, $GUI_BREITE / 2 - $BILD_BREITE / 2, $GUI_HOEHE / 2 - $BILD_HOEHE / 2, $BILD_BREITE, $BILD_HOEHE) ; Zeichnet ein "Bild" ( schwarzes Viereck ) an die angegebenen Koordinaten
    ; X-Koordinate , Y-Koordinate , Breite , Höhe
    while NOT _IsPressed("1B")
    sleep(50)
    WEnd

    [/autoit]


    Ich hoffe das hilft ein wenig. Habs auch kommentiert.

    Ich nehme ( für Arengu ) immer einen Faktor für die Abhängigkeit. Hier habe ich ja " / 2" ( "Durch 2" ) gerechnet, in Arengu würde ich "* 0.5" schreiben. Somit kannst du ein Drittel des Bildschirms mit "* (1/3) " darstellen.

    Ich hoffe das war ein wenig verständlich^^
    Wenn du noch Fragen hast, dann Frag einfach ;)

    mfg
    Hauke

    ps.: Schick doch einfach einen FUNKTIONIERENDEN Code (-Schnipsel) mit, dann können wir dir ggf. besser helfen.

  • Ich meine es ja auch von der Größe her, also das es bei einem kleineren Bildschirm kleiner ist, aber trotzdem im Verhältnis immer noch richtig.
    Naja, danke, ich probiers mal mit dem Schnipsel :)

  • Hallo,

    das geht im Prinzip genauso. Ich habe bei meinem Bildschirm eine Auflösung von 1920x1080 Pixeln und das Bild war 500x500 Pixel breit.
    Um das Verhäntniss Bild -> Bildschirm herzustellen musst du einfach folgendes rechnen:

    Code
    1920 * x = 500  |  :1920
    <=> x = 500 / 1920
    <=> x = 0.2604166666666...


    Du kannst im Prinzip also 500/1920 rechnen. Nun hast du also den Vorfaktor für deine 500.
    Das ganze bringst du dann so in dein Script ein:

    Spoiler anzeigen
    [autoit]

    #include<Misc.au3> ; Für Tastendrücke
    #include<GDIPlus.au3> ; Für GDI+ ;)
    #include<WindowsConstants.au3> ; Für $GUI_POPUP ( s.u. )
    MsgBox(0, "", 'Mit "ESC" schließen')
    $hGui = GUICreate("", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP)
    GUISetState()
    _GDIPlus_Startup()
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui) ; Grafik-Context holen, damit man auf der GUI zeichnen kann
    ; Den Buffer lasse ich mal weg, sollte man aber eigentlich machen.
    $GUI_BREITE = @DesktopWidth
    $GUI_HOEHE = @DesktopHeight

    [/autoit] [autoit][/autoit] [autoit]

    $BILD_BREITE = 500
    $BILD_HOEHE = 500
    $VORFAKTOR = $BILD_BREITE / $GUI_BREITE ; Alles dynamisch behalten, falls man die Bildbreite ändern möchte
    _GDIPlus_GraphicsFillRect($hGraphics, $GUI_BREITE / 2 - ($GUI_BREITE * $VORFAKTOR) / 2, $GUI_HOEHE / 2 - ($GUI_HOEHE * $VORFAKTOR) / 2, $GUI_BREITE * $VORFAKTOR, $GUI_HOEHE * $VORFAKTOR) ; Zeichnet ein "Bild" ( schwarzes Viereck ) an die angegebenen Koordinaten
    ; X-Koordinate , Y-Koordinate , Breite , Höhe
    while NOT _IsPressed("1B")
    sleep(50)
    WEnd

    [/autoit]


    Nun siehst du, dass das Quadrat nun nichtmehr quadratisch ist ( es sei denn du hast einen 1:1 Bildschirm ).

    Um nun wieder ein Quadrat zu bekommen müssen wir nichtnur die Beziehung zur Breite, sondern auch zur Höhe herstellen:

    Code
    1080 * x = 500  | :1080
    <=> x = 500 / 1080
    <=> x = 0.46296296296296...


    Der Code sieht dann vollständigkeitshalber so aus:

    Spoiler anzeigen
    [autoit]

    #include<Misc.au3> ; Für Tastendrücke
    #include<GDIPlus.au3> ; Für GDI+ ;)
    #include<WindowsConstants.au3> ; Für $GUI_POPUP ( s.u. )
    MsgBox(0, "", 'Mit "ESC" schließen')
    $hGui = GUICreate("", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP)
    GUISetState()
    _GDIPlus_Startup()
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui) ; Grafik-Context holen, damit man auf der GUI zeichnen kann
    ; Den Buffer lasse ich mal weg, sollte man aber eigentlich machen.
    $GUI_BREITE = @DesktopWidth
    $GUI_HOEHE = @DesktopHeight

    [/autoit] [autoit][/autoit] [autoit]

    $BILD_BREITE = 500
    $BILD_HOEHE = 500
    $VORFAKTOR_BREITE = $BILD_BREITE / $GUI_BREITE ; Alles dynamisch behalten, falls man die Bildbreite ändern möchte
    $VORFAKTOR_HOEHE= $BILD_HOEHE / $GUI_HOEHE ; Alles dynamisch behalten, falls man die Bildbreite ändern möchte
    _GDIPlus_GraphicsFillRect($hGraphics, $GUI_BREITE / 2 - ($GUI_BREITE * $VORFAKTOR_BREITE) / 2, $GUI_HOEHE / 2 - ($GUI_HOEHE * $VORFAKTOR_HOEHE) / 2, $GUI_BREITE * $VORFAKTOR_BREITE, $GUI_HOEHE * $VORFAKTOR_HOEHE) ; Zeichnet ein "Bild" ( schwarzes Viereck ) an die angegebenen Koordinaten
    ; X-Koordinate , Y-Koordinate , Breite , Höhe
    while NOT _IsPressed("1B")
    sleep(50)
    WEnd

    [/autoit]

    Ich hoffe ich konnte dir ein wenig weiterhelfen.

    mfg
    Hauke

  • Hallo,

    ja stimmt. Den Faktor immer neu zu berechnen ist quatsch, da hab ich einen Denkfehler gemacht. Du musst für die Vorfaktoren eben die beiden Werte IMMER einsetzen, die ich vorhin ausgerechnet habe. DANN gehts^^

    Spoiler anzeigen
    [autoit]

    #include<Misc.au3> ; Für Tastendrücke
    #include<GDIPlus.au3> ; Für GDI+ ;)
    #include<WindowsConstants.au3> ; Für $GUI_POPUP ( s.u. )
    MsgBox(0, "", 'Mit "ESC" schließen')
    ; Ich Definiere hier schon die Breite/Höhe der GUI, damit man das ganze auch für eine andere Auflösung testen kann...
    $GUI_BREITE = 1024;@DesktopWidth
    $GUI_HOEHE = 768;@DesktopHeight
    $hGui = GUICreate("", $GUI_BREITE, $GUI_HOEHE, @DesktopWidth / 2 - $GUI_BREITE / 2, @DesktopHeight / 2 - $GUI_HOEHE / 2);, $WS_POPUP)
    GUISetState()
    _GDIPlus_Startup()
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui) ; Grafik-Context holen, damit man auf der GUI zeichnen kann
    ; Den Buffer lasse ich mal weg, sollte man aber eigentlich machen.

    [/autoit] [autoit][/autoit] [autoit]

    $VORFAKTOR_BREITE = 0.2604166666666
    $VORFAKTOR_HOEHE= 0.46296296296296 ; Für 16:9 Bildschirme
    ;~ $VORFAKTOR_HOEHE= 0.347222222222222 ; Für 4:3 Bildschirme
    _GDIPlus_GraphicsFillRect($hGraphics, $GUI_BREITE / 2 - ($GUI_BREITE * $VORFAKTOR_BREITE) / 2, $GUI_HOEHE / 2 - ($GUI_HOEHE * $VORFAKTOR_HOEHE) / 2, $GUI_BREITE * $VORFAKTOR_BREITE, $GUI_HOEHE * $VORFAKTOR_HOEHE) ; Zeichnet ein "Bild" ( schwarzes Viereck ) an die angegebenen Koordinaten
    ; X-Koordinate , Y-Koordinate , Breite , Höhe
    while NOT _IsPressed("1B")
    sleep(50)
    WEnd

    [/autoit]

    Zu beachten ist auch noch, dass bei einem 4:3 Bildschirm das Verhältniss zum Bild ein ganz anderes ist ( Logisch, da das Seitenverhältnis ein anderes ist ;) ). Habe aber auch hierfür den passenden Vorfaktor hingeschrieben.

    Um das zu umgehen kannst du am besten für die Höhe des Quadrates die Breite nehmen, sprich Höhe = Breite. Dann wird es auch ein Quadrat. ( Du kannst natürlich auch Breite = Höhe nehmen, dann ist die Größe nur eine andere, aber es GEHT auch ).

    mfg
    Hauke

  • Weiß nicht ob ich da wieder einen Denkfehler habe, aber das löst mein Problem nicht^^
    Es soll ja wie bei modernen Spielen das Seitenverhältnis beibehalten, also die Figur nicht verzerrt werden.

  • Sons denk ich, währ zwar nicht optimal, das man die auflösung automartisch anpasst, wie moderne Spiele heutzutage bei vollbild auch tun ( wenn sie mit kleiner auflösung gespielt werden)

    Sind TV-Quizfragen zu einfach? A) Ja B) Harry Potter

    Spoiler anzeigen

    Ich gebe zu dieser Post hat wahrscheinlich nicht viel geholfen,
    aber ich versuche wenigstens zu helfen :rolleyes: