Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: zHeMaa en Noviembre 27, 2014, 05:40:18 PM

Título: Enemigo ataca [SOLUCIONADO]
Publicado por: zHeMaa en Noviembre 27, 2014, 05:40:18 PM
Buenas a todos, tengo un juego de enemigos que el personaje al tocar al enemigo baja 1 de vida (de 100) en total.
El problema es que ese 1 baja super rápido ya que es por colisión, me gustaría saber si puedo poner que cuando el enemigo me ataque salte una alarma de 1 segundo por ejemplo hasta que ese mismo enemigo pueda volverme a atacar.

Y si es posible que cuando me ataque el enemigo en vez de que se quede en el mismo sitio (ya que parecerá que no ha pasado nada..) me gustaría que el enemigo se eche para delante y retroceda, es decir..

El enemigo esta lo suficiente cerca del personaje se eche para delante, baje el hp del personaje y retroceda.

Si lo segundo es muy complicado me sirve con eso de la alarma, al menos para ir tirando y avanzando el juego!
Muchas gracias de antemano!

(No pongo códigos ya que es una tontería.. tengo el típico código que cuando el enemigo colisiona con el personaje le baje 1 la vida)
Título: Re:Enemigo ataca
Publicado por: Jucarave en Noviembre 27, 2014, 09:17:33 PM
Bueno tu mismo tienes la idea de como hacerlo, con una alarma y que dentro de ese tiempo no se pueda hacer mas daño, por ejemplo supon que añades una variable al objeto del jugador

[gml]invulnerable = false;[/gml]

luego en el evento de colisión contra el enemigo (en el objeto del jugador) añades esto:

[gml]
// Que solo haga daño si no es invulnerable
if (invulnerable == false){
    // Aquí iría tu código de hacer daño
    invulnerable = true;
    alarm[0] = 30; // 1 Segundo si tu habitación corre a 30fps
}
[/gml]

De este modo solo hará daño una vez, que sería cuando toque al personaje, luego ya sería cuestión de restablecerlo en el evento de la alarma

[gml]
invulnerable = false; // Puede volver a recibir daño.
[/gml]
Título: Re:Enemigo ataca
Publicado por: zHeMaa en Noviembre 27, 2014, 10:13:22 PM
Gracias por comentar! funciona, pero hay un "problema" y es que tengo por el momento 3 tipos diferentes de enemigo y si por ejemplo primero me ataca uno que me quita 1 de hp cada 1 segundo, y luego uno que me quita 5 de hp por segundo, prevalece el primero que me ha tocado, es decir.. me tendrían que quitar 1 + 5, y me quitan solamente 1 de hp, vamos.. que el primero que me ataca es lo que me van a quitar.

Para solucionar esto tendría que hacer varias alarmas supongo, pero claro.. tengo pensado poner varios enemigos (posiblemente mas de 10) y tengo ya varias alarmas en uso, por lo tanto no seria 100% la mejor opción yo creo..

Un saludo! (:
Título: Re:Enemigo ataca
Publicado por: Xizotono en Noviembre 27, 2014, 10:23:12 PM
Supongo que el enemigo si esta cerca del personaje le sigue ¿no?, ahora haz que en vez de seguirlo active una variable (seguir = 1) y que si seguir es 1 pues le siga (if seguir = 1 {codigo seguir}). Bien, ahora digamos que es un 2d (Tipo mario bros), debes indicar en que posicion esta el enemigo respecto al jugador para que se diriga al contrario (if obj_player.x > other.x, o algo por el estilo) pues que se mueva hacia un lado u hacia el otro y marque que no le siga tras el ataque (seguir = 0, x -= 5, alarm[0] = room_speed * X), lo que hemos hecho es que al atacarle no le siga, se mueva en la direccion indicada (se supone que esta a la izquierda del player) y que tras X segundos vuelva a seguirle (alarm[0] -> seguir = 1).

No se si quedo un poco lioso xP, yo seria asi como lo haria y lo iria modificando segun errores o necesidades ^^

NUEVO:

Lo que tienes que hacer de invulnerable es para salir del paso, haz que los enemigos tengan un timing, que ataquen cada X segundos mediante alarmas (colision -> if atacarposible = 1 { hp -=1, atacarposible = 0, alarm[0] : room_speed * X). Era como lo tenia yo en un RPG que tengo por aqui y funciona de lujo ^^ (Sobretodo si tienen animaciones de ataque para que acaben las animaciones y demas :D)
Título: Re:Enemigo ataca
Publicado por: zHeMaa en Noviembre 27, 2014, 10:59:34 PM
Xizotono, he usado tu código pero hace exactamente lo mismo que el código de Jucarave.
Si me atacan 10 enemigos que cada uno quita 1 de hp, seria 10 de hp por segundo, y me quitan 1 igual..

He "aclarado" un poco tu código, dime haber si es exactamente esto:
En la colisión con los enemigos:
[gml]if atacarposible=1
{
hp-1;
atacarposible=0;
alarm[3] = room_speed*1;
}[/gml]

En la alarma:
[gml]atacarposible=1;[/gml]

Y en step:
[gml]atacarposible=1;[/gml]

Gracias por responder! un saludo!

EDITO: He estado comiéndome la cabeza, probando cosas y eso.. y lo único que se me ocurre es hacer una especie de Alarma pero sin crearla, el problema esta en que cuando se hace una alarma Todos los enemigos la utilizan, y por lo tanto si hay 10 atacándome solo me quitaran 1 en vez de 10, por lo tanto lo a lo que yo me refiero es a hacer que ataquen por ejemplo cada segundo pero sin utilizar una alarma, que no se si sera posible de alguna manera pero si lo es, el problema ya estaría resuelto.
Título: Re:Enemigo ataca
Publicado por: Xizotono en Noviembre 27, 2014, 11:55:01 PM
Nop, la colision es del enemigo -> player (no al reves). Si lo pones en el player haras un efecto de invencibilidad, si lo pones en el objeto enemigo (en cada uno de los tres) pues haras un efecto de no poder atacar en x tiempo (cabe destacar que seria algo tipo other.hp -=1)
Título: Re:Enemigo ataca
Publicado por: zHeMaa en Noviembre 28, 2014, 10:23:47 AM
Xizotono, lo acabo de hacer con los 3 enemigos y me funciona perfectamente!

Muchísimas gracias a los dos por comentar, un saludo! (: