Registrarse Buscar FAQ Miembros Grupos de Usuarios Login  
Responder al tema Sonar.DLL
Sonar.DLL
sr.whiteskull
Experto
Experto

Registrado: 23 Mar 2006
Mensajes: 281
Ubicación: Ni aqui ni alli
Responder citando
Código de la función Sonar hecha en C
Sonar.CPP
Código:

#include <windows.h>

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
   return 1;
}
//---------------------------------------------------------------------------
#define Funcion extern "C" __declspec ( dllexport)
//--------------------------------------------------------------------------

// Veo una tontería q Sonar y Ruta vayan separados, el uno sin el otro
// no hacen nada...
int Ruta (int *membID)
{

   unsigned int Ruta_Ancho=(*membID);
   const int Cabezera=7;
   int x=*(membID+4), z=*(membID+5);
   int n1,n2,n3,n4,n5,n6,n7,n8;

   int c=0,d=0,min=99999;
   while (c<=1)
   {
      // Lo se, q si es mejor un bucle
      n1=*(membID+(Cabezera+((z+1)*Ruta_Ancho+x    )));
      n2=*(membID+(Cabezera+((z-1)*Ruta_Ancho+x    )));
      n3=*(membID+(Cabezera+( z   *Ruta_Ancho+(x-1))));
      n4=*(membID+(Cabezera+( z   *Ruta_Ancho+(x+1))));
      n5=*(membID+(Cabezera+((z+1)*Ruta_Ancho+(x-1))));
      n6=*(membID+(Cabezera+((z-1)*Ruta_Ancho+(x+1))));
      n7=*(membID+(Cabezera+((z+1)*Ruta_Ancho+(x+1))));
      n8=*(membID+(Cabezera+((z-1)*Ruta_Ancho+(x-1))));
      c=0; d=0; min=99999;
      if (n1==-2) return 1; else if (n1>0 && n1<min) { min=n1;d=1; };
      if (n2==-2) return 1; else if (n2>0 && n2<min) { min=n2;d=2; };
      if (n3==-2) return 1; else if (n3>0 && n3<min) { min=n3;d=3; };
      if (n4==-2) return 1; else if (n4>0 && n4<min) { min=n4;d=4; };
      if (n5==-2) return 1; else if (n5>0 && n5<min) { min=n5;d=5; };
      if (n6==-2) return 1; else if (n6>0 && n6<min) { min=n6;d=6; };
      if (n7==-2) return 1; else if (n7>0 && n7<min) { min=n7;d=7; };
      if (n8==-2) return 1; else if (n8>0 && n8<min) { min=n8;d=8; };
      if (d==1) z++;
        else if (d==2) z--;
          else if (d==3) x--;
            else if (d==4) x++;
               else if (d==5) { x--;z++; }
                 else if (d==6) { x++;z--; }
                    else if (d==7) { x++;z++; }
                      else if (d==8) { x--;z--; };
      *(membID+(Cabezera+(z*Ruta_Ancho+x)))=99999;
      c++;
   };
   return 0;
}

