Buenas, pues llevo mucho rato intentando hacer la persecuci?n en vista cenital, y nada funciona! Y aclaro que NO ES ZOMBIE, osea, mi idea es que sea currado, que al principio est? parado, y para que te localice, debes ponerte delante, ya que su rango de visi?n es de 140 ? en total, ya me entend?is. Que no te ver? si est?s a su lado, tienes que ponerte un poco delante- Y una vez localizado, no quiero que siempre te esgt? mirando, sino que su direccion cambie a medida que no te est? mirando mientras se mueve hacia ti. Osea.. que no se mueva hacia ti, si no que se mueva donde diga su image angle, y su image angle siempre tiene que cambiar para mirar hacia ti. Digamos que si t? est?s a su derecha y ?l mira hacia arriba, ir? girando hacia la derecha poco a poco, moviendose hacia donde mire, y si mira hacia el lado contrario hacia ti, pues dar? un giro de 180?, no girar? directamente hacia ti. Tengo muchos problemas con ambos casos, de localizar y de perseguir XD os pongo todo el codigo que tengo. La verdad, el codigo de localizar, lo veo totalmente correcto, y el de mirarte igual, no s? que le pasa!!
obj_R es el personaje al cual debe localizar y perseguir el enemigo que tiene este codigo en STEP. variable "estado" indica si no te tiene "off" y si te tiene "sigue" para perseguirte.
//te localiza!
if estado="off" and !collision_line(x,y,obj_R.x,obj_R.y,obj_wall_total,1,1) and image_angle<point_direction(x,y,obj_R.x,obj_R.y)+70
and image_angle>point_direction(x,y,obj_R.x,obj_R.y)+290 and distance_to_object(obj_R)<300 {
estado="sigue";
}
if estado="sigue" {
if image_angle>point_direction(x,y,obj_R.x,obj_R.y) and image_angle<point_direction(x,y,obj_R.x,obj_R.y)+180 {image_angle-=5;}
if image_angle>point_direction(x,y,obj_R.x,obj_R.y)+180 and image_angle<point_direction(x,y,obj_R.x,obj_R.y) {image_angle+=5;}
direction=image_angle;
if distance_to_object(obj_R)>20 {
speed=velo; sprite_index=spr_I_run;
}
if distance_to_object(obj_R)<=20 {
speed=0; sprite_index=spr_I_still;
}
} else {speed=0;}
Replanteo la duda a?adiendo este dibujito
(http://fotos.subefotos.com/5eeeb8ffcdc21274c056871d35161db4o.png)
Digamos que ?se es el enemigo (aunque se parezca al prota de mi juego xD)
Entonces, ?l tiene su image_angle, y luego el point direction entre ?l y mi personaje. Entonces, me localiza si entro en su rango de visi?n amarillo, que ser?a de 140? totalmente, a una distancia de... pongamos, 300. As?, checando si entro en su rango de 140? y a esa distancia, tengo su rango de visi?n. Yo tengo esta idea de c?digos:
if image_angle<point_direction(x,y,obj_R.x,obj_R.y)+70 and image_angle>=point_direction(x,y,obj_R.x,obj_R.y)
En teor?a, con ese c?digo, deber?a localizarme si entro en su rango de visi?n izquierdo. Si mira a la derecha (image_angle=0) deber?a localizarme si estoy entre delante y arriba, osea, si estoy entre sus 70? delanteros, y deber?a hacer igual para abajo, pero NO FUNCIONA NADA!! Porqu? no reacciona?
Y tampoco funciona cuando quiero que se gire hacia m?. Teni?ndome localizado, deber?a girarse hacia mi poco a poco. Vamos, que si lo tengo mirando justo hacia atr?s, se gire hacia cualquier direcci?n, pero si lo tengo, ?l a la izquierda, por ejemplo, yo a la derecha, y ?l mira hacia arriba, se girar?a contra ?ngulo, hacia la derecha. y si ?l mirara hacia abajo, se girar?a hacia la izquierda. Vamos, que se gire seg?n el camino m?s corto. usando point_direction, y tampoco funciona, cuando yo veo los c?digos supercorrectos! Qu? hago mal al usar esta funci?n? S?lo quiero que me localice si me pongo delante y que se gire hacia m? :'( vamos, no hacer que inmediatamente siempre est? mirandome, sino que se gire poco a poco tras localizarme, pero no funciona nada
En el caso de los ?ngulos, el problema esta en que el GM arregla los ?ngulos por encima de 360 y por debajo de 0, por ejemplo, en los casos donde, por ejemplo el enemigo mira hacia 345 y el objeto a mirar esta hacia 20, el GM retroceder? los 325 grados hacia 20 en lugar de avanzar los 35 grados hacia el mas cercano 380, simplemente porque para el GM 380 no se encuentra en el rango aceptable de grados.
Debes manejar los ?ngulos en variables apartes para evitar que el GM los altere. Te dejo un ejemplo.
No mir? el ejepmlo de Killer, que seguramente sea suficiente para resolver el problema, pero siento que necesito decirte esto.
Si la variable "estado" s?lo tiene dos posibles valores ("on" y "off"), definitivamente deber?as cambiarlos por true y false.
En teor?a, una variable booleana (es decir de true o false) ocupa un bit en memoria, mientras que un string ocupa un byte por cada caracter. Como un byte vale 8 bits, b?sicamente esa variable est? gastando 16 veces m?s memoria de lo que deber?a (y el n?mero aumenta a 24 cuando vale "off"). Adem?s estoy casi seguro que debido a la forma en la que el GM guarda los strings en memoria, esos n?meros se duplican.
No te digo que tu juego vaya a quedar super optimizado por hacer esto, pero ser?a lo ideal.
Con la variable "estado" pasa lo mismo, aunque en menor medida (lo ideal ser?a definir constantes, una para cada estado, cada una con un valor entero distinto).
Y me callo, que esto est? bastante off topic ;P.
Wadk, tienes raz?n en eso, pero la raz?n por la que la variable estado tiene string y no es booleana, es porque en mi anterior juego ten?a el estado, aparte de off y sigue, "perdido" y "buscando", para cuando escapabas y te buscaba, y estoy pensando en implantarlo aqu?
Killer, el ejemplo es genial, gracias!! He conseguido implantarlo bastante bien, de momento no me di? fallos. S?lo unas cuestiones...
Siempre gira en sentido horario. Imagina, que alomejor, estoy un poco a su izquierda, y el enemigo realiza una vuelta entera para encontrarme, pudiendo hacer un peque?o paso al lado contrario. Osea, que gire hacia donde sea m?s corto el giro, dependiendo de su image angle y el point direction, c?mo lo har?a? ?se es uno de los fallos que ten?a >_<
Y bueno... de momento lo b?sico lo tengo bien. Aunque, claro... cuando haga muros, osea, que el enemigo te persiga... de momento, tengo puesto, que si est? lejos, se mueve hacia ti con speed. Y tambien el giro. Tengo controlados que gire y vaya hacia mi una vez me ha localizado. S?lo me faltar?a el tema de que me persiga esquivando muros, y que, quizas, tras perderme tras un muro, guarde mi ?ltima posicion, y se diriga a esa posici?n y no a la m?a, y al llegar se para, y si no me encuentra en unos segundos, el estado pasa a off (yo pondr?a estado="perdido" que indica que se mover?a a la ?ltima posici?n conocida de m?, y estado="buscando" en el tiempo que tarde, o algo as?). Pienso que se podr?a implementar. AUnque lo de ir esquivando muros, es un tema a parte que si no encuentro nada puedo preguntar, recuerdo que Kakashigna me dio un codigo bueno hace mucho para el Multipurpose mechanical pen, que no pude usar, que ahora quizas me vendr?a bien, pero por m?s que lo he buscado no lo he encontrado...
bueno, de momento esto solucionado, pero lo que te dije, c?mo hacer que gire hacia al direcci?n para la cual el giro sea m?s corto?
Pienso que seg?n su image angle y el point direction, pero no me funcion?...
Me extra?a que digas que siempre gira en sentido horario, lo primero que hace uno de los enemigos en el ejemplo es girar antihorariamente hacia ti, el objetivo primordial del script scr_Encarar es que el objeto rote hacia ti por el lado mas corto posible.
De hecho, es imposible que el objeto de una vuelta entera para tratar de encararte, puesto que eso implicaria que el objeto saldria de su rango de vision y dejaria de perseguirlo.
O tal vez no he entendido a que te refieres.
Precisamente me refiero a que, en mi caso, el c?digo no se aplica del todo: una vez me localiza, no necesito estar en su rango de visi?n, aunque salga me sigue persiguiendo. Vamos, que el c?digo del rango de visi?n hace localizarme, y una vez me tiene y asigna la variable, no necesito estar en su rango de visi?n para que venga a por m?, es por ello que da vuelta completa... esque implementarlo ha sido distinto. Y el de perder me sale raro, he conseguido que, al hacer un wall entre medio, vaya hasta el ultimo punto conocido y se pare, y me pierde; y si me vuelve a ver, vuelva a perseguirme, pero funciona raro, a veces hace el tonto y no me persigue o sale un error raro.. X_X el ejemplo es buenisimo, pero como el caso no es exactamente el mismo, quiz?s fall? en algo en aplicarlo.