Logo

¡Bienvenido a Stratos!

Acceder

Foros



Menu

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menu

Mensajes - StarAD

#31
Modelado / Juntar un plano con un modelo
28 de Julio de 2007, 12:56:30 PM
Hola a todos!

Es la primera vez que posteo en el foro de modelado, espero que me podais ayudar. Ahi va: Imaginemos que tenemos un modelo creado y queremos añadirle una capa(royo superman) que sea un plano. Cuando intento utilizar Target Weld con los vertices del plano con el modelo no sucede nada. Tambien he intentado crear la capa a partir de seleccionar las aristas y utilizar shift y desplazarlo y tampoco sucede nada. No se si ha quedado muy claro lo que quiero preguntar. Por si acaso aqui esta una imagen para ayudar a entenderlo:



Solo he conseguido algo parecido a lo que quiero hacer utilizando extrude edge.

Muchas gracias !
#32
Programación en red / Reducir el tiempo de respuesta
23 de Junio de 2007, 08:31:21 PM
Hola:

Soy yo otra vez. Despues de buscar en el foro y en otras pgs he visto sistemas de predicion de posicion. Supongo que me tendre que currar mas el sistema. Aunque todavia me sigue pareciendo excesivo el tiempo en que tarda en recivir la respueta el cliente. Es normal que tarde tanto? o es devido a que se pierden paquetes?

Gracias otra vez.
#33
Programación en red / Reducir el tiempo de respuesta
23 de Junio de 2007, 05:07:50 PM
Hola:

Hace poco abri un post para preguntar que libreria podia utilizar para un juego de 2 players donde uno hacia de servidor y otro de cliente:

http://www.stratos-ad.com/forums3/viewtopic.php?t=8791

Después de pelearme con la libreria SDL_Net he conseguido implementarlo. El jugador que hace de servidor hace los calculos de la posicion y la envia al cliente, y el cliente envia los inputs de teclado y mouse. He conseguido que funcione, pero el problema es que desde que envias la peticion desde el cliente para moverte hasta que llega la posicion y se mueve el personaje puede pasar hasta 5-10 seg. Supongo que el error sera de codigo o diseño ya que lo he probado en mi red local de casa conectandome por la direccion interna de la red y tarda la mismo. Otro problema que he notado es que cuando se mueve no se mueve fluido , se mueve como a trompicones. Hay algun método para hacer el movimiento más fluido.

En cuanto al diseño he creado dos clases (Singletons), una para el cliente y otra para el servidor donde tienen guardado los sockets, las direcciones ip y  los datos compartidos de las posiciones e inputs. Esta dos clases crean un nuevo thread uno para el cliente y otro para el servidor y pasan como parametros ellos mismos. Mediante un semaforo van actualizando los datos compartidos y el juego va leyendo las posiciones. Os pongo el codigo de los threads para ver si sabeis donde puede estar el problema o, si no es problema de implementacion, alguna idea para reducir el tiempo de respuesta.


