Benutzerdefinierte Fensterscalierung

  • GM 8

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Benutzerdefinierte Fensterscalierung

    Es geht um folgendes: Ich möchte dass der Benutzer die Fenstergröße selbst einstellen kann. Das habe ich auch hinbekommen. Dazu wird die Viewgröße einfach der Fenstergröße angespasst. Aber wenn der Benutzer die Fenstergröße jetzt verändert, stimmt das Anzeigebild nicht mehr. Die Linien zum Beispiel, sind dann aufeinmal zwei oder drei Pixel groß, anstatt ein Pixel. Oder sehr gut zu erkennen, verändert sich das Quadratmuster.
    Dann habe ich es auch noch so gemacht, dass wenn das Fenster kleiner ist als es sollte, dass es dann entsprechend angepasst wird. Dies sieht aber in der Praxis sehr unelegant aus. Das Fenster flackert kurz in der zu kleinen Position auf und erst dann wird es richtig Scaliert.
    Wie könnte ich beide Probleme lösen und warum entstehen sie(vorallem das Erste).

    Um das ganze richtig vorzustellen habe ich hier die Datei hochgeladen.

    [EDIT]: Habe soeben testweise eine Schrift zeichnen lassen. Nach dem Scalieren(nur bei vergrößerungen) konnte man sie so gut wie garnicht lesen. Jetzt ist es ein viel größeres Problem als vorher angenommen.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Chris987 ()

  • Lässt man ein Text zeichnen und vergößert das Fenster, dann kann man das Problem sehen. Es liegt wohl daran, dass das Bild in der gleichen Auflösung wie am Anfang gezeichnet und dann Scaliert wird. Und sobalt man den Port anpasst entsteht beim verkeinern ein schwarzer Rand und beim vergößern wird das Bild abgeschnitten. Dieser Fehler müsste normalerweise andersherum sein. ^^
  • Das ist nicht das was ich meine. Ich möchte dass sich die Auflösung ändert. Ich habe zwar herausgefunden warum dieser Fehler entsteht, aber ich kann ihn nicht beheben. Wenn man die Portgröße verändert, ändert sich nicht die gesamte Zeichenregion. Wie kann man die Zeichenregiongröße ändern. Ich habe es schon mit window_set_region_size(w,h,adaptwindow) probiert, aber die Auflösung bleibt die gleiche. Nur die Mauskoordinaten sind dadurch richtig. Ich habe zur besseren verständniss drei Screenshots hochgeladen. Selbst die Screenshots haben immer die Anfangsauflösung von 1024x768, egal wie groß das Fenster, der Port, der View oder die Zeichenregion ist.

    In der Anfangsgröße:


    Bei verkleinerten Fenster:


    Bei vergrößerten Fenster:



    Folgendes wurde gemacht sodass die "Screenshots" entstanden sind:

    Full scale (Sodass das ganze Fenster mit der Auflösung gefüllt ist)
    Allow the player to resize the game window (Selbstverständlich)

    GML-Quellcode

    1. view_wport = window_get_width()
    2. view_hport = window_get_height()
    3. view_wview = window_get_width()
    4. view_hview = window_get_height()
    5. window_set_region_size(window_get_width(),window_get_height(),false)
  • Ich check dein Problem nicht. Bei mir sieht das Fenster beim skalieren ganz normal aus:
    ohne Skalierung:

    voll gestreckt :

    verkleinert :


    Sieht doch so aus wie es soll. Falls der Strich zu dick ist, musst du ihn halt in Relation zur aktuellen Fenstergröße zeichnen, am besten mit draw_line_width. Und den Rest natürlich auch.

    MfG

    Albert Einstein schrieb:

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
  • Und so sieht es aus wenn Text hinzukommt:


    [EDIT]: Mit window_set_region_scale(0,true) habe ich auch schon herumgespielt, bringt aber nichts. Ich habe solangsam die Befürchtung dass es unmöglich ist, die Auflösung während des Spiels zu ändern.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Chris987 ()

  • Chris987 schrieb:

    Ich habe solangsam die Befürchtung dass es unmöglich ist, die Auflösung während des Spiels zu ändern.

    Nö, das ist ganz klar eine falsche Behauptung.

    Das Prolem ist, dass die eigendliche Surface, die der GM für den Backbuffer benutzt, nicht die Größe während eines Raumes in diesem ändern kann (Da es sonst zu erheblichen Fehlern kommen könnte).

    Um dies zu umgehen, muss man sich beispielsweise einen eigenen Raum für das Vergrößern/Verkleinern aller Räume machen, und dann in den Creation Code sowas schreiben:

    GML-Quellcode

    1. if(!variable_global_exists("res_w")){
    2. global.res_w = 800; // Breite wird beim ersten Start gesetzt.
    3. global.res_h = 600; // Höhe ...
    4. }
    5. // Die View AUßERHALB DES RAUMES setzen
    6. room_set_view(room0, 0, 1, 0, 0, global.res_w, global.res_h, 0, 0, global.res_w, global.res_h, 0, 0, 0, 0, 0);
    7. room_goto_next();


    PS: Was denkst du, warum Spiele auch immer kurz ein schwarzes "Bild" anzeigen, wenn man die Auflösung ändert?
    - Klar, sie benutzen zwar keine "Räume" oder "Views", aber das Prinzip ist im wesentlichen das Gleiche.

    PS 2: Ein Beispiel ist im Anhang.

    - Tobi97
    Dateien
    • res.rar

      (15,68 kB, 105 mal heruntergeladen, zuletzt: )
  • Bei Room restart kannst du ned sicher stellen, dass der code außerhalb des Rooms ausgeführt wird.
    Du könntest allerdings eine Variable (z.B. "global.res_rm") und darin vor dem Ändern der Auflösung dann die Variable auf den aktuellen Room setzen und dann anstatt room_goto_next(), room_goto(global.res_rm) schreiben.

    - Tobi97