Agosto 31, 2010, 01:16:29 PM Ultima modificación: Septiembre 05, 2010, 12:03:22 PM por wako91
Buenas, he conseguido hacer unos enemigos mas o menos decentes: te siguen, cuando te alejas de su alcance vuelven a su sitio, si les disparas desde fuera de el te atacan e incluso se mueven mostrando el sprite oportuno (hasta el de atacar).

El problema es que no consigo que cuando alcancen al jugador le ataquen o si lo logro lo hacen de forma continua por lo que la vida del jugador se consume en unos segundos (b?sicamente lo que tarda el juego en hacer las operaciones, casi nada!)

Se trata de un ataque f?sico, es decir, cuando el enemigo impacta contra el jugador.

A ser posible que todo se pueda resolver dentro del propio objeto "enemigo".

?Gracias!

Yo en mis juegos (que por lo visto son bastante parecidos al que mencionas) simplemente hago que los enemigos no quiten mucha vida, entonces si los "tocas" por un largo rato mientras te atacan, te quitan mucha vida, pero si solo te rozan te quitan menos...

PD: Tambien te puede ayudar hacer que el enemigo te empuje cuando te ataque (asi no te toca infinitamente)

Eso ultimo me ha llamado, ?como podr?a hacer ese efecto?

Cita de: wako91 en Agosto 31, 2010, 01:16:29 PM
...o si lo logro lo hacen de forma continua por lo que la vida del jugador se consume en unos segundos

Para solucionarte esto yo te aconsejo crear una variable que sea por ejemplo invencibilidad, entonces, primero la estableces a cero, y en el evento de colision del enemigo, antes de la linea de codigo que dice que le quita vida, pon que compruebe dicha variable. Si es cero, que le quite vida y que adem?s, la variable cambie a 1:


En evento Create:
invencible=0;

En evento de colision con el enemigo:

if invencible=0{
acciones de quitar vida;
invencible=1;}


Ahora surge un ligero problema: c?mo restaurar la variable invencible a cero para que vuelva a poder ser atacado por el enemigo.

Cita de: Kuroh en Septiembre 02, 2010, 04:06:58 AM
PD: Tambien te puede ayudar hacer que el enemigo te empuje cuando te ataque (asi no te toca infinitamente)
Cita de: wako91 en Septiembre 02, 2010, 01:03:05 PM
Eso ultimo me ha llamado, ?como podr?a hacer ese efecto?

Si te interesa eso, es f?cil, simplemente coloca en el evento de colision con el enemigo, aparte de las l?neas de c?digo de recibir da?o, que primero compruebe que el lugar hacia el que va a salir rebotado est? vac?o, y luego que vaya hacia ?l. Ser?a una cosa as?:

En el evento de colisi?n con el enemigo:
//Por ejemplo
if place_free(-4,-4){
x-=4;
y-=4;}


Con esto conseguir?s que tu personaje rebote hacia arriba y hacia atr?s cada vez que colisione con el enemigo. Volviendo al tema de la invencibilidad, ponle que al colisionar con el suelo la variable invencible vuelva a cero.

Cualquier duda me avisas.

Cita de: Monigote en Septiembre 02, 2010, 07:19:55 PM

En evento Create:
invencible=0;

En evento de colision con el enemigo:

if invencible=0{
acciones de quitar vida;
invencible=1;}


Ahora surge un ligero problema: c?mo restaurar la variable invencible a cero para que vuelva a poder ser atacado por el enemigo.
eso seria facil, podrias poner una varible de tiempo, que cuando invencible=1 , tiempo+=1 ,cuando el tiempo llege a por ejemplo 30, invecible sea 0

Cita de: MRafX en Septiembre 02, 2010, 10:39:37 PM
Cita de: Monigote en Septiembre 02, 2010, 07:19:55 PM

En evento Create:
invencible=0;

En evento de colision con el enemigo:

if invencible=0{
acciones de quitar vida;
invencible=1;}


Ahora surge un ligero problema: c?mo restaurar la variable invencible a cero para que vuelva a poder ser atacado por el enemigo.
eso seria facil, podrias poner una varible de tiempo, que cuando invencible=1 , tiempo+=1 ,cuando el tiempo llege a por ejemplo 30, invecible sea 0

Cuando dije eso, en realidad quer?a decir algo as? como: 'Ahora dir?s: ?c?mo restauro la variable invencible para que vuelva a ser atacado?', ya que luego yo mismo comento:
Cita de: Monigote en Septiembre 02, 2010, 07:19:55 PM
Volviendo al tema de la invencibilidad, ponle que al colisionar con el suelo la variable invencible vuelva a cero.

Vale, no me qued? muy claro cuando lo puse, pero en fin, la cuesti?n era solucionarle el problema y no me preocup? mucho de la presentaci?n. XD

