Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Frico en Febrero 18, 2016, 04:15:49 AM

Título: Ayuda! [Problema con botones en la pantalla en juego publicado]
Publicado por: Frico en Febrero 18, 2016, 04:15:49 AM
Hola muy buenas a todos! Es la primera vez que publico en el foro, y es para pedir urgentemente ayuda! Hoy publique un juego hecho con GM Professional Studio 1.4 para Android, lo testie muchísimas veces en mi celular (Moto G2) y todo andaba perfecto, por eso decidí publicarlo...
El juego abre normalmente y demás, pero el problema es que los botones de dirección en otros celulares que no sean Motorola, no aparecen! Intente cambiar la resolución del juego y las views que son 1280x720 y nada! Cambie la posicion de los objetos que aparecen en la pantalla con Draw GUI es decir con draw_sprite(0,x,y) y tampoco pude solucionarlo! Estoy desesperado! Espero que me puedan ayudar, muchas gracias de ante mano!
Aca dejo el código:

Lo mismo se aplica para todos... Hay 3 objetos (obj_button_up, obj_button_right, obj_button_left)

Create Event:

up = virtual_key_add(1050,598,150,200,vk_space)

Draw GUI:

draw_sprite(spr_button_up,0,1100,628);
if keyboard_check(vk_space){
                           draw_sprite(spr_button_up,1,1100,628);
                          }


Las posiciones las puse de acuerdo a lo que se veía en la pantalla... Intente ponerlle la posición de la view, al principio funcionaba, cuando la view estaba quieta pero cuando ponía seguir al personaje, los botones bailaban por toda la pantalla!  :'(


PD: Les dejo el enlace del juego en Google Play:
https://play.google.com/store/apps/details?id=com.FRICO.Eternal (https://play.google.com/store/apps/details?id=com.FRICO.Eternal)
Título: Re:Ayuda! [Problema con botones en la pantalla en juego publicado]
Publicado por: bygdle en Febrero 18, 2016, 04:28:08 AM
Sin saber los códigos que estás usando y cómo lo estás usando es imposible saber los errores que podrías cometer. Para que se pueda ayudar a solucionar tu problema por favor muestra la información que consideres necesaria, y entre ésta, los códigos que usas
Título: Re:Ayuda! [Problema con botones en la pantalla en juego publicado]
Publicado por: Frico en Febrero 18, 2016, 05:00:38 AM
Cita de: NiuWeb en Febrero 18, 2016, 04:28:08 AM
Sin saber los códigos que estás usando y cómo lo estás usando es imposible saber los errores que podrías cometer. Para que se pueda ayudar a solucionar tu problema por favor muestra la información que consideres necesaria, y entre ésta, los códigos que usas

Ya lo actualize! Muchas gracias y disculpe mi ignorancia...
Título: Re:Ayuda! [Problema con botones en la pantalla en juego publicado]
Publicado por: bygdle en Febrero 18, 2016, 05:08:15 AM
Antes de empezar, te recomiendo que encierres tu código con las etiquetas [gml] y [/gml], para que se pueda apreciar sin resultar con graves quemaduras en los ojos xDD

Ahora... Lo sabía xD, el problema es el mismo que han tenido prácticamente todos los ue han hecho una virtual key por primera vez (y también los que no las usan a menudo). Lo que sucede es que las virtual key se dibujan en las posiciones ABSOLUTAS del DISPLAY, por lo tanto, si dibujas una virtual key de 32*32 en una room de 640*480, al momento de probar el juego en una pantalla de 1280*960 la virtual key se verá el doble de pequeña...
Hace algún tiempo respondí un tema exactamente igual, y como mi nivel de flojera está al 10000%, pues sólo te cito el mensaje xDDD:

Cita de: NiuWeb en Febrero 02, 2016, 12:09:23 AM
Te voy a explicar, en el evento draw GUI normalmente haces esto:
[gml]
draw_sprite(el_sprite,0,32,32);
[/gml]
(Ignora las posiciones xD)

Pero ese es el error. Tanto en la GUI como con las virtual key las posiciones absolutas son un error. Debes usar posiciones relativas al display
De esta manera yo lo hago:
[gml]
var w = display_get_gui_width(); //Sacamos el anchor del display del dispositivo
var h = display_get_gui_height(); //Sacamos el largor del display del dispositivo
var x32 = w / (w/32); //Sacamos el valor que equivaldría a 32 pixeles en el display del disposivito
var y32 = h / (h/32); //Lo mismo que lo de arriba sólo que en vertical

/*
Ahora imaginemos que el sprite que quieres dibujar mide 64*64:
*/

draw_sprite_stretched(el_sprite,0,x32,y32,x32*2,y32*2);//Dibujamos el sprite en las posiciones 32 y 32 DEL DISPLAY DEL DISPOSITIVO, y el sprite está dimensionado a 32*2 (64)px DEL DISPLAY DEL DISPOSITIVO. Lo que hace que se escale como debería en cualquier resolución :B
[/gml]