int listenServer(void* punt)
{
NetServer* net = static_cast<NetServer*>(punt);
UDPpacket* ini;
UDPpacket* outi;
tcFloatSend tc;
tcFloatSend* tcfs;
IPaddress ip;
char datos[sizeof(tcFloatSend)];
if(!(ini=SDLNet_AllocPacket(sizeof(tcFloatSend))))
{
net->setError();
Ogre::LogManager::getSingletonPtr()->logMessage("Error al crear el paquete de entrada");
}
if(!(outi=SDLNet_AllocPacket(sizeof(tcFloatSend))))
{
net->setError();
Ogre::LogManager::getSingletonPtr()->logMessage("Error al crear el paquete de salida");
}
outi->channel=-1;
SDLNet_ResolveHost(&ip,SDLNet_ResolveIP(net->getRemoteIP()),5426);
outi->address.host = ip.host;
outi->address.port = ip.port;
outi->len=sizeof(tcFloatSend);
ini->len=sizeof(tcFloatSend);
while(!net->getStop())
{
SDL_Delay(50);
if(0<SDLNet_UDP_Recv(net->getSockUDPR(),ini))
{
memcpy(datos,ini->data,ini->len);
tcfs=(tcFloatSend*)datos;
Ogre::LogManager::getSingletonPtr()->logMessage("Recibo algo "+Ogre::StringConverter::toString(tcfs->tip));
if(tcfs->tip==TRANS2){
Ogre::LogManager::getSingletonPtr()->logMessage("Recibo TRANS2");
while(net->getDatos()->getSemaforo())
{
SDL_Delay(1);
}
net->getDatos()->setSemaforo(true);
net->getDatos()->setTrans2(tcfs->x1,tcfs->y1,tcfs->z1);
net->getDatos()->setOrient2(tcfs->x2,tcfs->y2,tcfs->z2,tcfs->w2);
net->getDatos()->setSemaforo(false);
}
}
while(net->getDatos()->getSemaforo())
{
SDL_Delay(1);
}
net->getDatos()->setSemaforo(true);
tc.tip = POS1;
tc.x1 = net->getDatos()->getPos1()->x;
tc.y1 = net->getDatos()->getPos1()->y;
tc.z1 = net->getDatos()->getPos1()->z;
tc.x2 = net->getDatos()->getOrient1()->x;
tc.y2 = net->getDatos()->getOrient1()->y;
tc.z2 = net->getDatos()->getOrient1()->z;
tc.w2 = net->getDatos()->getOrient1()->w;
memcpy(outi->data,(Uint8*)&tc,outi->len);
SDLNet_UDP_Send(net->getSockUDPS(),-1,outi);

tc.tip = POS2;
tc.x1 = net->getDatos()->getPos2()->x;
tc.y1 = net->getDatos()->getPos2()->y;
tc.z1 = net->getDatos()->getPos2()->z;
tc.x2 = net->getDatos()->getOrient2()->x;
tc.y2 = net->getDatos()->getOrient2()->y;
tc.z2 = net->getDatos()->getOrient2()->z;
tc.w2 = net->getDatos()->getOrient2()->w;
memcpy(outi->data,(Uint8*)&tc,outi->len);
SDLNet_UDP_Send(net->getSockUDPS(),-1,outi);
net->getDatos()->setSemaforo(false);
}
SDLNet_FreePacket(ini);
SDLNet_FreePacket(outi);
Ogre::LogManager::getSingletonPtr()->logMessage("Acabando el thread de comunicacion.");
return 0;
};

int listenClient(void* punt)
{
NetClient* net = static_cast<NetClient*>(punt);
UDPpacket* ini;
UDPpacket* outi;
tcFloatSend tc;
tcFloatSend* tcfs;
IPaddress ip;
char datos[sizeof(tcFloatSend)];
if(!(ini=SDLNet_AllocPacket(sizeof(tcFloatSend))))
{
net->setError();
Ogre::LogManager::getSingletonPtr()->logMessage("Error al crear el paquete de entrada");
}
if(!(outi=SDLNet_AllocPacket(sizeof(tcFloatSend))))
{
net->setError();
Ogre::LogManager::getSingletonPtr()->logMessage("Error al crear el paquete de salida");
}
outi->channel=-1;
SDLNet_ResolveHost(&ip,SDLNet_ResolveIP(net->getRemoteIP()),5426);
outi->address.host = ip.host;
outi->address.port = ip.port;
outi->len=sizeof(tcFloatSend);
ini->len=sizeof(tcFloatSend);
while(!net->getStop())
{
SDL_Delay(50);
if(0<SDLNet_UDP_Recv(net->getSockUDPR(),ini))
{
memcpy(datos,ini->data,ini->len);
tcfs=(tcFloatSend*)datos;
Ogre::LogManager::getSingletonPtr()->logMessage("Recibo algo "+Ogre::StringConverter::toString(tcfs->tip));
if(tcfs->tip==POS1){
Ogre::LogManager::getSingletonPtr()->logMessage("Recibo POS1");
while(net->getDatos()->getSemaforo())
{
SDL_Delay(1);
}
net->getDatos()->setSemaforo(true);
net->getDatos()->setPos1(tcfs->x1,tcfs->y1,tcfs->z1);
net->getDatos()->setOrient1(tcfs->x2,tcfs->y2,tcfs->z2,tcfs->w2);
net->getDatos()->setSemaforo(false);
}else if(tcfs->tip==POS2){
Ogre::LogManager::getSingletonPtr()->logMessage("Recibo POS2");
while(net->getDatos()->getSemaforo())
{
SDL_Delay(1);
}
net->getDatos()->setSemaforo(true);
net->getDatos()->setPos2(tcfs->x1,tcfs->y1,tcfs->z1);
}
}
while(net->getDatos()->getSemaforo())
{
SDL_Delay(1);
}
net->getDatos()->setSemaforo(true);
tc.tip = TRANS2;
tc.x1 = net->getDatos()->getTrans2()->x;
tc.y1 = net->getDatos()->getTrans2()->y;
tc.z1 = net->getDatos()->getTrans2()->z;
tc.x2 = net->getDatos()->getOrient2()->x;
tc.y2 = net->getDatos()->getOrient2()->y;
tc.z2 = net->getDatos()->getOrient2()->z;
tc.w2 = net->getDatos()->getOrient2()->w;
outi->len=sizeof(tcFloatSend);
memcpy(outi->data,(Uint8*)&tc,outi->len);
SDLNet_UDP_Send(net->getSockUDPS(),-1,outi);
net->getDatos()->setSemaforo(false);
}
Ogre::LogManager::getSingletonPtr()->logMessage("Acabando el thread de comunicacion.");
return 0;
};