Funcion int Sonar (int *membID)
{
/*
   // Así se empezó... no tenía claro algunos conceptos, ya
   // q en DBpro un puntero se incrementa de byte en byte como
   // había dicho Dung3on... por eso hay q multiplicarlo por 4
   // mientras q en C si declaro el puntero como entero pues
   // logicamente se incrementa de 4 en 4, aunq la suma sea con
   // valor de 1

   *membID  =1;
   *(membID+1)=2;
   *(membID+2)=3;
   *(membID+3)=4;

   const unsigned int Sonar_Ancho=(*membID)-1;
   const unsigned int Cabezera=7;
   for (int x=0; x <= Sonar_Ancho; x++)
   {
      //for (int y=0; y<=Sonar_Ancho; y++)
      //{
         *(membID+(Cabezera+(0*Sonar_Ancho+x)))=99999;
      //}
   }
*/
   const unsigned int Sonar_Ancho=(*membID);
   int nodoZ[62500], nodoX[62500];
   const int Cabezera=7;
   int paso=0,p,p_ini=1,p_fin=1,p_ant=1,p_encontrados;
   nodoX[1]=*(membID+2);// Origen X
   nodoZ[1]=*(membID+3);// Origen Z
   // Cooordenadas
   int x,z,x_a,x_s,z_a,z_s;
   int Rz_s,Rz_a,Rz;
   int zs_x, za_x, z_xa, z_xs, zs_xa, za_xs, zs_xs, za_xa;

   // Bucle infinito de búsqueda
   Repite:
      p_encontrados=0;
      paso++; *(membID+6)=paso;
      p=p_ini;
      do
      {
        x=nodoX[p]; z=nodoZ[p];
        x_a=x-1;x_s=x+1;
        z_a=z-1;z_s=z+1;
        Rz_s=z_s*Sonar_Ancho;
        Rz_a=z_a*Sonar_Ancho;
        Rz  =z*Sonar_Ancho;
        zs_x =Cabezera+(Rz_s+x  ); if (*(membID+zs_x )==-1) { Ruta(membID); return 1; };
        za_x =Cabezera+(Rz_a+x  ); if (*(membID+za_x )==-1) { Ruta(membID); return 1; };
        z_xa =Cabezera+(Rz  +x_a); if (*(membID+z_xa )==-1) { Ruta(membID); return 1; };
        z_xs =Cabezera+(Rz  +x_s); if (*(membID+z_xs )==-1) { Ruta(membID); return 1; };
        zs_xa=Cabezera+(Rz_s+x_a); if (*(membID+zs_xa)==-1) { Ruta(membID); return 1; };
        za_xs=Cabezera+(Rz_a+x_s); if (*(membID+za_xs)==-1) { Ruta(membID); return 1; };
        zs_xs=Cabezera+(Rz_s+x_s); if (*(membID+zs_xs)==-1) { Ruta(membID); return 1; };
        za_xa=Cabezera+(Rz_a+x_a); if (*(membID+za_xa)==-1) { Ruta(membID); return 1; };
        if (*(membID+zs_x )==0) { p_encontrados++; *(membID+zs_x )=paso; nodoX[p_fin+p_encontrados]=x  ; nodoZ[p_fin+p_encontrados]=z_s; };
        if (*(membID+za_x )==0) { p_encontrados++; *(membID+za_x )=paso; nodoX[p_fin+p_encontrados]=x  ; nodoZ[p_fin+p_encontrados]=z_a; };
        if (*(membID+z_xa )==0) { p_encontrados++; *(membID+z_xa )=paso; nodoX[p_fin+p_encontrados]=x_a; nodoZ[p_fin+p_encontrados]=z  ; };
        if (*(membID+z_xs )==0) { p_encontrados++; *(membID+z_xs )=paso; nodoX[p_fin+p_encontrados]=x_s; nodoZ[p_fin+p_encontrados]=z  ; };
        if (*(membID+zs_xa)==0) { p_encontrados++; *(membID+zs_xa)=paso; nodoX[p_fin+p_encontrados]=x_a; nodoZ[p_fin+p_encontrados]=z_s; };
        if (*(membID+za_xs)==0) { p_encontrados++; *(membID+za_xs)=paso; nodoX[p_fin+p_encontrados]=x_s; nodoZ[p_fin+p_encontrados]=z_a; };
        if (*(membID+zs_xs)==0) { p_encontrados++; *(membID+zs_xs)=paso; nodoX[p_fin+p_encontrados]=x_s; nodoZ[p_fin+p_encontrados]=z_s; };
        if (*(membID+za_xa)==0) { p_encontrados++; *(membID+za_xa)=paso; nodoX[p_fin+p_encontrados]=x_a; nodoZ[p_fin+p_encontrados]=z_a; };
        p++;
      } while (p<=p_fin);
      if (p_encontrados>>0)
      {
        p_ini=p_ini+p_ant;
        p_fin=p_ini+p_encontrados-1;
        p_ant=p_encontrados;
      } else return 2;
   goto Repite;
}


Sonar.RC
Código:

stringtable
{
        1,"SONAR[%LL%_Sonar%Int"
}



Sonar.rar
 Descripcion:

