sábado, 23 de mayo de 2015

Redes en SFML


1.- Creamos un nuevo archivo en SFML

2.- Lo rellenamos con el siguiente código.

Main.cpp

#include <SFML\Graphics.hpp>
#include <SFML\Network.hpp>
#include <iostream>
#include <string>

#define TILE_SIZE 40.f

using namespace std;

int main()
{
 //Establesco la conexion
 sf::TcpSocket socket;
 string entradaConsola;
 cin >> entradaConsola;

 if (entradaConsola == "host")
 {
  sf::TcpListener escucha;
  escucha.listen(45000);
  cout << "Esperando la conexion..." << endl;

  if (escucha.accept(socket) != sf::Socket::Done)
  {
   return -1;
  }
 }

 else
 {
  //en la segunda pantalla tendremos que introducir la IP en este caso de manera local seria 127.0.0.1
  cout << "Intentando conectar..." << endl;
  
  //El tiempo de salida se establece en 10 segundos. si nada sucede aborta
  if (socket.connect(entradaConsola, 45000, sf::seconds(10)) != sf::Socket::Done)
  {
   //No pudo conectar por alguna razon y aborta
   return -1;
  }
 }

 //Creo mi ventana y ajustamos la escena para este proyecto
 sf::RenderWindow window(sf::VideoMode(640, 480), "Redes en SFML");
 window.setFramerateLimit(60);

 socket.setBlocking(false);

 sf::Vector2f tamFigura(TILE_SIZE, TILE_SIZE);
 sf::RectangleShape figuraLocal(tamFigura);
 sf::RectangleShape figuraRemota(tamFigura);

 //GameLoop
 while (window.isOpen())
 {
  //Eventos
  sf::Vector2i direccion;
  sf::Event event;

  //Se manejan los eventos
  while (window.pollEvent(event))
  {
   //Creo una sentencia switch para controlar muchos eventos
   switch (event.type)
   {

   //Cierra la ventana
   case sf :: Event::EventType::Closed:
    window.close();
    break;

    //Moveremos los cubos cada quien con su direccion
   case sf::Event::KeyPressed:

    if (event.key.code == sf::Keyboard::W)
    {
     direccion.y += -1;
    }

    else if (event.key.code == sf::Keyboard::A)
    {
     direccion.x += -1;
    }

    else if (event.key.code == sf::Keyboard::S)
    {
     direccion.y += 1;
    }

    else if (event.key.code == sf::Keyboard::D)
    {
     direccion.x += 1;
    }

   default:
    break;
   }
  }

  //Checa los nuevos paquetes
  sf::Packet paquete;

  if (socket.receive(paquete) == sf::Socket::Done)
  {
   sf::Vector2f posicion;
   paquete >> posicion.x >> posicion.y;
   figuraRemota.setPosition(posicion);
  }

  //Actualiza el frame
  if (direccion.x != 0 || direccion.y != 0)
  {
   figuraLocal.move(direccion.x * TILE_SIZE, direccion.y * TILE_SIZE);
   sf::Packet paquete;
   paquete << figuraLocal.getPosition().x << figuraLocal.getPosition().y;

   if (socket.send(paquete) != sf::Socket::Done)
   {
    //Se manejan los errores de posible salida del otro jugador
    return -1;
   }
  }

  //Renderizamos
  window.clear();

  window.draw(figuraLocal);
  window.draw(figuraRemota);

  window.display();
 }

 return 0;
}


3.- Una vez hecho eso abrimos otro nuevo documento y copiamos el código tal como esta.



4.- Ejecutamos uno de ellos


5.- Saldrá la pantalla de la consola, espera una cadena para introducir.


6.- En esta primera ventana introduciremos la cadena host


7.- La primera vez te saldrá que si permites que se establezca la conexión y le das aceptar, entonces la pantalla de la consola esperara al siguiente jugador.


8.- Ahora ejecutaremos la otra aplicación y nos volverá a salir la ventana de la consola, en esta ocasión nos comunicaremos con el servidor, le introduciremos la dirección IP, para este ejemplo se hizo de manera local introduciendo 127.0.0.1


9.- Le damos enter y nos aparecerá que esta intentando conectar.


10.- Si se realizo de manera local aparecerán 2 ventanas de juego con los personajes.


11.- Si nos paramos a una ventana y movemos con las teclas W, A, S, D se moverá unos de los personajes el que esta de manera local y si nos vamos a la otra pantalla y movemos podemos observar que se mueve el otro que es el remoto.


No hay comentarios:

Publicar un comentario