(Lee los comentarios (texto en verde :v) del código)

El mismo método se aplica a las virtual key
Título: Re:Ayuda! [Problema con botones en la pantalla en juego publicado]
Publicado por: Frico en Febrero 18, 2016, 02:10:38 PM
Cita de: NiuWeb en Febrero 18, 2016, 05:08:15 AM
Antes de empezar, te recomiendo que encierres tu código con las etiquetas [gml] y [/gml], para que se pueda apreciar sin resultar con graves quemaduras en los ojos xDD

Ahora... Lo sabía xD, el problema es el mismo que han tenido prácticamente todos los ue han hecho una virtual key por primera vez (y también los que no las usan a menudo). Lo que sucede es que las virtual key se dibujan en las posiciones ABSOLUTAS del DISPLAY, por lo tanto, si dibujas una virtual key de 32*32 en una room de 640*480, al momento de probar el juego en una pantalla de 1280*960 la virtual key se verá el doble de pequeña...
Hace algún tiempo respondí un tema exactamente igual, y como mi nivel de flojera está al 10000%, pues sólo te cito el mensaje xDDD:

Cita de: NiuWeb en Febrero 02, 2016, 12:09:23 AM
Te voy a explicar, en el evento draw GUI normalmente haces esto:
[gml]
draw_sprite(el_sprite,0,32,32);
[/gml]
(Ignora las posiciones xD)

Pero ese es el error. Tanto en la GUI como con las virtual key las posiciones absolutas son un error. Debes usar posiciones relativas al display
De esta manera yo lo hago:
[gml]
var w = display_get_gui_width(); //Sacamos el anchor del display del dispositivo
var h = display_get_gui_height(); //Sacamos el largor del display del dispositivo
var x32 = w / (w/32); //Sacamos el valor que equivaldría a 32 pixeles en el display del disposivito
var y32 = h / (h/32); //Lo mismo que lo de arriba sólo que en vertical

/*
Ahora imaginemos que el sprite que quieres dibujar mide 64*64:
*/

draw_sprite_stretched(el_sprite,0,x32,y32,x32*2,y32*2);//Dibujamos el sprite en las posiciones 32 y 32 DEL DISPLAY DEL DISPOSITIVO, y el sprite está dimensionado a 32*2 (64)px DEL DISPLAY DEL DISPOSITIVO. Lo que hace que se escale como debería en cualquier resolución :B
[/gml]

(Lee los comentarios (texto en verde :v) del código)

El mismo método se aplica a las virtual key

Gracias amigo por la respuesta! Me fue muy útil... pero si quiero tener las mismas medidas es decir, que la view es de 1280x720 y quiero que el botón de salto aparezca abajo a la derecha, en la siguiente posición (x=1100, y = 628) debería hacer algo como:

[gml]
var w = display_get_gui_width();
var h = display_get_gui_height();
var x32 = w / (w/32);
var y32 = h / (h/32);

draw_sprite_stretched(spr_button_up,0,x32*34.375,y32*19.625,x32*4.625,y32*4.625); //Lo multiplique por esos numeros así tiene la medida del sprite 148x148

[/gml]

Título: Re:Ayuda! [Problema con botones en la pantalla en juego publicado]
Publicado por: Clamud en Febrero 18, 2016, 03:52:37 PM
La forma de calcular las proporciones no es muy correcta; este código
[gml]
var x32 = w / (w/32);
var y32 = h / (h/32);
[/gml]
equivale a esto
[gml]
var x32 = 32;
var y32 = 32;
[/gml]
de modo que no hay un ajuste verdadero.
La proporción se debería tomar con las medidas de la pantalla y de la view:
[gml]
sx = display_get_width() / view_wview[0]; //escala horizontal
[/gml]
si la view tiene la misma relación aspecto de la pantalla, entonces la escala vertical debería ser igual a la horizontal
[gml]
sy = display_get_height() / view_hview[0]; //escala vertical
[/gml]
despues usa alguno de los valores de escala dentro de la función draw_sprite_stretched
Título: Re:Ayuda! [Problema con botones en la pantalla en juego publicado]
Publicado por: Frico en Febrero 18, 2016, 04:32:36 PM
Cita de: Clamud en Febrero 18, 2016, 03:52:37 PM
La forma de calcular las proporciones no es muy correcta; este código
[gml]
var x32 = w / (w/32);
var y32 = h / (h/32);
[/gml]
equivale a esto
[gml]
var x32 = 32;
var y32 = 32;
[/gml]
de modo que no hay un ajuste verdadero.
La proporción se debería tomar con las medidas de la pantalla y de la view:
[gml]
sx = display_get_width() / view_wview[0]; //escala horizontal
[/gml]
si la view tiene la misma relación aspecto de la pantalla, entonces la escala vertical debería ser igual a la horizontal
[gml]
sy = display_get_height() / view_hview[0]; //escala vertical
[/gml]
despues usa alguno de los valores de escala dentro de la función draw_sprite_stretched