Descargar
 Nombre del archivo:  Sonar.rar
 Tamaño:  47.58 KB
 Descargado:  229 veces

Ver perfil de usuarioBuscar todos los mensajes de sr.whiteskullEnviar mensaje privadoEnviar emailVisitar sitio web del autor
Habatar
Moderador
Moderador

Registrado: 29 Nov 2005
Mensajes: 650
Ubicación: Madrid
Responder citando
El código está interesante. Tengo que repasarmelo cuando tenga más tiempo.

Pero una cosa, ¿para que vale? Tanto tiempo que ya no me acuerdo.
Ver perfil de usuarioBuscar todos los mensajes de HabatarEnviar mensaje privado
Pasky
Experto
Experto

Registrado: 29 Nov 2005
Mensajes: 880
Ubicación: Alicante
Responder citando
JAJAJAJA...Habatar...mas matao.Laughing

Eso era antes un codigo en DBP para buscar rutas desde un punto A hasta un punto B usando una cuadricula (tabla de nodos) en la que se ha marcado que cuadriculas son transitables y cuales no.
Entonces un algoritmo busca el camino mas rapido desde A a B pasando por cuadriculas transitables y evitando las que no.
Ese algoritmo desarrollado en DBP era rapido, pero en C ya es la repera.

La declaracion de la cuadricula (tamaño) y la marcacion de los nodos no transitables corre por cuenta del programador en DBP. La DLL solo sirve para buscar la ruta. Le falta una cosilla pero ya se la pondremos.
Le falta que nos deje en algun sitio la cuadricula a la que hay que dar el siguiente paso.

Por cierto, es muy dificil optimizar un codigo en c++, vale?
Sobre todo cuando no se sabe C.
Aun asi he conseguido bajar bastante los tiempos (no espereis milagros) entre un 25 y 50%.
Estoy ahora trabajando en una version mas definitiva y en una demo en DBP mas real de lo que seria una aplicacion de la DLL.
Hasta que no haga trabajar a la DLL de seguido, llamandola dentro de un bucle, como se haria en un programa real, no sabre los tiempos medios reales de ejecucion.
Hablo de tiempos medios porque he incorporado una variable tipo "register" y dependiendo de que este disponible o no el registro, la rutina tarda mas o menos.
Tambien le he dicho al compilador que optimize al maximo la compilacion (a base de toquetearlo todo se va uno enterando de cosas), y eso me hace temer por las compatibilidades.

Bueno, cuando tenga algo visible ya lo subo.

Tal vez Habatar, sin querer, ha tocado el "quit" de la cuestion.
¿Para que sirve?
Tal vez para nada. Tal vez para mucho.
Pero era una cuestion que estaba ahi esperando una respuesta. Un reto.
La red y los foros de programacion estan llenos de este tipo de rutinas.
Cada vez que sacan una dicen que es la mejor y mas facil.
Bueno, pues ahora yo digo que esta es la mejor y la mas facil.
No me siento culpable de desear mi segundo de gloria (un segundo compartido, por supuesto).

Y ademas, y sobre todo, está lo bien que me lo estoy pasando con todo esto.
Y aprendiendo.
Que el C++ se aprende asi, a tortazos, cuando no hay otros medios.

El Pathfinding es como el K2.
Y un grupo de al filo de lo imposible de www.darbasic.es ha coronado su cima.
He dicho.


Laughing Laughing Laughing Laughing Laughing


(Como me gusta lo melodramatico, xD)

Hasta lueguito.
Ver perfil de usuarioBuscar todos los mensajes de PaskyEnviar mensaje privadoEnviar emailVisitar sitio web del autor
Habatar
Moderador
Moderador

Registrado: 29 Nov 2005
Mensajes: 650
Ubicación: Madrid
Responder citando
JaJaJA Razz
Si, ahora ya me he acordado de todo. Very Happy.
Estos lapsus que me dan...
Ver perfil de usuarioBuscar todos los mensajes de HabatarEnviar mensaje privado
sr.whiteskull
Experto
Experto