En fin, wako91, tal y como ha dicho MRafX, tambi?n puedes hacer eso para restaurar la variable invencible, aunque yo te propongo otro m?todo similar para a?adirle adem?s el t?pico parpadeo de invencibilidad al recibir un golpe. Para esto, crea una timeline y a??dele los steps del 1 al 45 de 5 en 5 as?:


Step 1: visible=false
Step 5: visible=true
Step 10: visible=false
Step 15: visible=true
Step 20: visible=false
Step 25: visible=true
Step 30: visible=false
Step 35: visible=true
Step 40: visible=false
Step 45: visible=true; invencible=0


Esto lo pones en el evento de colision con el enemigo, junto con invencible=1, y conseguir?s un efecto de parpadeo temporal durante un segundo y medio aproximadamente.

Espero que estos truquillos y sugerencias te hayan servido. Cu?ntanos qu? tal te funcion?. :)

#6 Septiembre 03, 2010, 01:36:50 AM Ultima modificación: Septiembre 03, 2010, 12:11:16 PM por wako91
No consigo adaptarlo a lo que tengo, seguir? probando.

Por cierto, ya he conseguido reparar lo del jugador, en vez de ponerle limitaciones de da?o al enemigo finalmente he optado por pon?rselas al jugador. B?sicamente el tiempo que tarda en poder dar otro golpe.

Aunque el problema de los enemigos que no hacen da?o ni a la de tres sigue ah?.

?Gracias por vuestra ayuda por cierto!

#7 Septiembre 04, 2010, 04:29:24 PM Ultima modificación: Septiembre 04, 2010, 04:32:30 PM por Megaratanuva
En el tema de que vaya hacia ti el enemigo podr?as hacer una variable por ejemplo distancia y activarla y desactivarla cuando estes o no respectivamente en el rango de ataque del enemigo:

En el create del enemigo:

 distancia=false //no estas en el rango

En el step del enemigo:

  if distance_to_object(obj_player) = //el rango de ataque...
  {
      distancia = true //detecta que est?s en el rango
  }
  else //sino...
  {
      distancia = false //poner que no est?s en el rango
  }
 
  if distance = true
  {
      move_towards_point(obj_player.x//cooordenadas x del jugador, obj_player.y//coordenadas y del juegador,//velocidad)
  // ejemplo: move_towards_point(obj_player.x,obj_player.y,12)
  //hace que se mueva hacia al jugador a la velocidad que quieras, si est?s en el rango
  }
  else
  {
     move_towards_point(//el punto x de inicio, //el punto y de inicio, //velocidad) //hace que vuelvas al punto del principio
  //ejemplo: move_towards_point(234,100,5)
  }


Sobre lo de que no te funcione la invulnerabilidad, es muy extra?o, prueba a ejecutar el juego con F6 o con el signo del play rojo, aqui podr?s ver las variables globales y del personaje si lo seleccionas, a lo mejor es que la variable no se ejecuta normalamente.

Espero que te sirva.
En este mundo cruel, nada es verdad ni mentira, todo depende del color del cristal con que se mira.

#8 Septiembre 04, 2010, 07:22:47 PM Ultima modificación: Septiembre 04, 2010, 08:19:57 PM por wako91
Con las distancias no tengo ning?n problema, eso ya esta pensado.

No es que no me funcione la invulnerabilidad es que no consigo que funcione bien o que no interfiera con otras cosas. Estoy probando a reescribir el c?digo de los enemigos desde 0 con vuestras sugerencias para ver si as? logro que todo funciones bien.

EDITO: Ya he conseguido que funcione, todav?a no act?an de forma muy natural, pero todo se andar?. Gracia a todos por vuestra ayuda.


Yo lo que hago es precisamente eso de usar una variable, pero en el enemigo:
algo as?:
enemigo:
create:
CitarpAtacar=true //una variable que permita atacar y da?ar, empieza en true
luego en la colisi?n con el personaje:
Citarif(pAtacar==true)
{
  //realizar el da?o al personaje
  pAtacar=false; //hago que la variable que permita da?ar se desactive
  alarm[0]=15 // llamo una alarma con el tiempo en el que el enemigo espera para volver a da?ar
}

y en el evento de la alarma[0]:
CitarpAtacar=true;

Y as? aun que el enemigo est? pegado al personaje solo le causar? un da?o cada cierto tiempo,  :D

En breve subir? una demo al post "X Hero" en juegos en proceso.

Puesto que se trata de los primeros enemigos ser?n muy f?cies de vencer.

Espero que los que me hab?is ayudado os pas?is y me digais si mas o menos he hecho un buen trabajo :P

Por cierto thanks! knd144