Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: king195 en Septiembre 05, 2014, 05:07:17 PM

Título: Afecta a todas las instancias por igual
Publicado por: king195 en Septiembre 05, 2014, 05:07:17 PM
He estado trasteando y haciendo que cuando haga un click encima de un enemigo este cambie de sprite pero no funciona correctamente ya que afecta al objeto en si y no a la instancia del enemigo(ya que obviamente hay varios enemigos en pantalla), a fin de cuentas acaba afectando a todos los enemigos y no sólo a 1.

Step Event del Enemigo
if mouse_check_button_pressed(mb_right) and global.click_enemie = false{
sprite_index = spr_enemie_dead;
image_speed = 1;
global.click_enemie = true;
}


Lo que busco es que afecte a cada instancia sin importarle el resto, creo que puede ser por el hecho de estar en el Step Event..

Al final trastee, le añadi un "}else{ global.click_enemie = false;}"(que vi que me faltaba) y lo puse en el evento de click, quitando así también el mouse_check_button_pressed


Edito: Me he dado cuenta de que hay un pequeño retraso cuando le quiero dar click a otro enemigo le doy pero  no hace efecto lo que quiero que suceda, le tengo que dar unas 2-3 veces para que me haga caso.
Título: Re:Afecta a todas las instancias por igual
Publicado por: Xizotono en Septiembre 05, 2014, 07:26:32 PM
Si pones un ese else nunca se haria la accion ¿no?, porque si la pones a uno y despues si no se cumple la pones a 0 se haria una especie de bucle, prueba a ponerlo con alarmas.

Lo unico que veo hay que puede afectar a otras instancias puede ser el tema de la variable global, mira el objeto enemigo y que funciones tiene la variable global.click_enemie
Título: Re:Afecta a todas las instancias por igual
Publicado por: diegohernans en Septiembre 05, 2014, 07:50:04 PM
Por lo del retrazo tal vez sea mejor usar en mb_left y lo que te susedia en el inicio hacia efecto en todos los objeto de enemigos podría funcionar usando "other" en alguna parte del codigo
Título: Re:Afecta a todas las instancias por igual
Publicado por: Xizotono en Septiembre 05, 2014, 08:00:55 PM
Te afectaria a todos si usaste un obj_enemigo, en este codigo no muestra nada asi que el other pues no creo que haga mucho.

Lo del retraso creo que es el tema del else, que se haria una especie de bucle y como que se quedaria inutilizado.
Título: Re:Afecta a todas las instancias por igual
Publicado por: penumbra en Septiembre 05, 2014, 09:01:08 PM
Este código
if mouse_check_button_pressed(mb_right) and global.click_enemie = false{
sprite_index = spr_enemie_dead;
image_speed = 1;
global.click_enemie = true;
}

bórralo.

En el objeto enemigo, agrega un evento MOUSE LEFT PRESSED (no global, repito, no global)
[gml]sprite_index = spr_enemie_dead;
image_speed = 1;[/gml]

Con eso debería funcionar, ya que los eventos de ratón no globales sólo se lanzan cuando se hace click sobre la máscara de colisión de la instancia en cuestión.

NOTA: Una image_speed = 1 es generalmente una velocidad muy muy alta, creo que vas a tener que reducirla.
Título: Re:Afecta a todas las instancias por igual
Publicado por: king195 en Septiembre 05, 2014, 09:31:20 PM
Cita de: penumbra en Septiembre 05, 2014, 09:01:08 PM
Este código
if mouse_check_button_pressed(mb_right) and global.click_enemie = false{
sprite_index = spr_enemie_dead;
image_speed = 1;
global.click_enemie = true;
}

bórralo.

En el objeto enemigo, agrega un evento MOUSE LEFT PRESSED (no global, repito, no global)
[gml]sprite_index = spr_enemie_dead;
image_speed = 1;[/gml]

Con eso debería funcionar, ya que los eventos de ratón no globales sólo se lanzan cuando se hace click sobre la máscara de colisión de la instancia en cuestión.

NOTA: Una image_speed = 1 es generalmente una velocidad muy muy alta, creo que vas a tener que reducirla.