Registrado: 23 Mar 2006
Mensajes: 281
Ubicación: Ni aqui ni alli
Responder citando
AH ok... claro... es verdad en las declaraciones, en algunas, puedes poner register, utilizando los registros directamente... cuando estén libres, cierto se gana mucha velocidad Pasky...es q eres un crack optimizando macho... te voy a llevar el coche pa q le saques un par de caballos más...

*sobre todo, gana montón en los bucles... ejem:
Código:

 for (register int x=0;x<=100...
Ver perfil de usuarioBuscar todos los mensajes de sr.whiteskullEnviar mensaje privadoEnviar emailVisitar sitio web del autor
una Pregunta tonta.
Epocem
Iniciado
Iniciado

Registrado: 16 Dic 2006
Mensajes: 15
Ubicación: Cali - Colombia
Responder citando
Yo soy nuevo en DBPro, estoy entrando en la parte pathfinding, quisiera saber como usar esta dll para mi juego.

El juego es un fps, ya controlo bien las camaras, con ayuda de chafari pude colisionar.... ahora necesito saber como hago para que los enemigos (hechos en 3Ds Max) me busquen y posteriormente me disparen.

Si no es mucho pedir, le pido el favor me guien en este campo... ya he visto el radr de sonar, pero la verdad no le he podido atinar a este....

De ante mano gracias.

_________________
La Batalla No Es Contra Otros, Es Contra Uno Mismo
Ver perfil de usuarioBuscar todos los mensajes de EpocemEnviar mensaje privadoEnviar emailYahoo MessengerMSN Messenger
DarkSoul
Experto
Experto

Registrado: 04 Jul 2008
Mensajes: 224
Responder citando
Buenas, estoy haciendo algunas pruebas de pathfinding intentando usar varios metodos y combinaciones (en DBpro, nada de dlls). Me gustaría ver el código de Sonar pero el que se hizo primero en DBpro (creo que en un principio se creó en DBpro, ¿no?), si alguien lo tiene por ahí, agradecería que me lo pasara, lo he buscado pero no lo encuentro por ningún sitio.

Un saludo

_________________
Dark Empire Studios
Ver perfil de usuarioBuscar todos los mensajes de DarkSoulEnviar mensaje privado
Pasky
Experto
Experto

Registrado: 29 Nov 2005
Mensajes: 880
Ubicación: Alicante
Responder citando
Para DBP aqui esta el codigo, pero no te lo recomiendo, salvo que lo quieras estudiar para pasarlo a otro lenguaje de programacion.
http://www.telefonica.net/web2/paskyprog/rutina4/rutina004.html
En ese enlace lo mas util es el manual sobre Sonar, para saber que es y como funciona.

Para descargar los ejemplos con la DLL ves a:
http://www.telefonica.net/web2/paskyprog/Sonar/Sonar.html

Salu2.
Ver perfil de usuarioBuscar todos los mensajes de PaskyEnviar mensaje privadoEnviar emailVisitar sitio web del autor
DarkSoul
Experto
Experto

Registrado: 04 Jul 2008
Mensajes: 224
Responder citando
Muchas gracias Pasky. Tan solo quiero estudiar el código, estoy intentando "mezclar" varios sistemas de pathfinding, agregando lo mejor de cada uno y tal (un simple experimento) y finalmente si tengo algo de más tiempo, pasarlo a una dll hecha en C++. Sobre lo de que no me recomiendas usar la rutina en DBP, ¿puede deberse a que es lenta? (supongo que sí es así dependiendo el fin con el que se vaya a usar). En fin..., si sigo con el experimento, expondré aquí la dll.

Un saludo y gracias de nuevo!

_________________
Dark Empire Studios
Ver perfil de usuarioBuscar todos los mensajes de DarkSoulEnviar mensaje privado
Sonar.DLL
Puede publicar nuevos temas en este foro
Puede responder a temas en este foro
No puede editar sus mensajes en este foro
No puede borrar sus mensajes en este foro
No puede votar en encuestas en este foro
Puede adjuntar archivos en este foro
Puede descargar archivos de este foro
Todas las horas son GMT + 1 Hora  
Página 1 de 1  

  
  
 Responder al tema  
Powered by phpBB © phpBB Group
Design by phpBBStyles.com | Styles Database .
Content © www.darkbasic.es