Mobile Auflösung / Ich werd noch verrückt

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

  • Mobile Auflösung / Ich werd noch verrückt

    Hallo werte GM:S Gemeinde,

    ich bin kurz davor hier alles aus'm Fenster zu werfen :D

    Ich arbeite derzeit an einem Mobile Title. Da ich meist die Sachen erst am PC teste und nur zwischendurch am Handy fällt mir nach 2 Stunden Arbeit dann wieder auf, dass wieder alles für den Arsch war :motz:

    Wie schaffe ich, dass auf allen Geräten, egal ob PC oder Handy (mit unterschiedlicher Displayauflösung) meine verdammten Sprites und Objects auch da stehen wo sie hingehören?

    Ich bastel nämlich immer stundenlang rum, starte zwischendurch das Spiel am PC, sehe "ach... sieht ja alles fein aus"... und bastel weiter. Nach ein paar Stunden dann teste ich es auch mal am Handy und denke ich brech das Telefon gleich durch, da alle Sprites/Objects wieder ganz woanders sind. (siehe screenshots)

    Meine Roomsettings sind so:
    View in Room: 1280 x 720
    Port on Screen: 1280 x 720

    Teste ich das Spiel am PC (der eine Auflösung von 2560 x 1080 hat), wird dennoch das Spiel korrekterweise in 1280 x 720 geöffnet. Also auch ingame bleibt mein 720p Wert erhalten - unabhängig von der Auflösung meines Monitors (window_get_width gibt 1280 aus, display_get_width gibt 2560 aus).
    Starte ich das Spiel am Handy interessiert ihn der "Port on Screen" überhaupt nicht. window_get_width und display_get_width geben beide 1920 aus (statt 1280 für window_get_width wie es eigentlich sein sollte).

    Dadurch habe ich dauerhaft das Problem, dass ich hier jedesmal stundenlang mit nem Taschenrechner da sitze und jeden scheiss Pixel berechnen muss damit alles so halbwegs richtig sitzt.

    Das frustet mich total ab. Ich mein hier gibts doch genügend Leute die Sachen schon fürs Handy erstellt haben und sicher die Sachen auch parallel am PC testen - was habt Ihr hier für Lösungen? Es muss doch eine komfortable Lösung geben für jede Auflösung.

    Ich kann doch nicht 20 unterschiedliche Codes angeben, nur weil Handy #1 ne Auflösung von 640x480 hat, das nächste hat dann 1280x720 und das nächste dann 1920x1080 usw und so fort. Da wird man doch bekloppt bei :sauf:

    Wer weiss hier ne komfortable (!!!!) Lösung die nicht zu kompliziert ist?

    LG
    Mirko
    Bilder
    • pc.jpg

      161,02 kB, 1.282×747, 347 mal angesehen
    • mobile.jpg

      345,27 kB, 1.920×1.080, 431 mal angesehen
  • Teile den Bildschirm in Quadrante auf anstatt alles auf eine bestimmte Pixel-koordinate zu stellen. Also die Münze ist dann auf y 0% und x 25% der displaygröße

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Soweit ich Aku verstanden habe, solltest du nicht mit festen Pixelwerten arbeiten bei deiner GUI. Sondern mit Prozentangaben.

    Diese könntest du einfach umwandeln. Du musst die Display Größe herausfinden mit display_get_width() und display_get_height().

    Die beiden werte lässt du dir am Anfang von deinem Spiel auslesen und speicherst sie in einer globalen Variable (um im ganzen Spiel drauf zugreifen zu können).

    Dann kannst du mit einer einfachen Formel, deine GUI Elemente zeichnen.

    Für die Breite zb.:

    x = (global.DisplayBreite / 100) * 25

    Wenn die Display Breite nun zb. 1280 (wie in deinem Beispiel) beträgt, würde dort ein Wert von 320 herauskommen.
    Bei einer Display Breite von 800 (800x600) würde ein Wert von 200 rauskommen.

    Das heisst, das deine GUI Element immer bei 25% der Display Breite gezeichnet werden würde. Egal wie gross die Auflösung ist.

    Bei der y Koordinate gehst du genauso vor, nur eben mit der Display Höhe.

    Dann sollten deine Elemente sich der Auflösung anpassen.

    Ein Pixelwert ist ein absoluter Wert. Wenn du bei einer Auflösung von 800x600 (zb) etwas bei x=100 zeichnen lässt, ist das bei einer Auflösung von 1920x1080 eben aber auch bei Pixel 100.

    Mit den Prozentwerten, ist das aber Dynamisch und passt sich an.
  • Eieiei... so in der Richtung hatte ich das sogar schonmal probiert... irgendwas lief dabei schief. Werde mir das anhand deiner Beispiele nochmal genaustens anschauen. Vielen Dank für die Veranschaulichung - ich hoffe so bekomm ich endlich mal das Problem gefixt :)

    Ich setz den Thread schonmal vorab auf "Gelöst"... sollte es Probleme geben werde ich hier nochmal reinschreiben ;)

    Danke an Euch beide!!
  • Leider hat es nicht funktioniert - ich habe keine Ahnung warum das Prinzip nicht funzt :(

    Siehe Bilder...

    Habe den Code zum testen verwendet:

    Create:

    GML-Quellcode

    1. global.DisplayBreite = window_get_width()
    2. global.DisplayHoehe = window_get_height()


    Draw:

    GML-Quellcode

    1. draw_sprite(spr_clock,0,view_xview+global.DisplayBreite/100*50,view_yview+global.DisplayHoehe/100*10)


    Sollte ja heissen, dass er direkt in der Mitte des Raums (von rechts/links gesehen, nicht unten/oben) mein Sprite (in dem Fall die Uhr) zeichnen sollte, da ja so gesehen 50% angegeben. Auf dem PC erfolgt das wunderbar.
    Auf dem Mobile zeichnet er es sicher bei 80%... und ich weiss nicht wieso :(


    Warum sind 50% beim Handy nicht in der Mitte, wo es doch beim PC sehr wohl die Mitte ist (und 50% sollten so ziemlich genau die Mitte sein^^)....
    Bilder
    • mobile.png

      321,2 kB, 1.920×1.080, 260 mal angesehen
    • pc.jpg

      156,95 kB, 1.282×747, 273 mal angesehen
  • Hallo

    Mit
    display_get_width() und display_get_height() statt window_get_width() und ...
    sollte es funtionieren.

    Sorry für die unübersichtliche schreibweise, aber ich schreibe vom Handy.
    Lg
    lg Vectorhead

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Vectorhead ()

  • leider nicht...

    ich hatte es erst mit Display_get_width und so probiert. Nachdem ich dort aber das Problem feststellte, das sich das negativ bei Windows auswirkt bin ich auf window_get_width umgestiegen.

    Grund:
    display_get_width gibt ja natürlich die Auflösung des Gerätes wieder.
    Bei meinem PC ist das 2560x1080. Bei meinem Handy sinds 1920x1080.
    Die Grösse meines Spiels ist jedoch auf 1280x720 eingestellt.
    Nutze ich nun display_get_width bezieht er sich bei Windows natürlich auf die 2560. Demnach werden dort meine Sprites ja ganz woanders hingezeichnet, wenn mein Spiel ja nur 1280 hat. Auf dem Handy siehts genauso aus... nur auf 1920 bezogen.

    Daher bin ich auf window_get_width umgestiegen. Weil dort bezieht er sich ja auf die Fenstergrösse... und die ist bei Windows korrekt 1280, wie in den Spieleinstellungen von mir vorgegeben. Auf dem Handy ist es jedoch nach wie vor 1920. Mein Handy unterscheidet hier nicht zwischen window_get_width oder display-get_width. Er wirft in beiden Fällen die Displayauflösung aus, egal ob das Spiel selber von mir nur mit 1280 angegeben wird.

    Letzendlich ist es aber eigentlich doch recht scheiss egal ob er sich am Handy auf 1920 oder 1280 bezieht, denn meine "Formel" bezieht sich ja auf 50% des Displays/Fensters. Wie kann denn also das Sprite ganz woanders als in der Mitte auftauchen, während in Windows die Position korrekt gezeichnet wird??

    Ich raff es einfach nicht.

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

  • Wenn du zb.

    If os_type = os_windows then ...
    Dann nimm koordinaten.
    Else
    Dann nimm display_get befehle.

    Bin am handy darum diese dumme schreibweise, aber es sollte verständlich sein.

    Wenn ich zuhause bin kann ich dir einen ordentlichen code schreiben.

    Lg
    lg Vectorhead
  • Nee ich weiss schon was du meinst :)

    genau das hatte ich gestern auch eingetragen zum testen. Das er halt am PC sich auf die Fenstergrösse bezieht und am Handy halt auf die Displaygrösse.

    Aber: (jetzt kommts wieder ^^)

    Am PC funktionierts. Auf dem Handy ist es aber immer 1920.. egal ob ich mit window_get_width oder mit display_get_width arbeite. Er arbeitet also IMMER mit dem Wert 1920.

    Aber wie oben schon erwähnt, eigentlich dürfte das doch egal sein welcher Wert, wenn ich sage er soll bei 50% vom Bildschirm den Sprite drawen??

    draw_sprite(spr_clock,0,view_xview+global.DisplayBreite/100*50,view_yview+global.DisplayHoehe/100*10)
  • Ich wollte mal schreiben wie ich das jetzt immer mache..auch wenn das für unabhängiege Auflösungen im Wimdows ist.

    GML-Quellcode

    1. dxm=display_get_width()
    2. dym=display_get_height()
    3. view_wview[0]=dxm
    4. view_hview[0]=dym
    5. display_set_gui_size(dxm,dym)
    6. window_set_size(dxm,dym)


    Mit diesem befehlen sucheich mir die Bildschirmauflsung raus und gebe sie an die View und auch an die Gui weiter.
    Ich glaube ich hatte das auch mal ähnlich schon auf dem Smartphone probiert.

    Ich kann nur eines dazu sagen..Geanu wegen den ganzen Android Problemenhabich mir jeztein win 8.1 Tablet gekauft undprogrammiere dafür....
    Denn dort geht der Code auf jeden fall.
    Meine Signatur hat kein Visum für das GM Forum erhalten.
  • Ich habe jetzt nicht alles gelesen, aber ich habe immer bei Android das Problem, dass dieser Code zwar funktioniert, aber das Spiel verzerrt ist.

    GML-Quellcode

    1. dxm=display_get_width()
    2. dym=display_get_height()
    3. view_wview[0]=dxm
    4. view_hview[0]=dym


    So funktioniert es dann ohne Verzerrung:

    GML-Quellcode

    1. dxm=display_get_width()
    2. dym=display_get_height()
    3. view_wview[0]=dxm
    4. view_hview[0]=dym
    5. surface_resize(application_surface, dxm,dym)
    Husi012 hat mich nicht mehr in seiner Signatur, ich bin trotzdem noch fame.
  • Danke Euch beiden - jedoch ist das nach wie vor nicht die Lösung.

    Ich weiss auch nicht wie ich es genauer beschreiben soll. Beachtet bitte, dass mein Spiel in den Settings wie erwähnt eine Auflösung von 1280x720 verpasst bekommen hat (da ich gelesen habe, dass das im Mobilbereich die meistverbreiteste Auflösung ist).

    Wir kommen der Sache aber diesmal schon etwas näher. Mit Euren Vorschlägen skaliert er mir in Android das Spiel direkt auf 1920x1080 hoch... für die Sachen die ich also gedrawt habe würde das passen. Den Raum, Background und platzierte Objekte skaliert er das ganze nun allerdings auch hoch und überschreibt dadurch ja die 1280x720 settings. Das heisst ich sehe vom Raum ja schon alles was eigentlich gar nicht zu sehen sollte am Anfang und durch den View-Port ja anders angegeben wurde (für den View-Port sollte eigentlich 1280x720 gelten, was durch das hochskalieren nun aber auch 1920x1080 ist)

    Anstatt das Spiel an die Auflösung des Displays anzupassen, kann sich nicht das Display an die Auflösung des Spiels anpassen?

    Also das mein 1920x1080 Display trotzdem ein 1280x720 Raum wiedergibt?

    Windows kann das ja auch machen... oder habe ich die Programmierung des Spiels schon einfach falsch begonnen?? Alle anderen Räume davor (ebenfalls mit den Settings 1280x720) werden jedoch genauso angezeigt wie auf dem PC... dort muss ich komischerweise nicht solche Experimente machen?

    Ich würde mich auch gern via Skype anbieten das nochmal zu erklären, falls ich nicht richtig verstanden werde :)
  • Hi Mirko,
    ich hab es bei meinem Android Game mit Hilfe von Views gelöst. Diese haben die gleiche Größe wie der Raum und dadurch wird auf allen Geräten bei mir, der Raum richtig skaliert. Ich weiß zwar nicht ob es die beste Lösung ist, jedoch erzielt es bei mir das gewollte Ergebnis.

    MfG Yannik
    Schaut einfach mal auf meiner Webseite vorbei: burningbyte-studio.de
  • Hey Yannik...

    mein Raum ist leider viel grösser wie die Views.... der "Testraum" (ich weiss noch nicht wo gross es später wirklich wird) ist aktuell 3000x1000.

    Meine View in Room Einstellungen sind 1280x720 und genauso der Port on Screen - ebenfalls 1280x720

    Ich habe durch rumtesten jetzt zumindestens schon soweit herausgefunden, dass alle Objekte die ich im Raum erstelle (egal ob nachträglich durch eine Aktion oder direkt schon in dem Raum selber bei der Erstellung) an Ihrem Platz sind. Sachen die ich drawe - und das sind im Level oben die ganzen Controls (die Lebensanzeige, Zeit, Coins usw) - werden anscheinend auf die display-width/height berechnet und das haut nunmal nicht hin :(
  • Ich muss aber trozdem evtl mal ne blöde frage stellen da ich mich nicht so gany erinnern kann als ich für Android programmiert hatte.

    Nutzt du zur HUD aus gabe das Draw-Event oder das Draw-Gui.

    Alsomit anderen worten ist das ein GUI problem welches du hast oder ist das ganze spiel in der flaschen grösse.. Also zb das du mehr oder weniger vom Level siehst...


    Ps hab das etwas inder Hilfe gefunden...


    display_get_dpi_x();
    Dots per inch (DPI) is a measure of spatial printing or video dot density, in particular the number of individual dots that can be placed in a line within the span of 1 inch (2.54 cm). When working on mobile devices (in particular Android devices) this is an important factor to take into consideration as what may be appropriate for one display resolution, may not be appropriate for another. For example, you may have two displays with the same resolution of 400 x 800, but display 1 has a dpi of 60 and display 2 has a dpi of 30. In this case, any text or image displayed on display 2 will appear much larger, even though the actual resolution is the same.

    This function will get the dpi of the device display along the x axis (this value is also dependant on the orientation of the device). Please note that Mac and iOS do not return specific dpi settings but appear to return the same values as the OS, which are not correct (but will have to do) as Apple do not give the correct values.


    Wenn ich das richtig verstehe gibt es dir die DPI also Dots per Inch an ..evtl hilft das weiter...
    Meine Signatur hat kein Visum für das GM Forum erhalten.
  • Hallo @x-sascha,

    ich nutze zum drawen das "normale" draw-event da sonst meine room-transition-effekte nicht korrekt funktionieren.

    Ursprünglich hatte ich es mit Draw-GUI erstellt, musste es dann aber auf draw umstellen, nachdem ich feststellte, dass halt die room transition dann Probleme macht.

    Kann das etwa das Problem sein?
  • Ich glaube du must das DrawGui verwenden das wurde extra , soweit ich weis, für diese ganzen Device oberflächen eingebaut.
    Ich meine mich wage zu erinnern das es bei mir funktioneirt hat.

    Ps da muste ich doch glat noch mal nach schauen was Room-Transition ist.. Ok also der Effekt beim Raumwechsel...den kann mansich auch selber programieren mit Fadein und out.
    Meine Signatur hat kein Visum für das GM Forum erhalten.
  • Naja das habe ich ja getan :)

    Aber dabei werden nur die Objekte gefadet, nicht die Dinge die ich manuell habe drawen lassen.. mein Raum wird also gefadet, aber nicht die GUI dadrüber.. die bleibt bis zum ende des Fade-Effekts stehen und verschwindet dann halt ohne fade-out. Sieht sehr unschön aus...
  • Du must eigentlich nur zb ein Großes Schwarzes Rechtecke über GUI drawn und dies dann von Alpha 0 auf 1 gehen. So mache ich das immer.
    Das Rechteck verdeckt die GUI und die GUi überdeckt das Spiel / View
    Meine Signatur hat kein Visum für das GM Forum erhalten.