Si ya, perdón por no avisar antes  :-[ ya lo había arreglado de la misma manera que tu has dicho probando y probando y salio, lo del tema del Image_speed ya depende a lo que le quiera dar uso yo :P igual gracias por aclarar el tema del global, lo tendré en cuenta para la próxima vez  :)
Título: Re:Afecta a todas las instancias por igual
Publicado por: king195 en Septiembre 05, 2014, 09:40:46 PM
Mmm... Hay un problema derivado a raíz de todo esto. Cuando cambio al sprite "spr_enemie_dead" quiero que si el personaje pasa por donde murió el enemigo no le afecte el nuevo "sprite". Por lo tanto necesito por así decirlo una variable global que vincule la muerte por click del enemigo con el sprite, haciendo que al personaje no le afecte dicho sprite, pero claro, si uso una variable global volvemos al problema de antes, hago un click a uno y ya por defecto no me afecta ningún enemigo sin haber muerto.
Título: Re:Afecta a todas las instancias por igual
Publicado por: penumbra en Septiembre 05, 2014, 10:10:57 PM
¿A que te refieres con que no le afecte el nuevo sprite? ¿Que el player no reciba daño del enemigo muerto? En estos casos no es recomendable usar variables globales, creo que lo que te está faltando es usar la sintaxis de punto para llamar a variables desde otros objetos

Si es lo del daño, en el evento CREATE del enemigo
[gml]muerto = 0 [/gml]

en el evento MOUSE LEFT PRESSED del enemigo
[gml]if (muerto = false)
{
     sprite_index = spr_enemie_dead;
     image_speed = 1;
     muerto = 1;
}
[/gml]

En el objeto player, el enemigo sólo puede afectar al jugador si no está muerto. Esto se puede hacer de distintas maneras, pero como no das detalles, voy a suponer que se usa el evento de colisión player - enemigo:
[gml]if (other.muerto == false)
{
     // codigo para que el enemigo dañe al jugador (restar vida/salud)
}[/gml]
Y de esta manera si la instancia enemiga está "muerta", no puede afectar al jugador cuando el jugador pasa por ella.
Título: Re:Afecta a todas las instancias por igual
Publicado por: king195 en Septiembre 05, 2014, 10:41:14 PM
Cita de: penumbra en Septiembre 05, 2014, 10:10:57 PM
¿A que te refieres con que no le afecte el nuevo sprite? ¿Que el player no reciba daño del enemigo muerto? En estos casos no es recomendable usar variables globales, creo que lo que te está faltando es usar la sintaxis de punto para llamar a variables desde otros objetos

Si es lo del daño, en el evento CREATE del enemigo
[gml]muerto = 0 [/gml]

en el evento MOUSE LEFT PRESSED del enemigo
[gml]if (muerto = false)
{
     sprite_index = spr_enemie_dead;
     image_speed = 1;
     muerto = 1;
}
[/gml]

En el objeto player, el enemigo sólo puede afectar al jugador si no está muerto. Esto se puede hacer de distintas maneras, pero como no das detalles, voy a suponer que se usa el evento de colisión player - enemigo:
[gml]if (other.muerto == false)
{
     // codigo para que el enemigo dañe al jugador (restar vida/salud)
}[/gml]
Y de esta manera si la instancia enemiga está "muerta", no puede afectar al jugador cuando el jugador pasa por ella.

Hay un enemigo que colisiona con el jugador, cuando el enemigo muere hay un sprite/efecto que simula una muerte, pero claro, la instancia del enemigo sigue existiendo mientras el efecto de muerte del enemigo se reproduce y ahí el jugador puede seguir colisionando con el enemigo(el cual esta muerto y esta haciendo la cadena de sprites de muerte) y restando su vida.

El Player tiene el efecto de colisión en el step.

Igual ya funciona lo que me dijiste, gracias  :)
Título: Re:Afecta a todas las instancias por igual
Publicado por: Xizotono en Septiembre 06, 2014, 12:18:32 AM
No, es mejor hacer la colision con los eventos de GM (que para eso estan)...no se que manias teneis con el evento step, supongo que utilizarias algo tipo distance_to_object o algo por el estilo ¿no?.
Título: Re:Afecta a todas las instancias por igual
Publicado por: king195 en Septiembre 06, 2014, 12:34:55 PM
Ahora pasa menos veces pero no puede ser que siga pasando... a veces cuando doy un click encima del enemigo no me detecta el click, pasa olímpicamente de hacerlo y le tengo que dar 2 o 3 veces para que me haga caso. Puede ser cosa de mi ratón?
Título: Re:Afecta a todas las instancias por igual
Publicado por: Xizotono en Septiembre 06, 2014, 12:53:03 PM
Si quieres pasar el editable seria mucho mas facil ayudarte, o poner mas codigo y demas.

En principio con poner en el enemigo, en el evento MOUSE LEFT: sprite_index = spr_muerto; pues funcionaria bien, ahora bien puede ser que haya algun otro objeto que interfiera.
Título: Re:Afecta a todas las instancias por igual
Publicado por: king195 en Septiembre 06, 2014, 01:01:47 PM
El problema era del ratón, ya decía yo, maldito ratón que me juega malas pasadas, que estrés...