Septiembre 05, 2014, 05:07:17 PM Ultima modificación: Septiembre 05, 2014, 05:28:43 PM por king195
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.

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

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

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.

#4 Septiembre 05, 2014, 09:01:08 PM Ultima modificación: Septiembre 05, 2014, 09:02:40 PM por penumbra
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.

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  :)

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.

#7 Septiembre 05, 2014, 10:10:57 PM Ultima modificación: Septiembre 05, 2014, 10:13:53 PM por penumbra
¿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.

#8 Septiembre 05, 2014, 10:41:14 PM Ultima modificación: Septiembre 06, 2014, 12:13:43 AM por king195
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  :)

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?.

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?

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.

El problema era del ratón, ya decía yo, maldito ratón que me juega malas pasadas, que estrés...