Mauskoordinaten im Fullscreen Mode

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

    • Mauskoordinaten im Fullscreen Mode

      Ich habe da seit einer geraumen Zeit ein Problem mit den Mauskoordianten im Fullscreen-modus.
      Nun, nehmen wir mal an ich spiele ein Spiel im Fenstermodus mit der auflösung von 1280*720 px (720p) auf einem 1080p display.

      Die mauskoordinaten bekomme ich dann ganz einfach mit "window_mouse_get_x()" und "window_mouse_get_y()" raus und können 1:1 im Spiel verwendet werden.
      Das erste Problem kommt dan nauf wenn man den Fullscreen-modus einschaltet.

      Der GM skaliert das fenster scheinbar auf die native auflösung, während die interne render-auflösung dieselbe bleibt.
      Das fenster ist im Fullscreen modus somit auf die 1080p Auflösung vergrößert worden, während das Spiel immernoch ein Frame in 720p render, welches dann einfach auf 1080p hochskaliert wird.
      Somit kann ich die Mauskoordinaten mit den "window_mouse_get..." funktionen icht mehr 1:1 übernehmen ,da diese einen Wertebereich zwischen 0 bis 1920 auf der x-achse und 0 bis 1080 auf der y-achse liefern.
      Ich konnte das problem umgehen, indem ich volgende Rechnung anwende: (Beispiel für die x-achse

      GML-Quellcode

      1. var Xmouse= window_mouse_get_x()*((get_render_w()/get_window_width()));
      2. //get_render_w() gibt die render auflösung zurück


      Dadurch kann ich die Mauskoordinaten vom Wertebereich 0-1920 auf 0-1280 bringen.
      Dies funktioniert auch super... solange das Seitenverhältniss des Bildschirms und des gerenderten Bildes gleich ist. Was meine ich damit?

      Nun... sagen wir mal ich render das Bild in 1024*768 pixeln (4:3 Seitenverhältniss) während mein Bildschirm eine 16:9 Auflösung besitzt.
      Dadurch entstehen links und Rechts schwarze balken (was auch so korrekt ist) aber diese werden von der Berechnung nicht miteinbezogen.


      Wenn die maus AUSSERHALB des gerenderten Bildes (beispielsweise ganz links am Bildschirm) positioniert ist, so befindet sich die Maus (anhand der Berechnung) immernoch in dem gerenderten Frame, was aber nicht der Fall ist.
      Das Ziel ist es, die Mauskoordinaten so wie sie am Display positioniert sind 1:1 auf die Koordinaten im Frame zu übertragen. (die beiden Punkte in der oberen Illustration sollten sich überlappen.)
      Die Frage ist: Wie kriege ich das dynamisch hin sodass dies bei jedem erdenklichen Seitenverhältniss funktioniert?

      Ich konnte schon was für die x-achse zum laufen kriegen:

      GML-Quellcode

      1. var screen_half = window_get_width()/2;//hälfte des Bildschirms
      2. var mult = (get_render_w()/get_window_width());//Berechne den "Prozentanteil" zwischen renderauflösung und Displayauflösung
      3. var aspect = (window_get_width()/window_get_height())/(get_render_w()/get_render_h());//aspect ratio (sodass die schwarzen Balken miteinbezogen werden)
      4. var diff = ((window_mouse_get_x()-screen_half)*mult);//Mausvektor von der mitte des Fensters aus (multipliziert mit "mult" um den Auflösungsunterschied wie im oberen Codesnippet auszugleichen
      5. return (screen_half*mult)+ diff*aspect;//multipliziere den Vektor mit der aspect ratio und addiere ihn zu der halben pixelbreite des Bildschirms


      Das funktioniert aber nur, solange die "schwarzen Balken" links und rechts vom gerenderten Frame positioniert sind. (wie in der illustration.)
      Sind die balken oberhalb und unterhalb vom gerenderten bild (wie z.B: bei Kinofilmen) so wird dieses verfahren nicht funktionieren. Schon garnicht für die Y-achse.


      Hat da also jemand einen Rat wie man das umgehen könnte? Bin da momentan völlig ratlos.
    • Ich habe hier mal ein kleines Script zusammen gebastelt von einem anderen Projekt. Könnte dir vieleicht helfen:

      GML-Quellcode

      1. ///application_get_mouse()
      2. var pos, m, i;
      3. pos = application_get_position();
      4. m[0] = (window_mouse_get_x() - pos[0]) / (pos[2] - pos[0]) * surface_get_width(application_surface);
      5. m[1] = (window_mouse_get_y() - pos[1]) / (pos[3] - pos[1]) * surface_get_height(application_surface);
      6. return m;

      Das ganze funktioniert mit application_get_positionwas es ganz einfach macht. Das zurückgegebene Array sollte immer die Koordinaten der Maus zurückgeben wie sie auf der eigentlichen application_surface sind.
    • Benutzer online 1

      1 Besucher