Diciembre 08, 2017, 08:55:01 PM Ultima modificación: Diciembre 08, 2017, 09:21:26 PM por matiascarpello
Hola a todos comunidad:


Tengo el siguiente código en un objeto controlador que lo que hace es escalar mi juego a pantalla completa sin deformarlo como se ve en la imagen de arriba. De esta forma mi juego funciona perfectamente en cualquier proporción, ya sea 16:9 o 4:3, etc.


gui_width=640;
gui_height=360;


view_wview[0]=640;
view_wport[0]=640;

ancho = display_get_width();
alto = display_get_height();

ratio = ancho / alto;
view_hview[0] = view_wview[0]/ratio;
view_hport[0] = view_hview[0];


El problema es cuando dibujo en el evento Draw GUI. En mi caso, si se fijan en mi imagen de ejemplo las virtual key están estiradas. Cualquier cosa que dibuje en Draw GUI pasa eso.

Mi juego nativamente está diseñado a 640x360 y tiene una ratio de 16:9. Pero cuando lo pruebo en un emulador android con aspect ratio de 4:3 pasa como se ven en la imagen.

Ya intenté de todo y no se por que se estiran al dibujar en Draw GUI.

¿Alguna idea?

El código que utilizo para dibujar las virtual key son:


///Dibujar virtualkeys

display_set_gui_size(gui_width,gui_height);

global.vkleft= virtual_key_add (gui_width-625, gui_height-80,64,64,(vk_left));
global.vkright= virtual_key_add (gui_width-540, gui_height-80,64,64,((vk_right)));
global.vkattack= virtual_key_add (gui_width-150, gui_height-80,64,64,(ord('X')));
global.vkjump= virtual_key_add (gui_width-70, gui_height-80,64,64,(ord('Z')));

draw_sprite(sLeftArrow,0,gui_width-625,gui_height-80);
draw_sprite(sRightArrow,0,gui_width-540,gui_height-80);
draw_sprite(sAtkButton,0,gui_width-150,gui_height-80);
draw_sprite(sJumpButton,0,gui_width-70,gui_height-80);


No tengo el GM a mano, pero así sin probar nada, diría que el problema esta en que estas cambiando el tamaño de la GUI a un valor constante, y cuando la GUI no es lo suficientemente grande para cubrir ese tamaño debe estirarse.

Prueba eliminando display_set_gui_size(gui_width,gui_height); y cambiando gui_width=640; y gui_height=360; por gui_width=display_get_gui_width(); y gui_height=display_get_gui_height();

Y como dije, no tengo el GM a mano, así que tal vez display_get_gui_width y _height no sean los nombres correctos de las funciones, si no lo son busca en el manual las funciones correctas.

Hice lo que me dijiste y ya no se deforman las virtualkey, el problema es que ahora se achican y se desplazan las virtualkey como se ven en la imagen de abajo.
La imagen es en un celular con resolucion de 1920x1080.
Mientras más resolucion tenga el dispositivo más de desplaza y se achican las virtualkey.


Si le ordenas a un sprite que se dibuje a 625 coordenadas del borde derecho obviamente se dibujara en lugares diferentes dependiendo del tamaño del display, si quieres que los sprites permanezcan en posiciones relativas a sus posiciones originales necesitas declarar las coordenadas de manera que cambien junto con el display.

Por ejemplo, si la GUI fue hecha con un display de 640 pixeles de ancho y 360 de alto en mente, entonces puedes conseguir un factor en relación a la diferencia de dicha expectativa y el display real, y usarlo para cambiar las coordenadas.

[gml]Factor_h = gui_width / 640;
Factor_v = gui_height / 360;

draw_sprite(sLeftArrow,0,gui_width-625*Factor_h,gui_height-80*Factor_v);[/gml]

Con eso la posición donde se dibuja el sprite seria relativa a la posición original aunque cambie el tamaño del display. Para aumentar el tamaño se cambiaría la escala por el factor, para este caso yo utilizaría el factor más pequeño para evitar que los sprites se sobrepongan o se salgan del display.

[gml]Factor_h = gui_width / 640;
Factor_v = gui_height / 360;
Factor_s = min(Factor_h,Factor_v);

draw_sprite_ext(sLeftArrow,0,gui_width-625*Factor_h,gui_height-80*Factor_v,Factor_s,Factor_s,0,c_white,1);[/gml]


Ahora, eso funcionaria con sprites que simplemente necesiten permanecer en su posición relativa en pantalla, pero quizás quieras sprites que permanezcan en posiciones relativas entre si mismos, entonces tendrías que calcular posiciones tomando en cuenta tamaños.

[gml]Factor_h = gui_width / 640;
Factor_v = gui_height / 360;
Factor_s = min(Factor_h,Factor_v);

draw_sprite_ext(sLeftArrow,0,gui_width-625*Factor_h,gui_height-80*Factor_v,Factor_s,Factor_s,0,c_white,1);
draw_sprite_ext(sRightArrow,0,gui_width-625*Factor_h+(64*Factor_s)+(21*Factor_h),gui_height-80*Factor_v,Factor_s,Factor_s,0,c_white,1);[/gml]

Y como esos habrá otros casos donde debes calcular posición, tamaño o ambos según el resultado que quieras conseguir.