Buenas, pues hasta ahora para m? esto era f?cil, lo apliqu? muchas veces... pero ahora me falla y seguramente no lo entiendo del todo.
La cuesti?n es, tenemos el prota y los enemigos. Entonces, yo lanzo un ataque al rival. El ataque est? en juego, es decir, tarda en destruirse, 10 steps, un tercio de segundo. Significa que el ataque, que resta vida al contacto, da?ar?a al rival 10 veces, conque restar?a el valor de la vida 10 veces. Pero quiero que s?lo sea una vez y en esas condiciones.
Para ello, creo al rival, en create, esto:
recibe=id; //ID del objeto del cual recibes un ataque, se obtiene al recibirlo, se elimina... cuando acaba
ultimo=id; //ID del ultimo ataque recibido, si coincide con RECIBE; no da da?o
Y en STEP esto:
recibe=other.id;
if ultimo!=recibe {vida-=other.dano; ultimo=other.id;}
es simple. Siempre, siempre que recibes un ataque, justo antes de recibirlo todo, se guarda la id del ataque recibido en tu variable "recibe". A continuaci?n, checas si "recibe", es decir, la id del objeto atacante, coincide con "ultimo". Si son distintas, realiza el da?o, y, tras el da?o, "utlimO" vale la id rival.
Esto significa que SIEMPRE QUE RECIBA ESE ATAQUE por primera vez, m?s espec?ficamente ese objeto concreto, ya que el ataque se realiza muchas veces, la primera vez siempre me da?a puesto que recibe no ser? igual que ultimo. Pero, tras da?arme, como ultimo valdr? igual que recibe, no funciona.
Un c?digo perfecto para que el ataque s?lo dale al rival una vez, pero a la vez el ataque pueda da?ar a varios rivales a la vez, ya que si destruyo el ataque despues de golpear, no podr? usarse para varios rivales a la vez, y ese no es el caso
La teoria es correcta, pero en la pr?ctica no funciona y le resta al rival toda la vida de golpe, como si le da?ara 10 veces seguidas. Qu? falla? D:
Cabe decir que tambi?n he hecho esto:
recibe=other.id;
if ultimo.id!=recibe.id {vida-=other.dano; ultimo=other.id;}
Checando, no la variable, sino la variable "id" de la variable, s?lo cuando checa y no cuando setea, ya que creo que se usaba as?, tomando a "recibe" como el objeto rival, y checando "id" del objeto rival a trav?s de la variable, pero tampoco funciona! Sigo mat?ndolo de un solo ataque!
no se, nunca he tenido problemas al hacer esto :) pero prueba lo siguiente
[gml]recibe = collision_rectangle(x-32,y-32,x+32,y+32,objataque,0,0);
//el x-32,y-32,x+32,y+32 ya depende del tama?o de tu personaje
if not (recibe){ exit; }
if (recibe.id != ultima.id){
vida -= recibe.dano;
ultima = recibe.id;
}[/gml]
mira haber si te sirve de algo :-[
Saludos.
EDIT: Aunque ahora que lo pienso presentaria problemas si lanzas dos ataques seguidos...
EDIT2: Para arreglar lo de ataques seguidos puedes hacer lo siguiente:
Con el objeto de ataque en create, creas un array y un indice
[gml]ataid = 0; //ids total de enemigos atacados
atacado[0] = 0; //Array de enemigos atacados[/gml]
luego en step:
[gml]var recibe, i;
recibe = collision_rectangle(x-32,y-32,x+32,y+32,objenemigo,0,0);
//el x-32,y-32,x+32,y+32 ya depende del tama?o de la bala
if not (recibe){ exit; }
for (i=0;i<=ataid;i+=1){
if (recibe.id != atacado){
recibe.vida -= dano;
atacado = recibe.id;
//Aumentamos y creamos un nuevo espacio en el array.
ataid += 1;
atacado[ataid] = 0;
}
}[/gml]
La verdad estoy improvisando, no lo he probado pero creo que funciona ;)
en el evento step no funciona el other por lo menos no para tu caso, amenos que agregues una colisi?n tal vez ya lo tengas solo que no lo publicaste, de ser as? seria bueno que lo pusieras aqu? para verificar el resto del c?digo involucrado, de lo contrario posiblemente este sea tu problema, saludos.
No, lo tengo bien, perd?n por explicarme mal xD lo que dije que puse en step lo tengo puesto en el evento COLISI?N contra ataque. Es decir, es un c?digo en el enemigo. O en mi caso.
Explico, los ataques son est?ticos. Son cuadrados quietos en el campo. Cuando alguien ataca, se crea ese objeto en el ataque. Y tanto yo como el enemigo podemos recibir esos ataques (claro, yo no recibo los m?os). As? que el evento se acciona en colisi?n del enemigo con mi objeto ataque.
Estoy analizando el c?digo de Jucarave para intentar entenderlo... xD En tu code, collision rectangle puede ser todo en x,y,x,y, ya que debe colisionar directamente para ser da?ado, siempre.
Pero, tu c?digo funciona si el ataque golpea en sus ultimos momentos? ya que el ataque dura 10 steps, y la cuesti?n es que da?e UNA VEZ si colisiona en cualquier momento... y con cualquier enemigo, una vez a cada enemigo... y sigo sin entender el c?digo del todo D:
Pero un momento, la explicaci?n que di no es v?lida, ya que.. si recibieras un ataque distinto, y luego de nuevo el otro ataque.. es decir, recibir un ataque X, luego Y y luego el mismo anterior X, no funcionar?a! Voy a intentar otra cosa, ya que mi explicaci?n no fue correcta
Edit: Lo he solucionado! lo consegu? haciendo una "base de datos" en el objeto ataque, es decir, unas 10 variables, donde, tras da?ar a un rival, la id del rival se guarda en esas variables, y antes de cada ataque checa que la id del rival no est? guardada, y si lo est?, es decir, si ese ataque ya ha golpeado al rival, no funciona! Ahora s? funcion? lo de id's en variables, es curioso...
Gracias por responder, pero se arregl? xD aunque la descripci?n que di estaba equivocada, puesto que con dos ataques a la vez, el m?todo fallaba, se necesitaba una base de datos, es decir, guardar TODAS las ids de rivales afectados por el ataque, y Jucarave, en tu m?todo, quiz?s hiciste como dije antes y no ir?a bien =S