Hola, estoy en un proyecto (Naaaahh...¿En serio?) y tenggo un problemisha:
En el juego, hay un editor de niveles, donde se pueden crear muros y cosas así haciendo click con el Mouse, pero también tengo unos botones creados con Draw GUI y VirtualKeys. El problema es que al clickear esos botones, también me crea objetos debajo de los botones. Quisiera saber cómo puedo "desactivar" las funciones/eventos del mouse al clickear esos botones, o sea que ejecute la acción de los botones pero no permita crear objetos debajo de éstos.
en el caso de tener device_check_button, cámbialo por el pressed para que no se mantenga en bucle... puede ser eso?
yo uso este SCRIPT, llamado en mi caso "device_check_pressed"
[gml]for( i=0; i<=4; i++ )
{
if device_mouse_check_button_pressed(i,mb_left)
if point_in_rectangle(
device_mouse_x(i), device_mouse_y(i),
bbox_left, bbox_top, bbox_right, bbox_bottom )
return true;
}
return false;
[/gml]
Y lo llamo así:
[gml]if device_check_pressed()
{
//codigo
}[/gml]
Las funciones de mouse que tengo son mouse normales. mouse_check_button(), pero no puedo poner _pressed, ya que así es el editor, así va bien. Pero gracias al problemisha de los botones, sigue creando objetos sin que el usuario sepa.
pero usas mouse_ o device_ ???
dihe normales, NORMALES... :-[ :-X XD
[gml]
if mouse_check_button(mb_left)
//Créame un objeto muro...xD
[/gml]
entonces pk dices nada de virtualkeys en el titulo???
pues repito... usa mouse_check_pressed!! button es como mantener el click no deja de checkear sin parar, el pressed checka una sola vez justo en el momento de clickar
PD: en juegos android, por lo personal, pienso que queda mejor poner las acciones en el released y aprovechar el pressed y tal para otras cosas, ocmo animacion al pulsar un botón, en tu caso, para previsualizar el objeto en el mouse antes de colocarlo, tal y como lo tengo hecho en mi supremo proyecto, etc..
Bueno...
Lo de virtualKeys en el título es precisamente por eso. Uso eventos Mouse comunes, pero quiero que éstos no funcionen si se hace click en una VirtualKey, esto para evitar que se creen objetos debajo de donde está la virtualKey, ya que sería fastidioso.
Ahora, no uso mouse_check_buttton_pressed porque ya lo dije antes: Es un editor de niveles, y los jugadores se llevarían siglos poniendo muro por muro, y por eso, prefiero dejar sólo mouse_check_button, para que puedan crear varos y rápidamente.
a ver si he entendido... tienes ya unas virualkey puestas y tienes oootra cosa con mouse button puesta y no quieres que se ponga en la zona donde tienes puestas las virtualkeys... si es eso lo que dices solamente, donde tienes el mouse button aplícale un filtro de mouse_x/y
if mouse_x < (coordenada x de la virtualkey xD)
and mouse y< (coordenada x de la virtualkey xD)
ande mouse_x > bla bla bla....
{
//codigo
}
me explico?
no tengo mucho conocimiento sobre las posiciones relativas de X e Y en el eventro draw_gui, pero imagino que si colocas una condicion algo asi
[gml]
if mouse_check_button(mb_left)
{
if mouse_x >xinicial and mouse_x<xfinal and mouse_y >yinicial and mouse_y <yfinal//donde xinicial, xfinal,yinicial y yfinal son las coordenadas de tu boton
{
//tu codigo de creacion
}
}
[/gml]
deberia de funcionar. porcierto te lo pongo anidado y no todo como una sola linea porque el gml no es inteligente, en el sentido de que el comprueba todas las variables aunque la primera sea falsa, entonces esto genera un peor rendimiento a la hora de ejecutarlo.
1)- Te explicas XD
2)- Fue lo primero que pensé, sólo que hay un pequeño (ENORME) inconveniente con eso:
La room es grande y la view se mueve, lo cual hace que el trabajo del GUI y VirtualKey entre en acción, así que no hay una posición fiha que pueda comprobar para NO ejecutar la acción del mouse...
Cita de: jmbs19 en Noviembre 24, 2015, 05:36:40 PM
no tengo mucho conocimiento sobre las posiciones relativas de X e Y en el eventro draw_gui, pero imagino que si colocas una condicion algo asi
[gml]
if mouse_check_button(mb_left)
{
if mouse_x >xinicial and mouse_x<xfinal and mouse_y >yinicial and mouse_y <yfinal//donde xinicial, xfinal,yinicial y yfinal son las coordenadas de tu boton
{
//tu codigo de creacion
}
}
[/gml]
deberia de funcionar. porcierto te lo pongo anidado y no todo como una sola linea porque el gml no es inteligente, en el sentido de que el comprueba todas las variables aunque la primera sea falsa, entonces esto genera un peor rendimiento a la hora de ejecutarlo.
como te dije imagino son posiciones relativas, pero con sacar un poco de matematicas no deveria de darte problema, seria algo como
[gml]
xinicial =xinicial_boton+view_xview
[/gml]
y asi tambien con todas las coordenadas
o tambien puedes hacer que se dibujen en el evento draw y usas las funciones de arriba para que siempre sigan la view.
http://docs.yoyogames.com/source/dadiospice/002_reference/windows%20and%20views/views/view_xview.html
Bueno, como te dije, fue lo primero que pensé, pero sigue siendo imposible hacer eso ya que ES UN EDITOR DE NIVELES, lo cual significa que tiene Zoom(modficando las views) y esto hace que la posición del GUI difiera de la view....
Conclusión: OLVIDARSE DE COMPROBAR CON LAS VIEWS
jmbs, gml es lo más inteligente que he visto nunca, pongas como pongas el código funciona exactamente igual y lo tengo comprobadísimo, además de que eso es lo que dice todo el mundo en todos los lugares xD
[gml]if mouse_check_button(mb_left)
if mouse_x >xinicial
and mouse_x<xfinal
and mouse_y >yinicial
and mouse_y <yfinal//donde xinicial, xfinal,yinicial y yfinal son las coordenadas de tu boton
{
//tu codigo de creacion
}[/gml]
esto es EXACTAMENTE LO MISMO que tu código, pero más ordenadito y bonito, dan ganas de comérselo xD
Yo me comería ese hermoso código :P
De no ser por el FRUTO PROBLEMA QUE TENGO!
Voy a llorar :'(
Cita de: kostra en Noviembre 24, 2015, 05:53:09 PM
jmbs, gml es lo más inteligente que he visto nunca, pongas como pongas el código funciona exactamente igual y lo tengo comprobadísimo, además de que eso es lo que dice todo el mundo en todos los lugares xD
[gml]if mouse_check_button(mb_left)
if mouse_x >xinicial
and mouse_x<xfinal
and mouse_y >yinicial
and mouse_y <yfinal//donde xinicial, xfinal,yinicial y yfinal son las coordenadas de tu boton
{
//tu codigo de creacion
}[/gml]
esto es EXACTAMENTE LO MISMO que tu código, pero más ordenadito y bonito, dan ganas de comérselo xD
el funcionamiento es el mismo, y eso yo lo se, cuando te digo que no es inteligente me refiero a que no esta muy bien optimizado cuando de condicionales se habla.
te lo pongo asi:
supongamos que estoy comprobando esto en step:
[gml]
if ataque = true and distance_to_object(x,y,obj_a) < a and distance_to_object(x,y,obj_b) < b and distance_to_object(x,y,obj_c) < c and collision_rectangle(x-10,y-10,x+10,y+10)
{
//codigo
}
[/gml]
el juego se realentisaria mucho porque, suponiendo que ataque sea false igualmente paso a paso estara comprobando el collision_check y las distances, lo que son unos calculos pesados.
en cambio si se hace esto:
[gml]
if ataque = true
{
distance_to_object(x,y,obj_a) < a and distance_to_object(x,y,obj_b) < b and distance_to_object(x,y,obj_c) < c
{
collision_rectangle(x-10,y-10,x+10,y+10)
{
//codigo
}
}
}
[/gml]
esta mas optimizado porque primero comprueba si a es true, si es true ve las posiciones, y luego checa la colision
si a es false no hace nada de eso, por lo que no haces calculos innecesarios.
niuweb si haces zoom es lo mismo, solo un poco mas trabajoso, por ejemplo puedes usar un escalar. tanto para el zoom como para la posicion relativa.
[gml]xinicial =view_xview+(xinicial_boton*zoom)[/gml]
¿Es la única forma de hacerlo?
Tengo muchas cosas por trabajar en GUI y
en views, así que sería muy difícil trabajar eso por cada botón
vaale ahora sí te he entendido, y tienes razón, además, tomo nota para mejorar, gracias ;)
Cita de: jmbs19 en Noviembre 24, 2015, 05:36:40 PM
porque el gml no es inteligente, en el sentido de que el comprueba todas las variables aunque la primera sea falsa, entonces esto genera un peor rendimiento a la hora de ejecutarlo.
Cita de: jmbs19 en Noviembre 24, 2015, 06:17:48 PM
suponiendo que ataque sea false igualmente paso a paso estara comprobando el collision_check y las distances, lo que son unos calculos pesados.
GMS Realiza comprobaciones inteligentes (short-circuit evaluation) desde la versión 1.3. Si la primera condición es falsa, ya no evalúa las demás.
https://www.yoyogames.com/tech_blog/52
Casilla "short-circuit evaluations", pestaña General. en Global game settings
Ay Dios!
Me están ignorando por completo!
¿Serían tan amables de ayudarme?
Si van a hablar de la inteligencia de GML creen un nuevo tema. Por favor XD :'(
Cita de: penumbra en Noviembre 24, 2015, 06:39:17 PM
Cita de: jmbs19 en Noviembre 24, 2015, 05:36:40 PM
porque el gml no es inteligente, en el sentido de que el comprueba todas las variables aunque la primera sea falsa, entonces esto genera un peor rendimiento a la hora de ejecutarlo.
Cita de: jmbs19 en Noviembre 24, 2015, 06:17:48 PM
suponiendo que ataque sea false igualmente paso a paso estara comprobando el collision_check y las distances, lo que son unos calculos pesados.
GMS Realiza comprobaciones inteligentes (short-circuit evaluation) desde la versión 1.3. Si la primera condición es falsa, ya no evalúa las demás.
https://www.yoyogames.com/tech_blog/52
Casilla "short-circuit evaluations", pestaña General. en Global game settings
pues eso es nuevo XD, no leo los logs muy a menudo XD, de todas maneras igual hay que tratar de colocar las condiciones de la manera en que consuman menos recursos, si ahora el gml si lo hace, que antes no lo hacia como lo dijiste, igual abria que poner los chequeos de variables y cosas livianas al principio de la condicion. pero como dijiste antes no lo tenia y uno era el que tenia que hacer ese tipo de cosas.
con respecto a niuweb, no tendrias que cambiar nada en los botones, solo tienes que saber sus posiciones relativas a la view y multiplicarla por el escalar, y para hacer zoom en las view a partir del escalar seria algo como view_hview y view_wview por el escalar zoom
No me refiero a los botones, sino que tendría que hacer cientos de comprobaciones porque necesito muchos botones de GUI en el EDITOR.
¿es esa la única opción?
correcto, lo mejor sería tener los botones juntos para hacer el mínimo de verificaciones posibles y si los ajuntas bien juntos todos en un solo rectangulo, entonces con una sola bastará :B
EDITO:
por ejemplo en mi proyecto tengo botones de gui, pero los tengo todos abajo en una linea, entonces solo he de poner if mouse_y < view_yview[0]+view_hview[0]-32 exit; //siendo 32 la altura del los botones
Precisamente. Este post puede ser leído, por "n" número de usuarios. Mejor saber que hay un cambio en la manera de evaluar las condiciones, que no saberlo (me temo que la gran mayoría no lee los blogs).
Pues tendré que amontonar eso como una sopa...xD
Veré a ver si lo logro pero dejo el tema abierto por si acaso...xD
Gracias :-[ :-\
PD: De qué habla Penumbra?
Cita de: NiuWeb en Noviembre 24, 2015, 06:54:55 PM
No me refiero a los botones, sino que tendría que hacer cientos de comprobaciones porque necesito muchos botones de GUI en el EDITOR.
¿es esa la única opción?
¿entonces cada boton es un objeto? eso no es muy eficiente, bueno, la verdad es que tampoco seria bueno hacer cientos de verificaciones, bajaria mucho el rendimiento, que te parece mejor esta idea, en cada boton pon lo siguiente, en el evento mouse_boton pon algo como esto global.boton_presionado = 1(lo pongo en este evento porque si fuera en el pressed solo detectaria cuando se presiono, entonce suponiendo que el usuario arrastra el dedo creando algo y toca los botones se seguiria creando igual) y en el evento mouse_boton_released pon global.boton_presionado = 0 y en la condicion del objeto creador pon
[gml]
if global.boton_presionado=0
//tu codigo
[/gml]
por supuesto el orden de ejecucion de los objetos es el mismo que el de su creacion, asegurate que tu objeto creado se cree despues que los botones, si no lo haces asi podria crear el primero objeto y eso tampoco se veria bien.
oie no había pensado en eso, lo intentaré a ver que tal...
PD: No, todos los botones son un solo objeto que crea las vistualKey y la GUI, no soy tan tontillo...xD
PD2: Sigo con la duda... ¿De qué habla penumbra?
Cita de: penumbra en Noviembre 24, 2015, 07:03:33 PM
Precisamente. Este post puede ser leído, por "n" número de usuarios. Mejor saber que hay un cambio en la manera de evaluar las condiciones, que no saberlo (me temo que la gran mayoría no lee los blogs).
manda una captura de cómo salen esos botones en pantalla yel código de las virtual keys plis, a partir de ahi, se nos ocurrirá la manera más fácil, esperemos
ok, ahí van:
Tengo un scrpit para dibujar en el GUI:
(https://i.gyazo.com/c93e38af306959c31837e263bab2a7b1.png)
(Ignoren los comentarios...xD)
Y en draw GUI lo ejecuto:
(https://i.gyazo.com/9ed5a02732f99f3a327ea222a7ffcc43.png)
Ahora, en create, creo las virtualKey:
(https://i.gyazo.com/ed7fc79c049f8ec2738b793496feda16.png)
EDITO:
y se me olvidó, así se ven en la pantalla:
(http://gyazo.com/7bbaadf42a518200a8432de5008a461a.png)
if mouse_x > view_xview[0]+288 //siendo 288 lo que calculo que mide el ancho de los dos botones y el espacio entre ellos
and mouse y > view_yview[0]+64 //siendo 64 loque calculo que mide la altura de los botones
{
//codigo el mouse_buton
}
Por Dios Kostra!
Has calculado eso perfectamente! eso miden!
¿Cómo diablos lo mediste?
suponiendo que los cuadritos de la rejilla son de 32x32, he pillado el mechero lo he puesto sobre los sprites marcando con mi dedo y los he comparado con la rejila JAJAJAJJAJAJAKASJDAKSJ
ah.
AHHHHHHHHHHHHHHHHHH!!!!!!!!!!
cómo no lo noté antes, dios mio...xD
retrasoooooo
Y bueno, supongo que tendré que hacer eso por cada grupo de botones que tenga ¿no?
si están separados y quieres poder clickear entre los espacios de cada botón, sí, aunque no veo necesidad, lo que recomiendo es usar una sola parte para todos los botones, por ejemplo, la parte de arriba como lo tienes ahora y los separas a proporción que ocupen todo el ancho, entonces, para que quede bien, les pones un fondo para que el usuario no trate siquiera de clickar entre los espacios entre los botones cuando el mapa está más arriba, porque no se verá ya que hay fondo en el "gui" del editor
Pero si quieres ponerlos, a saber cómo y que el usuario pueda clickear, pues sí, has de hacer eso... que tampoco es para tanto, recuerda que existen los scripts para facilitarte los códigos relativamente repetidos
Ya me rindo, lo hare así y al carajo la pereza...xD
Gracias, Kostra y a todos (incluyendo los que me cambiaron el tema y empezaron a hablar de cosas WTF...xD)
Si vieras el código que estoy tocando ahora, con millones de copypaste editando los valores, te reirías de 4 botones que ha de tener el editor... pero cuántos botones pretendes poner? 700??? xDD
básicamente 120...xD
Cita de: NiuWeb en Noviembre 24, 2015, 08:11:44 PM
básicamente 120...xD
O.o, agrupalos todos en un area y si se hace click dentro de esa area desactivas la creacion de objetos.
oh, oh, si, claro... agrupar 120 botones de 128px de largo y dejando un margen de 32px entre ellos en una zona de 1280px sin que me llene la mitad de la sala... buena idea campeón...xD
llenaré las 4 esquinas, y si se me hace imposible, creare menús despleglables o algo así... XD :D XD XD :D :D
por dios, pero son los botones de los items????
de ser asi, NO NECESITAS VIRTUAL KEYS!! ya que es incoherente clickar dos items a la vez u.u' "campeón" xD
puedes hacer eso mismo, o menu desplegable o usar UNA SOLA LINEA DE BOTONES, con flechas a los laterales para moverlos, algo así como lo que estoy haciendo yo en mi miniproyecto AHORA MISMO:
https://gyazo.com/3da52808ecbfeb6d39f7b11550afdda5
bueno, campeón... no son items. Son opciones... guardar, guardar como, guardar y salir, salir, jugar/probar, Color de relleno de item, color de borde de item, color de fondo, imagen de fondo, anchor de la sala, altura de la sala, seleccionar objeto en sala, selaccionar todos, capa/grupo, seleccionar objeto en capa, seleccionar toda la capa, de-seleccionar, eliminar, eliminar todos, eliminar capa, eliminar seleccionado, retroceder, reiniciar, paso adelante, mostrar color de fondo en edición, mover 1cuadro en cuadrícula, movimiento libre, mover 2 cuadros en cuadrícula, Agregar texto, agregar iluminación, modo de juego....Etcétera.
Es bastante grande la lista, y los items los haré en otra room que guarde en un .INI el objeto sellecionado, y al llegar de nuevo al editor, se leerá el objeto seleccionado y listo... 8)
¿viste? "campeón" ...xD
a ver campeón AJAJAJA xD
1- los primeros botones, los de "menu" los apilas en una sola linea arriba
2- los botones restantes, los que parecen del editor, los apilas en una linea a la izquierda (típico en editores gráficos y de mapeo) con flechas arriba y abajo.
3- haces el engine para mover los botones del editor, si no sabes, abre otro tema xD
4-
[gml]if mouse_x > view_xview[0]+128 and mouse_y > view_yview[0]+64
{
//codigo mouse button
}[/gml]
PD: Cómo pretendes poner todos esos botones con pereza sin hacer ningún sistema para apilarlos lo máximo y cómodo para el usuario?? cuánto espacio de mapeo queda??? :S imagínate apilarlos de la manera que te he dicho, se tarda claro pero, no te gustaría ver lo bien que quedará? :B
Por eso dije hace poco que si se me hacía imposible (por lo perfeccionista que soy, imposible = medio-feo) haría menús desplegables o algo así...xD
pero primero, hacer el juego, que voy super atrasado (llevo 4 botones (los que viste, más uno nuevo)...xD)...xD