Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: totemalf en Agosto 15, 2012, 11:32:25 AM

Título: Duda con Mouse Enter y Mouse Leave
Publicado por: totemalf en Agosto 15, 2012, 11:32:25 AM
Buenas, antes de nada me presento. Mi nombre es Asensio, y estoy comenzando con el aprendiza de Game Maker. Tengo la versión 8.1 Lite.

He estado realizando el tutorial 1 de yoyogames, el de "tu primer juego", atrapa al payaso. Lo he llevado a cabo sin ningún problema, pero he tratado de agregarle alguna cosita más y bueno ya se me ha complicado el tema.

Mi intención es que cuando el cursor pase sobre el payaso, el borde del mismo se ilumine de color amarillo, para indicar al jugador que si en ese preciso milisegundo hace click, se van a sumar los puntoss. Para conseguir esto he creado un nuevo sprite con el borde ya coloreado de amarillo, y he creado en el objeto payaso los eventos mouse enter y mouse leave, en mouse enter he colocado la accion de cambiar sprite por spr_payasoenter y en mouse leave he colocado cambiar sprite por el que había, spr_payaso.
En teoria esto funciona perfectamente, lo he probado con objetos estaticos y va perfecto, cuando pasa el puntero por encima se ilumina, cuano se quita vuelve al estado normal, pero con el payaso el resultado es desastroso.
Con el payaso, a veces tarda un rato en cambiar el sprite, y otras veces se queda "pillado" mostrando todo el rato el segundo sprite.... funciona, más o menos... pero mal.

No se si estoy haciendo algo mal o si hay otra forma de tratar de conseguir este efecto con objetos móviles... ya digo que con estáticos va perfect. Estaría muy agradecido por cualquier sugerencia que podáis darme.

Desde ya, muchas gracias.
Asensio.
Título: Re:Duda con Mouse Enter y Mouse Leave
Publicado por: Mgbu en Agosto 15, 2012, 11:48:54 AM
Me parece que hay algo en mouse leave que hace que no funcione
Creo que deberia funcionar, otra es que nos pases el editable (archivo .gmk), podes adjuntar en "Opciones adicionales" cuando contestas el tema
Título: Re:Duda con Mouse Enter y Mouse Leave
Publicado por: romon_28 en Agosto 15, 2012, 05:29:05 PM
Mira la verdad no tengo muchas ganas de explicarte el error, pero te puedo ayudar solucionandolo.

Create un nuevo Objeto al que llamaras "Obj_Puntero".  Su sprite_index o su mask_index tiene que ser un sprite de 1x1 pixel, y en el evento "create" pone:

{
C=0;
}

Para simular el efecto de mouse enter y mouse leave ubicate en el objeto que queres hacer la comprobacion
en su evento "step end" pone:

{
if instance_exists(Obj_Puntero)
{
  with(Obj_Puntero) {x=mouse_x; y=mouse_y;}

  if !instance_place(x,y,Obj_Puntero)
  {
   if (Obj_Puntero.C=1)
  {
    //mouse leave

    sprite_index=Sp_Payaso_Normal;

    //Fin mouse leave
   Obj_Puntero.C=0;
  }
  }else{
  if (Obj_Puntero.C=0)
{
  //mouse enter

   sprite_index=Sp_Payaso_Borde;

  //Fin mouse enter
Obj_Puntero.C=1;
}
  }
}
}

a me olvidaba.. para agregar esta linea de codigo pone la solapa "Control" y luego "Code" y simplemente copias el codigo y lo pegas.
Nota fijate en los comentarios del codigo ( Letra verde con posteriormente "//" ) es donde podes añadir tus acciones. Si tenes otras dudas a ya sabes donde preguntar.

