Spieloberfläche zoomen, HUD/Interface aber nicht - wie ?

  • GM 8

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

  • Spieloberfläche zoomen, HUD/Interface aber nicht - wie ?

    Hi... :)

    Das alte Spiel, dessen Sprites ich benutze, läuft nur auf der Auflösung 640*480 und dementsprechend klein sind auch die Interfacebilder. Ich hab mir jetzt in GIMP ein prowisorisches Interface für mein Spiel gebastelt als mir klar wurde, dass ich mich keinesfalls auf 640x480 Pixel beschränken will. Optimiert ist mein Interface auf 1024*600, aber grundsätzlich ist jede Auflösung von 1024 - 2560 möglich, weil mein Interface relativ zu den Views erzeugt wird und damit, bis auf die mittlere Leiste (daran arbeite ich noch), immer an der richtigen Stelle ist, wobei es ab 1920 natürlich etwas zu klein wird. :)

    Nun hab ich auch eine Zoomfunktion eingebaut und wie ihr euch vorstellen könnt... Ja... zoomt das Interface gleich mit! :D Hab gerade mal die Forensuche bemüht, aber leider keine Lösungen, sondern nur Ratschläge gefunden. Ich hab was gelesen, von wegen man solle prüfen, welcher View gerade aktiv ist. Allerdings hab ich nicht verstanden, was mir das bringt, weil ich ja nur das Interface im zweiten View erzeugen will. Und auch weiß ich nicht, wie ich den View wechseln soll, sondern höchstens, wie ich sie anspreche - mit den [Zahlen] eben.

    GML-Quellcode

    1. if (view_current!= view[0])


    Ein obj_roomstart erzeugt das Interface und andere Dinge mit diesem Code:

    GML-Quellcode

    1. instance_create(x, y, obj_hud);
    2. instance_create(x, y, obj_selector);
    3. instance_create(x, y, obj_stop);
    4. instance_create(x, y, obj_zoom);


    Ich nehme mal an, dass die x und y-Koordinaten sich auf den ersten View beziehen (weshalb auch immer dieser zuerst aktiv ist und was genau auch immer das bedeuten mag).

    Ohne Zoom: Rausgezoomt:

    Kann mir einer mal eine gute, kurze Anleitung schreiben oder mich zu einer verlinken, wie man mit Views arbeitet? Ich kapier diese Werte nicht. xport, yport, hbor, vbor, hsp, vsp ---> häääh?! :P

    Muss ich einfach nur das obj_hud mit view_*view[1] im zweiten View erzeugen (also anstatt instance_create(x, y, obj_hud); ---> instance_create(view_xview[1], view_yview[1], obj_hud); )und bei diesem einfach die gleichen Daten angeben wie beim ersten oder wie mach ich das? Und muss ich dann bei SÄMTLICHEN Objekten mit Views arbeiten, weil x und y dann nicht mehr verlässlich sind? :(

    GML-Quellcode

    1. if ! (freedom) { instance_destroy(gamemaker); instance_create(x, y, html5); }

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

  • Und auch weiß ich nicht, wie ich den View wechseln soll, sondern höchstens, wie ich sie anspreche - mit den [Zahlen] eben.
    Diese [] sind für Arrays da, view_xview[x] ist einfach nur ein Array (a[x] oder b[y] sind auch Arrays). Meines Wissens ist view_current einfach nur die Nummer: 0 ist View0, 1 ist View1 und so weiter.


    (Pro View wird auch einmal das Draw-Event aufgerufen, daher wenn du nur eine Sache in einem View drawen willst musst du view_current benutzen und prüfen ob der derzeitig benutze View der ist den man auch will)
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • Nun hab ich auch eine Zoomfunktion eingebaut und wie ihr euch vorstellen könnt... Ja... zoomt das Interface gleich mit! :D Hab gerade mal die Forensuche bemüht, aber leider keine Lösungen, sondern nur Ratschläge gefunden.
    Warum willst du denn das Interface mit einem neuen View zeichnen? Wäre es nicht einfacher die Interface-Grafik zu skalieren um diese an das neue View anzupassen?
  • Fin schrieb:

    Nun hab ich auch eine Zoomfunktion eingebaut und wie ihr euch vorstellen könnt... Ja... zoomt das Interface gleich mit! :D Hab gerade mal die Forensuche bemüht, aber leider keine Lösungen, sondern nur Ratschläge gefunden.
    Warum willst du denn das Interface mit einem neuen View zeichnen? Wäre es nicht einfacher die Interface-Grafik zu skalieren um diese an das neue View anzupassen?
    Ich zeichne mein Interface komplett mit draw_sprite, da geht image_*scale nicht. Ich will (muss) allerdings auf sprite_index umstellen, weil ich in meiner Statusleiste Infotexte bei einem MouseOver anzeigen lasse und das geht nur, wenn die Maus über Instanzen ist (bzw. es ginge anders, aber das wäre unnötige Arbeit). Aber mit image_*scale kann man nicht pixelgenau skalieren oder relativ zum View, sondern nur die Breite und die Höhe des Sprites multiplizieren oder dividieren. Außerdem würde das vermutlich pixelig werden oder man würde Pixelränder sehen. Ich KÖNNTE den unteren Teil des Interfaces als ein großes Bild einbauen, aber nur, wenn ich das Sprite dann exakt an das View anpassen kann, mit image_xscale geht das meines Wissens nach aber nicht.

    Ich will später machen, dass man die Auflösung im Spiel einstellen kann, von daher wäre es schon nicht schlecht, wenn das Interface immer gleich groß erscheinen würde, glaube ich. Aber wie soll das gehen? Bilder und Texte (draw_text) müssen dann mitskaliert werden und das Interface besteht auch nicht nur aus einem großen Bild, sondern aus mehreren. 8| Außerdem weiß ich nicht, wie ich Instanzen mit dem View mitbewegen lasse... "if view_xview += 1" funktioniert nicht.

    Ich versteh das mit den Views nach wie vor nicht... Ich find keine brauchbaren Anleitungen. Ich brauche Beispielcodes oder eine GM-Datei, wo ich mir das ansehen kann. :/ Ich weiß nicht, wie ich den View wechsle - mit view_current kann man nur prüfen, welcher View gerade aktiv ist (bei mir offenbar immer View 0). Kann mir vielleicht jemand einen kleinen Beispielcode schreiben, wie, wann und wo ich das Interface drawen soll und was ich bei den Views im Raum einstellen muss? Forum und Wiki von YoyoGames helfen mir nicht weiter... :(

    Eine andere Möglichkeit wären Surfaces und das wäre vermutlich auch perfomanter, aber das ist eine Pro-Funktion, glaub ich.

    EDIT: Mit draw_sprite_stretched kann man Sprites anscheinend pixelgenau skalieren, aber das wäre ja auch nur wieder im Draw Event... Das Sprite der Instanz selbst muss skalieren, also das Sprite, das im Objekt eingestellt ist. Ich bräuchte also, wenn ich es ohne Views und Surfaces mache, ein image_xscale und ein image_yscale, wo man die Pixel exakt angeben kann (bzw. relativ zum View)

    Aber hey, mir würde es erst mal schon reichen, wenn das Interface nicht vom Zoom beeinflusst werden würde. :P Und das geht doch, glaube ich, nur mit Views oder Surfaces, weil ich den View beim Zoomen ändere..

    GML-Quellcode

    1. if ! (freedom) { instance_destroy(gamemaker); instance_create(x, y, html5); }

    Dieser Beitrag wurde bereits 17 mal editiert, zuletzt von Bonsaiheld ()

  • Fin schrieb:

    Ich find keine brauchbaren Anleitungen. Ich brauche Beispielcodes oder eine GM-Datei
    Ich würde das mit den Views lassen. Hier ist das was ich mit skalieren gemeint habe:

    incyre.com/misc/scaling.gm81
    Wow, vielen Dank für die Mühe! 8o Mal schauen, was ich damit anfangen kann. Der Zoom ist ja schön flüssig und ganz anders als der, den ich gebaut habe. :)

    Und ich muss gucken, wie ich das mit den Bildern und dem Text machen soll... Nützt ja an sich erst mal nicht superviel, wenn nur das Interface gestreckt wird. Vorallem werden die Bilder dann ja verschwommen oder pixelig... Soll eigentlich scharf sein. Und das Interface wird ebenfalls geblurrt... War absehbar. Bevor ich mir die Arbeit mach: Hilft es, wenn ich das Interface sehr groß mache und dann verkleiner? Dann müssten die verkleinerten Interfaces doch scharf sein... Aber wie krieg ich dann die ganzen Elemente an die richtige Stelle... Oh wei... :huh: Ich glaube, dann muss ich sämtliche Pixelangaben meiner Schriften und Bilder durch "noch relativere" Angaben ersetzen. Na, mal schauen, ob ich es hinkrieg, dass die Elemente dann bei jeder Auflösung an der gleichen Stelle sind...

    Ich weiß grad gar nicht aus dem Kopf, wie man das bei Spielen sonst so macht. Ich glaub, man hat das Interface an sich oft immer in der selben Größe und nur Teile davon werden zentriert oder gestreckt - letzteres war auch ursprünglich meine Idee. Ich wollte machen, dass alles unverändert bleibt und nur die schwarze Infobar unten in der Mitte von links nach rechts gezogen wird. So ein geblurrtes GUI ist sehr unschön, wobei ein immer kleiner werdendes GUI wahrscheinlich nicht nur unschön, sondern auch noch spielerunfreundlich wäre. Ich hab ja schon gemerkt, wie klein das bei 1920*1080 war... :pinch:

    Stell dich übrigens drauf ein, dass ich nochmal wegen deinem Code nachfragen muss. Der erzeugt gerade ziemliche Fragezeichen über meinem Kopf. Aber mal schauen, was ich durch einfaches Ändern des Codes herausfinde, ist ja nicht megakomplex. :) Also, wenn ich die Auflösung des Raumes und im hud-Create Event änder, wird es nicht mehr richtig gestreckt... Wenn ich das Sprite vergrößer und die Daten daran anpasse, wird das GUI richtig gestreckt, aber dann ist der Ausgangszoom falsch, weil anscheinend die Größe des GUI an den Zoom gekoppelt ist - das Spiel startet weit weggezoomt und je mehr ich dran rumfummle, umso mehr geht kaputt. Ich krieg nicht mal hin, den Zoom schneller zu machen. Ich komm da nochmal drauf zurück... :|

    GML-Quellcode

    1. if ! (freedom) { instance_destroy(gamemaker); instance_create(x, y, html5); }

    Dieser Beitrag wurde bereits 17 mal editiert, zuletzt von Bonsaiheld ()

  • Und ich muss gucken, wie ich das mit den Bildern und dem Text machen soll.
    wenn du ein bisschen mehr Durchblick brauchst:

    Es sieht momentan so aus:

    GML-Quellcode

    1. draw_text_transformed(view_xview[0]+10*zoom*.01,view_yview[0]+15*zoom*.01,"zoom: " +string(zoom,),zoom*.01,zoom*.01,0)



    man könnte allerdings das Ganze ein bisschen übersichtlicher gestalten, indem man "*zoom*.01" (=*zoom/100) durch eine Variable ersetzt.

    Create Event:

    GML-Quellcode

    1. off = 1



    Step/Draw Event

    GML-Quellcode

    1. off=zoom*.01



    drauf sehen die skalierten Text und Bildelemente wie folgt im Code aus:

    GML-Quellcode

    1. draw_text_transformed(view_xview[0]+10*off,view_yview[0]+15*off,"zoom: " +string(zoom,),off,off,0)



    Die Skalierung der Sprites/Textes beläuft sich auf kleinen Bereichen, hierbei müssen wir die Variable zoom durch 100 teilen (ich habe prozentuell 1% rausgenomen mit "*0.01") damit die Skalierung auch dem Zoombereich entspricht.

    Bei der Skalierung müssen auch die x/y Koordinaten skaliert werden, deshalb nehmen wir diese auch mal zoom/100 (*zoom*.01 bzw mal den bereits definierten Wert der Variable "off").


    Würdest du mit GM:Studio arbeiten hättest du es um einiges leichter, denn da hat man einen "Draw GUI" Event, dieser vermeidet die Skalierung der gezeichneten Elemente.
  • Benutzer online 3

    3 Besucher