Agosto 15, 2012, 11:32:25 AM Ultima modificación: Agosto 15, 2012, 06:28:27 PM por Texic
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.

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
El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy


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 -

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
El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy


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




#5 Agosto 15, 2012, 07:03:17 PM Ultima modificación: Agosto 15, 2012, 07:05:14 PM por Mgbu

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
El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy


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!

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
El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy


#8 Agosto 15, 2012, 07:16:24 PM Ultima modificación: Agosto 15, 2012, 07:17:56 PM por totemalf
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 ¿?

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
El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy


Fantástica explicación, muchas gracias!!

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!


#12 Agosto 17, 2012, 07:13:23 PM Ultima modificación: Agosto 17, 2012, 07:14:54 PM por Texic
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}




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)
El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy


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