- ROMON -
Título: Re:Duda con Mouse Enter y Mouse Leave
Publicado por: Mgbu en Agosto 15, 2012, 05:40:03 PM
Pero estas haciendo un objeto para eso, seria mas eficiente hacer un chequeo con mouse_x y mouse_y, quedaria un rectangulo y no haria caso a la mascara pero lo prefiero asi.
Eso es un error de GM? nunca me paso
Título: Re:Duda con Mouse Enter y Mouse Leave
Publicado por: Texic en Agosto 15, 2012, 06:31:48 PM
totemalf, te pido que te tomes un ratito para leer las reglas del subforo, no son muy largas, por esta vez corregí yo el post, porque justamente pusiste qué versión usás, pero por lo general se bloquea el post
Y chicos, qué es eso de andar contestando posts que no cumplen las reglas? En las reglas dice claramente que no se puede, aunque suene algo paradójico. Presten un poco más de atención al contestar
Título: Re:Duda con Mouse Enter y Mouse Leave
Publicado por: Mgbu en Agosto 15, 2012, 07:03:17 PM
(http://gamersmafia.com/storage/comments/803/3/extreme_facepalm.png)
Nunca me doy cuenta :'(


Ahora al problema, probé hacer lo que hiciste y es verdad, mientras se mueve no chequea nada
Por eso viendo el manial encontré una solución:

En Step agrega "Execute a piece of code", te va a abrir un lugar para escribir y pegás
if collision_point(mouse_x,mouse_y,obj_payaso,1,0)  sprite_index=spr_payaso
else sprite_index=spr_payasoenter


Acordate de cambiar obj_payaso por el nombre de objeto que uses
Título: Re:Duda con Mouse Enter y Mouse Leave
Publicado por: totemalf en Agosto 15, 2012, 07:06:39 PM
Estupendo, gracias a todos por las respuestas, voy a probarlo ahora a ver que tal.
Pido disculpas por la "ilegalidad" del post, ya he leido las normas y trataré de respetarlas.

Un saludo, y lo dicho: Gracias!
Título: Re:Duda con Mouse Enter y Mouse Leave
Publicado por: Mgbu en Agosto 15, 2012, 07:10:23 PM
Me equivoque, era al reves XD
if collision_point(mouse_x,mouse_y,obj_payaso,1,0)  sprite_index=spr_payasoenter
else sprite_index=spr_payaso
Título: Re:Duda con Mouse Enter y Mouse Leave
Publicado por: totemalf en Agosto 15, 2012, 07:16:24 PM
Si, jeje, acababa de darme cuenta, porque el payaso salia primero remarcado, ya lo había cambiado y esta funcionando!!!, genial, muchas gracias.
Imagino que esto es un pequeño error en la función Mouse Leave de GM, no?

Mgbu, serías tan amable de explicarme un poco el funcionamiento de esa linea de código?, funciona perfecto, pero me gustaría entenderlo, de momento he visto poco de Game Maker, y casi todo ha sido de la interfaz, eventos, acciones y demás, pero de código casi nada.

Mmm, es posible crear eventos nuevos en Game Maker? o sea, crear un botón en eventos con ese código y llamarlo Mouseover, por ejemplo ¿?
Título: Re:Duda con Mouse Enter y Mouse Leave
Publicado por: Mgbu en Agosto 15, 2012, 08:23:36 PM
Cita de: totemalf en Agosto 15, 2012, 07:16:24 PM
Imagino que esto es un pequeño error en la función Mouse Leave de GM, no?
No se, eso parece, porque la acción se llama "Entrada de mouse" y "Salida de mouse" y no funciona bien
Nunca habia probado, a lo mejor alguien sabe

Cita de: totemalf en Agosto 15, 2012, 07:16:24 PM
Mgbu, serías tan amable de explicarme un poco el funcionamiento de esa linea de código?, funciona perfecto, pero me gustaría entenderlo, de momento he visto poco de Game Maker, y casi todo ha sido de la interfaz, eventos, acciones y demás, pero de código casi nada.
Si, es importante que sepas :D
El if es una condicion, se traduce al español con un "si"

collision_point(mouse_x,mouse_y,obj_payaso,1,0) es una funcion, si ya sabes otro lenguaje de programacion es facil entenderlo. Es como preguntarle a alguien, esa funcion se fija si un objetocolisiona con un punto, en este caso a la funcion hay que decirle cual es el punto y el objeto. Entonces se fija si obj_payaso colisiona con un punto ubicado donde está el mouse, por eso escribo mouse_x, mouse_y (X y Y del mouse), despues ese 1 y ese 0 no es tan importante, el 1 le dice que tiene que ser preciso y el 0 que incluya al objeto en donde esta escrito
Si la funcion es verdadera (obj_payaso colisiona con el mouse) el juego hace lo que tiene al lado (sprite_index=spr_payasoenter) porque al principio pusimos if

Despues el sprite_index=spr_payasoenter hace que el sprite sea spr_payasoenter. Es facil de entenderlo

El else se traduce a "o si no" o "de lo contrario"

Al final esta de nuevo sprite_index=spr_payaso, pero fijate que ahora el sprite es spr_payaso

Todo eso se traduce en:
Si el payaso colisiona con el mouse poner de sprite spr_payasoenter
De lo contrario poner de sprite spr_payaso


En realidad el codigo es lo mismo que arrastrar cuadrados, todo lo que se puede hacer arrastrando cuadrados se puede hacer escribiendo, si no entendiste algo pregunta, al principio creia que nunca iba a aprender a escribir, pero despues vas aprendiendo porque es lo mismo que arrastrar cuadrados

Cita de: totemalf en Agosto 15, 2012, 07:16:24 PM
Mmm, es posible crear eventos nuevos en Game Maker? o sea, crear un botón en eventos con ese código y llamarlo Mouseover, por ejemplo ¿?
Si, pero demasiado dificil para lo que logras, porque vas a tener que escribir el codigo para hacer el evento. Entonces es lo mismo, pero creo que es asi:

Vas a Resources y luego a Define triggers... en el menu de arriba
Ahi agregas un evento con Add, adentro le pones el nombre (Name), por ejemplo Mouse Adentro
En Condition iría esto:
return collision_point(mouse_x,mouse_y,obj_payaso,1,0)
Es la funcion con la palabra return adelante, cosas del GM
Despues agregas otro con el nombre Mouse Fuera por ejemplo y en condition va
return not collision_point(mouse_x,mouse_y,obj_payaso,1,0)
Podes ver que es lo mismo pero con el not, eso hace que se fije si NO colisiona con el punto

Despues cuando agregas el evento va a estar en la parte Trigger
Título: Re:Duda con Mouse Enter y Mouse Leave
Publicado por: totemalf en Agosto 16, 2012, 06:01:25 PM
Fantástica explicación, muchas gracias!!
Título: Re:Duda con Mouse Enter y Mouse Leave
Publicado por: totemalf en Agosto 17, 2012, 06:56:37 PM
Mmm, Huston, tenemos un problema.  :-\
Este método es perfecto cuando solo tenemos una instancia del payaso, pero al colocar dos surge un problema.
Cuando el ratón pasa por encima de uno de los payasos se iluminan ambos... ¿Qué podríamos hacer para corregir esto?


Por otro lado, he tenido alguna idea para tratar de hacer esto sin código de por medio, o con menos código...
se podría crear un objeto sin sprite llamado mouse y asignarle la ubicación del ratón en todo momento?
de este modo bastaría con agregar un evento colisión en cada objeto que queramos colisionar con el mouse, quitando la necesidad de añadir el código en cada objeto. No se si se puede hacer.... es solo una idea.

Un saludo y gracias!

Título: Re:Duda con Mouse Enter y Mouse Leave
Publicado por: Texic en Agosto 17, 2012, 07:13:23 PM
Si el código estaba en el payaso debería quedar así entonces:
if collision_point(mouse_x,mouse_y,self,1,0)  {sprite_index=spr_payasoenter}
else {sprite_index=spr_payaso}

O también con position meeting
if position_meeting(mouse_x,mouse_y,self)  {sprite_index=spr_payasoenter}
else {sprite_index=spr_payaso}
Título: Re:Duda con Mouse Enter y Mouse Leave
Publicado por: Mgbu en Agosto 17, 2012, 07:34:34 PM
Cita de: totemalf en Agosto 17, 2012, 06:56:37 PM
Mmm, Huston, tenemos un problema.  :-\
Este método es perfecto cuando solo tenemos una instancia del payaso, pero al colocar dos surge un problema.
Cuando el ratón pasa por encima de uno de los payasos se iluminan ambos... ¿Qué podríamos hacer para corregir esto?
Ah sí, cambia donde aparece "obj_payaso" por "id"
Va a funcionar bien porque cada instancia tiene un número único que se guarda en la variable "id", entonces cuando escribis "id" estas escribiendo el numero de esa instancia

Cita de: totemalf en Agosto 17, 2012, 06:56:37 PM
Por otro lado, he tenido alguna idea para tratar de hacer esto sin código de por medio, o con menos código...
se podría crear un objeto sin sprite llamado mouse y asignarle la ubicación del ratón en todo momento?
de este modo bastaría con agregar un evento colisión en cada objeto que queramos colisionar con el mouse, quitando la necesidad de añadir el código en cada objeto. No se si se puede hacer.... es solo una idea.

Un saludo y gracias!
Sí, es la respuesta que te dio romon_28
El problema es que podria ser mas lento (porque creamos un objeto mas) y el mouse se va a ver lento.
Lo que pasa es que el juego se actualiza 30 veces por segundo, pero windows creo que 60 veces por segundo, entonces se va a notar que el mouse "se tilda" o "va lento" porque va a estar moviendose 30 veces por segundo

Tambien podes hacer que el juego funcione a 60 veces por segundo. Entra a todas las rooms y en la pestaña "Settings" cambia la room_speed que esta en 30, ponelo en 60
El problema es que va a estar todo el doble de rapido (podes modificar los valores pero es mucho trabajo si vas avanzado) y el otro problema es que consume mas recursos (la PC trabaja el doble)
Título: Re:Duda con Mouse Enter y Mouse Leave
Publicado por: totemalf en Agosto 17, 2012, 07:50:31 PM
Citarif collision_point(mouse_x,mouse_y,id,1,0)
{sprite_index=spr_payasoenter}
else
{sprite_index=spr_payaso}
De este modo funciona perfecto
Citarif position_meeting(mouse_x,mouse_y,self)
{sprite_index=spr_payasoenter}
else
{sprite_index=spr_payaso}
De este también...
La pregunta es... cual es mejor o más eficiente, o da igual?, el segundo parece más sencillo, ya que tiene dos parametros menos, por lo que imagino que será más eficiente, ¿o me equivoco?

saluti
Título: Re:Duda con Mouse Enter y Mouse Leave
Publicado por: Texic en Agosto 17, 2012, 07:56:10 PM
Si, el position meeting es un poco más light, collision point es para cosas más avanzadas. Lo único malo es que position meeting no devuelve id del objeto con el que colisiona, collision point si, pero para este caso particular no te hace falta
Título: Re:Duda con Mouse Enter y Mouse Leave
Publicado por: totemalf en Agosto 17, 2012, 08:11:10 PM
Ok, gracias, entendido.

Otra pregunta (me vais a odiar ya :P, la que estoy liando porque el mouse enter y el mouse leave no hacen su trabajo), he creado dos eventos nuevos con define triggers, tal como me explicaste Mgbu, los he llamado Mouse enter y Mouse leave también; el caso es que estos nuevos eventos solo aparecen en el proyecto en el que estoy trabajando, pero para otro proyecto debo crearlos de nuevo... ya se que es una tontería, pero ¿se puede hacer que aparezcan siempre, en cualquier proyecto?....

Y ya cambiar el mouse enter y el mouse leave del programa por los nuevos creados no se puede ni de broma, no? al no ser el programa open source ... la verdad que el desarrollador debería investigar este problema para futuras versiones.

De cualquier modo, yo creo que el programa debería contar con un evento llamado Mouse Over, al que añadirle acciones cuando el puntero está sobre el objeto, sin necesidad de usar el evento mouse leave, ya que cuando el cursor no está sobre el objeto vuelve al estado anterior. Wintermute Engine tenía esta función, por ejemplo, claro que en aventuras gráficas es imprescindible para iluminar los objetos del inventario. Creo que haré la sugerencia al desarrollador a ver cuantos insultos me lanza :P
Título: Re:Duda con Mouse Enter y Mouse Leave
Publicado por: Mgbu en Agosto 17, 2012, 09:25:50 PM
Cita de: totemalf en Agosto 17, 2012, 08:11:10 PM
Ok, gracias, entendido.

Otra pregunta (me vais a odiar ya :P, la que estoy liando porque el mouse enter y el mouse leave no hacen su trabajo), he creado dos eventos nuevos con define triggers, tal como me explicaste Mgbu, los he llamado Mouse enter y Mouse leave también; el caso es que estos nuevos eventos solo aparecen en el proyecto en el que estoy trabajando, pero para otro proyecto debo crearlos de nuevo... ya se que es una tontería, pero ¿se puede hacer que aparezcan siempre, en cualquier proyecto?....
No creo que se puedan hacer ninguna de las dos cosas, me parece, porque nunca necesité algo por el estilo XD, a lo mejor se puede

Cita de: totemalf en Agosto 17, 2012, 08:11:10 PM
Y ya cambiar el mouse enter y el mouse leave del programa por los nuevos creados no se puede ni de broma, no? al no ser el programa open source ... la verdad que el desarrollador debería investigar este problema para futuras versiones.

De cualquier modo, yo creo que el programa debería contar con un evento llamado Mouse Over, al que añadirle acciones cuando el puntero está sobre el objeto, sin necesidad de usar el evento mouse leave, ya que cuando el cursor no está sobre el objeto vuelve al estado anterior. Wintermute Engine tenía esta función, por ejemplo, claro que en aventuras gráficas es imprescindible para iluminar los objetos del inventario. Creo que haré la sugerencia al desarrollador a ver cuantos insultos me lanza :P
No se bien como hacer funcionar al Mouse Over, porque no es muy util. Lo que pasa es que el programa no sabe bien que hacer cuando se va el mouse (a veces no queres revertir todo)
Te deseo suerte en hacer que arregle el mouse enter y leave :D