Aqui os pongo el struct que utilizo para enviar los datos:

struct tcFloatSend{
int tip;
float x1,y1,z1;
float x2,y2,z2,w2;
};


Muchas gracias.
#34
Programación en red / 2Players Servidor/Cliente
12 de Junio de 2007, 01:27:41 PM
Hostias!

Merci, ni se me habia pasado por la cabeza. xDD

Gracias!!
#35
Programación en red / 2Players Servidor/Cliente
31 de Mayo de 2007, 12:13:47 PM
Hola:

Al final me he decidido a utilizar la libreria SDL_net. Llevo dias haciendo pruebas y ya he conseguido hacer un servidor y un cliente, pero hay una duda que me corroe.

Para crear la direccion ip utilizo la funcion SDLNet_ResolveHost y le paso la direccion del objeto IPAddress, NULL para el servidor y el puerto. El problema lo tengo con el puerto. Mirando en la documentación y en los ejemplos de la web he visto que para añadir un puerto lo añade haciendo una conversion a Uint16 y para sacarlo por pantalla lo lee tal cual. Si yo hago eso cuando lo voy a leer me sale un numero de puerto que no tiene nada que ver con el que he puesto. Consegui resolver el problema haciendo un conversion a Big Endian con la funcion SDL_SwapBE16 a la hora de añadir el puerto. Todo esto me sirvio para un programa de prueba. Pero ahora que lo estoy implementando en el proyecto del juego me peta y me dice esto   : Couldn't bind to local port.

Ahi van mis preguntas: Porque tengo que hacer un conversion de Little Endian a Big Endian para que me salga el puerto correcto?
Si yo le pongo el puerto 5425 al crear la ip y luego me enseña por pantalla con el print el puerto 12565, en cual de los dos puertos esta escuchando? El problema esta solo al escribirlo por pantalla y de verdad esta escuchando en el puerto 5425?

Espero que me podais ayudar porque es algo que por muchas vueltas y pruevas que hago no llego a nada concluyente.

Gracias por las respuestas.=)
#36
Programación en red / 2Players Servidor/Cliente
23 de Mayo de 2007, 08:40:39 PM
Gracias por responder tan rapido.

Para mi juego utilizo Ogre3D (C pus pus).

Creo que me mirare la biblioteca SDL_net ya que da la casualidad que ahora mismo acabo de venir de la universidad de hacer una practica sobre shockets en UNIX. :D . No es que conozca todos los detalles sobre programacion con shockets asi que de paso me mirare los articulos.

Muchas gracias!

PD: Coño!! Hemos posteado a la vez!! Pues muchas gracias por el codigo y los links. Ya posteare a ver cual he utilizado y como me ha ido.=)
#37
Programación en red / 2Players Servidor/Cliente
23 de Mayo de 2007, 12:54:30 PM
Hola:

Llevo tiempo preparando un juego para dos jugadores en red, donde una maquina crea la partida y otro se conecta a este. Despues de un tiempo haciendo el sistema de juego y los graficos ya tengo el juego casi listo para empezar a crear el sistema de red. La verdad es que en el tema de porgramacion en red estoy un poco pajaro y me gustaria que me aconsejarais si para este tipo de juego es mejor que cree desde cero el servidor y cliente o utilice algun tipo de libreria.

Muchas gracias.
#38
ArtFutura / Bases Art Futura 2007
11 de Mayo de 2007, 02:42:00 PM
Muchas gracias!!

En cuanto a las capturillas todavia no me he metido con los graficos, demomento etoy solo creado el sitema de juego. En cuanto tenga tenga algo "enseñable", cuelgo las capturas. =)
#39
ArtFutura / Bases Art Futura 2007
07 de Mayo de 2007, 02:30:10 PM
Hola!

Soy nuevo por aqui y llevo programando un juego en Ogre desde hace un tiempo con la intencion de presentarlo en el Art Futura de este año. Me interesaria saber si alguien sabe algo de las bases del concurso de este año.

Gracias!





Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.