Hola, pues te traigo lo prometido, Segui la idea que havia propuesto, creo que quedo bien, no se si querias un movimiento asi.Pero te dejo el video para que lo veas,
http://www.youtube.com/watch?v=2LDH0p1XURg, esta en baja la calidad por que el archivo en alta es demaciado grande.
pues hay va como lo hice. primero el codigo:
- Código: Seleccionar todo
#include<game.h>
#include<math.h>
bool nearmodul(float a, float b, float range)
{
if(a<b)
{
return ((b-a)<a+(range-b));
}
else
{
return ((a-b)>(b+(range-a)));
}
}
int main()
{
game g;
g.init_video(800,600,32);
g.scene.set_world("../images/terreno/path");
g.scene.add_sprite("../images/E-P8.854.png",1);
g.scene.add_actor(0,true,true);
g.scene.add_actor(0,true,true);
g.scene.set_posicion_actor(0,punto(300,200));
g.scene.set_posicion_actor(1,punto(200,350));
g.scene.set_actor_p_refer(0,punto(20,20));
g.scene.set_actor_p_refer(1,punto(20,20));
g.scene.entity_manager.actores[0]->object.add_punto(punto(7,3));
g.scene.entity_manager.actores[0]->object.add_punto(punto(29,2));
g.scene.entity_manager.actores[0]->object.add_punto(punto(29,12));
g.scene.entity_manager.actores[0]->object.add_punto(punto(37,13));
g.scene.entity_manager.actores[0]->object.add_punto(punto(37,27));
g.scene.entity_manager.actores[0]->object.add_punto(punto(30,28));
g.scene.entity_manager.actores[0]->object.add_punto(punto(29,37));
g.scene.entity_manager.actores[0]->object.add_punto(punto(7,37));
g.scene.entity_manager.actores[0]->object.add_punto(punto(7,3));
g.scene.entity_manager.actores[1]->object=g.scene.entity_manager.actores[0]->object;
bool done = true;
evento ev;
g.fps1=40;
int vel=0, ang=0,vel_p=0;
int cont=0;
punto scroll(0,0);
float angulo_p=0,retardo=0, angulo_parado=0;
while (done) {
ev.poll();
ev.get_states_key();
if(cont%3==0)
{
angulo_p=360-angulo_2point(g.scene.entity_manager.actores[0]->get_posicion().neg(),g.scene.entity_manager.actores[1]->get_posicion().neg());
if(vel_p==30)
{
if(abs(retardo-angulo_p)>1.5){
if(nearmodul(retardo,angulo_p,360))
{
retardo+=3;
if(retardo>360)retardo=0;
}else
{
retardo-=3;
if(retardo<0)retardo=360;
}
}
}
}
if (ev.test_state(SDLK_q)==true) done=false;
if (ev.test_state(SDLK_UP)==true) vel=60;
if (ev.test_state(SDLK_DOWN)==true) vel=-60;
if (ev.test_state(SDLK_w)==true)scroll.y-=1;
if (ev.test_state(SDLK_s)==true)scroll.y+=1;
if (ev.test_state(SDLK_a)==true)scroll.x-=1;
if (ev.test_state(SDLK_d)==true)scroll.x+=1;
if(cont%5==0){
if (ev.test_state(SDLK_LEFT)==true) ang+=4;
if (ev.test_state(SDLK_RIGHT)==true) ang-=4;
if (ev.test_state(SDLK_f)==true)
{
if(vel_p==0) {vel_p=30;retardo=angulo_parado;}
else {vel_p=0;angulo_parado=angulo_p;}
}
}
system("clear");
cout<<"Seek Behaivor\nF para activar desactivar perseguir"<<endl;
cout<<"Angulo entre los dos: "<< angulo_p<<"\nAngulo que se ajusta: "<<retardo<<endl;
g.scene.set_scroll_mapa(scroll);
g.scene.set_actor_vel(0,Vector(vel,ang));
g.scene.set_actor_vel(1,Vector(vel_p,vel_p?retardo:angulo_parado));
vel=0;
g.render();
g.time();
cont++;
}
}
pues la función nearmodul(float, float, float) evalua cual es la direccion mas corta para llegar a un numero que quiero, dentro de un rango de numeros, los cuales son como una lista circular, por ejemplo:
1,2,3,4,5,6,7,8,9
Si parto del 2 y quiero llegar al 8 es mas rapido recorrer 2,1,9,8 que 2,3,4,5,6,7,8
Esta funcion la uso para saber si debo sumar o restar una constante a retardo, cuado retardo es menor a 0 regresa a 360.
Esa comprobacion la hago solo cuando la diferencia entre los dos angulos es menor a 1.5, par que no se este tambalenado.
y el coche perseguidor lo muevo el angulo que lleva retardo, en esencia es llevar la variable retardo al valor del angulo entre los dos actores.
esta implementacion la hice con un motor de juegos propio, pero la parte importante es esta.
Ha lo que hace el coche perseguidor se le conoce como comportamientos, existen bibliotecas hechas para esta tarea, la unica que conozco es opensteer, pues creo que los desarrolladores crean sus propias funciones para manejar los comportamientos.y mi idea la tome de la forma en la que funcionan.
A cada actor se le puede agregar un comportamiento, en este caso seguir, pero que tal si quiero que varios coches lo sigan, para empezar debo evitar que los coche choquen entre ellos, lo cual es otro comportamiento, mantener una distancia, la funcion que realiza el comportamiento solo devuelve un vector,luego se la pasa a una funcion que priorise esos movimientos, para que el resultado sea, que sigua el coche, pero si alguno se hacerca demaciado se elejen sin perder el obejetivo principal que es seguir al coche.
Es muy interesante, el problema es que opensteer no tiene documentación y tampoco pude compilar sus fuentes y ejemplos, sin emvargo no es algo dificil de hacer, aver si alguien se une y hacemos una biblioteca de funciones para comportamientos
El conocimiento de unos es conocimiento de todos.