Hola amigos. Tengo un problema que me está trayendo de cabeza.
tengo una room de 2560x1440 con una view de 1280x720 comenzando en x=640 y=360 y un port de 1280x720.
El caso es que al poner un HUD con botones interactivos en la view mediante Draw GUI, funciona en todos los casos excepto cuando hago zoom. En este caso los botones se pierden con el zoom por lo que la botonera deja de funcionar.
Necesito saber como dejar esos botones fijos en el momento de hacer zoom. He buscado información en este foro y otros externos, además de tutoriales de HUD en youtube, pero los resultados han sido infructuosos. Por favor, a ver si alguien puede darme una solución o una pista para este problema. Gracias anticipadas.

hola,yo para poner los botones fijos con Draw Gui pongo la posicion que deben tener en la ventana,por ejemplo para poner un boton de 20x10 en el borde superior derecho de tu view:

draw_sprite(sprite_boton,0,1260,0);

a mi me funciona asi, aunque uso un solo objeto que dibuja varios botones.


#2 Mayo 05, 2017, 08:44:51 PM Ultima modificación: Mayo 05, 2017, 08:46:48 PM por ashlerfox
Gracias, pero eso no funciona. A ti si te funcionará porque no haces zoom. Prueba a hacerlo y verás. El problema lo tengo sólo y exclusivamente cuando hago zoom. Cuando muevo la pantalla de izquierda a derecha, arriba o abajo, todo funciona correctamente.

Nfire14. Aclaro que el sprite sí se queda en su sitio, tanto con mi programación como con lo que tú me has puesto, pero lo que me interesa es que el objeto se quede también. Es decir, cuando hago zoom, el sprite del botón se queda en su posición, pero el objeto botón, que es el que me interesa porque está programado para que haga alguna acción, se aleja o se acerca con el zoom. Mi interés es que tanto el botón(objeto) como su sprite permanezcan en el mismo lugar hagas lo que hagas.

Una alternativa seria usar las coordenadas para saber cuando se presiona el boton, en lugar de la mascara de colision. Para eso podes usar point_in_rectangle (supongo que se usa el raton para presionar el boton)

Tampoco me vale point_in_rectangle. Ya estuve haciendo pruebas pero las coordenadas del rectángulo también se pierden con el zoom.
Por más que busco información no encuentro nada sobre este tema y me parece muy curioso porque creo que es algo básico y no debería ser complicado implementar.
A lo máximo que he llegado es a compensar el desplazamiento del objeto por el eje x de forma que haciendo zoom, le resto al objeto el desplazamiento que hace el zoom, pero luego también hay que compensar la pérdida de escala y tengo que aumentarla o disminuirla al objeto en la misma medida que se aleja o acerca el zoom. Con el desplazamiento queda bien pero con la escala es inviable, además que no creo que sea lo adecuado para resolver el problema.

CitarNfire14. Aclaro que el sprite sí se queda en su sitio, tanto con mi programación como con lo que tú me has puesto, pero lo que me interesa es que el objeto se quede también. Es decir, cuando hago zoom, el sprite del botón se queda en su posición, pero el objeto botón, que es el que me interesa porque está programado para que haga alguna acción, se aleja o se acerca con el zoom. Mi interés es que tanto el botón(objeto) como su sprite permanezcan en el mismo lugar hagas lo que hagas.

