IA seguimiento de personaje.

Started by gianfrancopintus, December 03, 2009, 07:31:25 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

gianfrancopintus

Hola, empeze hace poco con el Bennu y me surgio una duda que como nunca programe ningun juego no tengo la menor idea como resolverla.

Mi rama de procesos es asi:
PersonajePrincipal---llama a---Enemigo---llama a---disparoEnemigo.

Lo que me gustaria es que el disparoEnemigo sepa donde esta mi personaje principal y se mueva hacia el.
No hay obstaculos en el camino, todavia estoy con la pantalla negra de escenario.

Aqui les dejo el proceso disparoEnemigo:
PROCESS disparoEnemigo()          
BEGIN
   graph=42;                  
x=father.x;                
y=father.y;              
   flags=father.flags;        
LOOP                      
       graph=graph+1;        
       IF (graph>49)          
           graph=42;                
       END                        
       IF (flags==0)            
    x=x-8;              
       ELSIF (flags==1)        
           x=x+8;                
       END                    
IF ( collision ( type disparo ) )                
           BREAK;                                              
       END

IF ( collision ( type protagonista ) )
BREAK;
END

FRAME;                  
END                      
END        


Muchisimas gracias por su ayuda.

Gianfranco Pintus

DjSonyk

Prueba esto que es facilillo ...

Metelo en el proceso disparoEnemigo,quita todos los avances de X,y metelo dentro del LOOP

Angle=Get_Angle(Type protagonista);
Advance(X);  // X=a lo que tu quieras con tu ejemplo 8

lo unico que aunque sea facil te gira el grafico,pero tambien te valdria para quitar los flags ^^.Ya me contaras que tal te vale,ademas seguro que te ponen otros ejemplos mas practicos y complicados :P
Saludos

Windgate

Perfecta la solución de DjSonik, pruébala.

También hay una opción sencilla por simple diferencia de coordenadas entre la posición del prota y del disparo, si la diferencia es mayor se mueve en un sentido, y si no se mueve en el otro.

A esta última opción se le puede dar un comportamiento de "auténtico" misil teledirigido si lo que haces es incrementar unas variables velocidad_horizontal y velocidad_vertical según la diferencia entre coordenadas sea positiva o negativa. De esta forma, mientras la diferencia de coordenadas horizontales sea negativa la velocidad horizontal crecerá y crecerá, mientras que en caso contrario decrecerá y decrecerá.

No sé si has entendido este último método, pero los resultados son ACOJONANTES, si quieres ver un ejemplo de uso en vivo puedes descargar uno de mis proyectos de juego de aviones, That Huge Sardines Can in Roids y ver como los misiles te persiguen como posesos, aquí encontrarás la descarga:

http://trinit.es/descargas/
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

gianfrancopintus

Gracias DjSonyk, me sirvio mucho. Windgate suena muy interesante, ahora voy a ver tu videojuego e intentar implementar lo que decis.


Windgate

Ok, el módulo de misiles no lo hice yo, lo hizo Mephistoii666, un usuario que apenas pasa por el foro. De todas formas la idea de misil teledirigido da mucho juego, tú investiga y si tienes algo divertido súbelo sin dudarlo :D
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Futu-block

en el game-editor ponias ''go to'' x.type protagonista y.type protagonista...

¿hay en bennu algo parecido???

Windgate

GO TO... Eso es bastante sucio, no sé si en Bennu se mantiene algo así pero no lo usaría en absoluto.

Puedes obtener el ángulo entre los procesos con get_angle() y luego avanzar hacia el proceso con advance()... Creo recordar que en mi tutorial había ejemplos claros de eso...
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Futu-block

creo recordar ahora que era ''Move to'' para ir en linea recta, algo que tampoco valia mucho porque en un pong que estaba haciendo, para que la paleta del contrario siguiera solo en el eje Y a la pelota habia que poner un script, y eso tampoco adelantaba nada...

Windgate

No he usado GameMaker, pero me huele que no tiene nada que ver. Bennu es TODO código, puedes hacer lo que quieras, pero tienes que saber cómo expresarlo, hay multitud de funciones para ayudar en cada cosa, en particular el seguimiento yo veo 3 posibilidades:

1) Currar a pelo con la x,y para personalizar a tope lo que quieres a costa de echar más código.
2) get_angle ( ) para hacerlo sencillo y funcionando, la cosa seguirá la dirección correcta, en linea recta siempre.
3) Usar las funciones de IA, path_find ( ) aunque la verdad no es muy eficiente ni está bien hecha, pero funcionar funciona y es capaz de resolver laberintos.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Futu-block

es Game-editor y trabajaba en C, aunque en realidad es como hacer una interfaz grafica para Bennu donde puedas poner el graph donde quieras que el interfaz te lo interpreta y traduce a codigo + unas sencillas instrucciones (mover a, cambiar animacion, pulsar boton... ) que las volvia a traducir a codigo, una cosa practicamente inutil por lo menos para mi ya que no era nada facil hacer juegos como el pong...