Disculpeme, entonces como debería hacer para que aparezca abajo a la derecha ya que cada dispositivo tiene un display diferente... Puesto que necesito hacerlo urgente! Si la view es de 1280x720... entonces que cuenta debería hacer para que se vea en todos los dispositivos en el mismo lugar?
Sería así correcto? : (El único problema que le veo es que el display es diferente en todos los móviles lo que haría que la suma no de el mismo resultado para X, ni para Y... pero realmente no se me ocurre otra cosa...)
[gml]
DRAW GUI EVENT:

sx = display_get_width() / view_wview[0];
sy = display_get_height() / view_hview[0];                         

draw_sprite_stretched(spr_button_up,0,sx+1100,sy+550,148,148);
if keyboard_check(vk_space){
                           draw_sprite_stretched(spr_button_up,1,sx+1100,sy+550,148,148);
                          }
[/gml]

Esa posición de la view (x = 1100, y = 550) es la ideal para los botones... necesito ponerlas en esa parte de la pantalla pero en todos los móviles...
Título: Re:Ayuda! [Problema con botones en la pantalla en juego publicado]
Publicado por: Clamud en Febrero 18, 2016, 08:26:36 PM
No debe ser una suma, sino una multiplicación.
También puedes dibujar el sprite de esta forma
[gml]
draw_sprite_ext( sprite,subimg, x*sx,y*sy, sx,sy, 0,c_white,1 );
[/gml]
Título: Re:Ayuda! [Problema con botones en la pantalla en juego publicado]
Publicado por: Frico en Febrero 18, 2016, 09:22:02 PM
Cita de: Clamud en Febrero 18, 2016, 08:26:36 PM
No debe ser una suma, sino una multiplicación.
También puedes dibujar el sprite de esta forma
[gml]
draw_sprite_ext( sprite,subimg, x*sx,y*sy, sx,sy, 0,c_white,1 );
[/gml]

Entiendo, pero son 4 botones que se presentan en la pantalla...
obj_button_left = aparece cerca de la esquina inferior izquierda
obj_button_right =aparece unos pixeles a la derecha de obj_button_left
obj_button_up = en la posicion antes mencionada...
obj_menu_back = en la misma posicion x que obj_button_up pero cerca de la esquina superior derecha...

Ahora si puedes ser tan amable como calculo estas 4 posiciones? Solo basta con reemplazar los valores de X,Y en donde yo los quiero por los valores de sx y sy? Es decir:
draw_sprite_stretched(spr_button_up,1,sx*1100,sy*550,148,148);

O usando tu forma, da igual...

El único problema que encuentro con este método es que la virtual key (aunque la multiplique por la misma posición de X e Y donde se dibuja el objeto) esta "adelantada" unos píxeles... Es decir si el objeto esta en posición x = 100, si pongo en esa posicion a la virtual key se crea en 150... Por lo que para que funcione debo ponerla en x=50...

[gml]

CREATE EVENT:

sx = display_get_width() / view_wview[0]; //escala horizontal
sy = display_get_height() / view_hview[0]; //escala vertical
left = virtual_key_add(sx*50,sy*620,150,200,vk_left);


DRAW GUI EVENT:

sx = display_get_width() / view_wview[0]; //escala horizontal
sy = display_get_height() / view_hview[0]; //escala vertical
draw_sprite_ext(spr_button_left,0,sx*100,sy*620,sx,sy,0,c_white,1);
if keyboard_check(vk_left){
                           draw_sprite_ext(spr_button_left,1,sx*100,sy*620,sx,sy,0,c_white,1);
                          }
[/gml]

Es esto normal? Agradezco la respuesta!
Título: Re:Ayuda! [Problema con botones en la pantalla en juego publicado]
Publicado por: Clamud en Febrero 19, 2016, 12:38:55 AM
Las dimensiones de la virtual key también se deben multiplicar por la escala. Y si la view no cambia de tamaño, no es necesario calcular la escala en cada evento Draw GUI. Estas son unas modificaciones al código:
[gml]
//CREATE EVENT:
sx = display_get_width() / view_wview[0]; //escala horizontal
sy = display_get_height() / view_hview[0]; //escala vertical
left = virtual_key_add( sx*50,sy*620, sx*150,sy*200,vk_left);
[/gml]
[gml]
//DRAW GUI EVENT:
if keyboard_check( vk_left )
    draw_sprite_ext( spr_button_left,1, sx*100,sy*620,sx,sy, 0,c_white,1 );
else
    draw_sprite_ext( spr_button_left,0, sx*100,sy*620,sx,sy, 0,c_white,1 );
[/gml]
Espero que con eso funcione.