yo pense que con zoom los botones se salian de su sitio :-[.
tambien uso zoom y para que funcionen los botones uso el point_in_rectangle de esta forma(te pongo un ejemplo de un boton de 20x15):

if point_in_rectangle(window_mouse_get_x(),window_mouse_get_y(),1260,0,1280,15)
  {
   if mouse_check_button_pressed(mb_left)
    {
      //tus aciones aqui
    }
  }


yo tambien tenia es problema y era que usaba mouse_x y mouse_y, al usar window_mouse_get_x() y window_mouse_get_y() usa las coorde nadas de la ventana y sin importar que se agrande o achique la view toma esas coordenadas.


Excelente Nfire14! eso resuelve parte de algunos problemas que también tenía. Realmente, Podría valerme como solución pero tendría que acomodar y deshacerme de todo lo programado en los objetos para adecuarlo a esta nueva forma. De hecho, es que no puedo deshacerme de los objetos porque en ellos está programado el cambio de imagen y si desaparecen, este cambio no se llevaría a cabo. Así que, los objetos tendrán que permanecer en pantalla -aunque invisibles- moviéndose con el zoom. De momento utilizaré esta solución pero seguiré pendiente por si a alguien se le ocurre una idea para que los objetos permanezcan en su sitio a pesar de utilizar el zoom. Gracias.

en  create usa algo como esto
vkey_up =       virtual_key_add(display_get_gui_width()-display_get_gui_width() ,display_get_gui_height()-375,  305,100,vk_up); 

en draw gui
draw_sprite_ext(spr_Up3,0,display_get_gui_width()-display_get_gui_width()+25,display_get_gui_height()-340,1,1,0,c_white,1);


yo uso un pequeño zoom y no me da problemas

#9 Mayo 08, 2017, 07:57:23 AM Ultima modificación: Mayo 10, 2017, 08:29:39 AM por nfire14
tambien uso algo parecido, pero en mi juego se puede usar pantalla completa por eso no lo puse completo en el ejemplo y para que los botones esten siempre en el mismo lugar uso porcentajes,tomo originales los tamaños de width y height de la ventana de esta forma:
(voy a seguir usando el ejemplo del boton de 20x15,con el tamaño de pantalla que usas 1280x720,pero el cambio la coordenada y1,y2 a +4 para este ejemplo)

nota: primero tenes ser saber en que posicion esta el boton(x,y) y su anchura y altura.


/*EDITADO
explicacion:
primero la coordenada x1 de point_in_rectangle
  (100*1260)/1280=98.4//este es porcentaje en pantalla de x1(con decimales)

segundo la coordenada y1
  (100*4)/720=0.55//y1

tercero x2
(100*1280)/1280= 100

cuarto y2
(100*20)/720=2.77

luego se obtiene el la anchura y altura de la ventana y se divide por el porcentage dividido 100 y se redondea
ejemplo x1:
round(window_get_width()*(98.4/100))
*/

///STEP
  if point_in_rectangle(window_mouse_get_x(),window_mouse_get_y(),round(window_get_width()*(98.4/100)),round(window_get_height()*(0.55/100)),round(window_get_width()*(100/100)),round(window_get_height()*(2.77/100)))
  {
   if mouse_check_button_pressed(mb_left)
    {
      //tus aciones aqui
    }
  }

///DRAW GUI
/////se usan las mismas coordenadas x1,y1,.....
////dibuja el boton escalado segun el tamaño de la ventana

///////EDITADO
/*
la anchura del sprite
(20*100)/1280

la altura
(15*100)/720
*/
///////
  draw_sprite_stretched_ext(sp_boton,0,round(window_get_width()*(98.4/100)),round(window_get_height()*(0.55/100)),round(window_get_width()*(1.56/100)),round(window_get_height()*(2.08/100),c_white,1);



el codigo es algo complicado pero me funciona, te da la coordenada segun el porcentage de ventana tomando las coordenadas x1,y1,x2,y2 originales, incluso funciona en pantalla completa,se puede agrandar el point_in_rectangle un poco si se quiere.
no se si te puede servir pero te dejo el codigo :-[



He probado tu código, Nfire14. Funciona exactamente igual que el primero que me pusiste:

if point_in_rectangle(window_mouse_get_x(),window_mouse_get_y(),1260,0,1280,15)
  {
   if mouse_check_button_pressed(mb_left)
    {
      //tus aciones aqui
    }
  }

No veo diferencia alguna salvo que este es mucho más corto. Los objetos siguen huyendo cuando hago zoom.
Por cierto, los cálculos hay que hacerlos al revés:
No es 1280/(100*1260)=98.4 sino (100*1260) / 1280 = 98.4 y así todos los demás.

#11 Mayo 10, 2017, 08:20:22 AM Ultima modificación: Mayo 10, 2017, 08:26:28 AM por nfire14
Citar
He probado tu código, Nfire14. Funciona exactamente igual que el primero que me pusiste:

if point_in_rectangle(window_mouse_get_x(),window_mouse_get_y(),1260,0,1280,15)
  {
   if mouse_check_button_pressed(mb_left)
    {
      //tus aciones aqui
    }
  }

No veo diferencia alguna salvo que este es mucho más corto. Los objetos siguen huyendo cuando hago zoom.
Por cierto, los cálculos hay que hacerlos al revés:
No es 1280/(100*1260)=98.4 sino (100*1260) / 1280 = 98.4 y así todos los demás.

perdon no me dicuenta que estaban al revés y el codigo largo de los porcentajes funciona con pantalla completa  :-[. lo arreglo.

estube releyendo:
Citar
Nfire14. Aclaro que el sprite sí se queda en su sitio, tanto con mi programación como con lo que tú me has puesto, pero lo que me interesa es que el objeto se quede también. Es decir, cuando hago zoom, el sprite del botón se queda en su posición, pero el objeto botón, que es el que me interesa porque está programado para que haga alguna acción, se aleja o se acerca con el zoom. Mi interés es que tanto el botón(objeto) como su sprite permanezcan en el mismo lugar hagas lo que hagas.

Entonces para que el objeto botón este en su lugar te pongo este ejemplo, un boton que tiene que estar en la posicion x=233, y=2, con una ventana o port de 270x198:


/// evento STEP
{
///cálculos
/*
posición x
270 - 233 = 37

posición y
198 - 2 = 196
*/

x = window_get_width()-37;
y = window_get_height()-196;

}


eso va a hacer que siempre este el objeto boton en el mismo lugar, fijate si te funciona si no es eso no se  :-X