Jon Doe
Jon Doe

Reputation: 25

Window not responding while using sockets SFML

I am doing some simple SFML game, and I want to have network communication using udp Sockets. But the problem is that window is blocked and not responding if I try to update position of circle using coordinates that socket receives. Here is the code below. Does anyone know what the problem is?

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

int posX=100,posY=220,x=5;
sf::UdpSocket receiver;
sf::SocketSelector selector;

void changePosition ();
void defineWindow(sf::RenderWindow &window);
void drawCircle(sf::CircleShape &circle, sf::RenderWindow &window);

int main ()
{
  receiver.bind(15000);
  selector.add(receiver);

  sf::RenderWindow window (sf::VideoMode(800,600), "Krugovi");

  defineWindow (window);

  return 0;
}

void changePosition ()
{
  if (x>0 && posX+x>685) {
    posX=685;
    x=-x;
  }
  else if (x<0 && posX+x<15) {
    posX=15;
    x=-x;
  }
  else
    posX=posX+x;
}

void defineWindow(sf::RenderWindow &window)
{
  sf::CircleShape circle(50);
  sf::Event event;
  sf::Clock clock;

  while (window.isOpen()) {
    while(window.pollEvent(event)) {
      if (event.type == sf::Event::KeyPressed) {
        if (event.key.code == sf::Keyboard::Escape)
          window.close();
      }
      if (event.type==sf::Event::Closed)
        window.close();
    }

    window.clear(sf::Color::White);

    char msg[5];
    size_t received;
    sf::IpAddress ip;
    unsigned short port;

    std::string string;

    if (selector.wait()) {
       if(receiver.receive(msg,sizeof(msg),received,ip,port)==sf::UdpSocket::Done) {
        posX=atoi(msg);
      }
    }

    drawCircle(circle,window);

    window.display();
  }
}

void drawCircle(sf::CircleShape &circle, sf::RenderWindow &window)
{
  circle.setFillColor(sf::Color::Yellow);
  circle.setOutlineThickness(15);
  circle.setOutlineColor(sf::Color::Red);
  circle.setPosition(posX,posY);
  window.draw(circle);
}

Upvotes: 0

Views: 236

Answers (1)

Jonny Paton
Jonny Paton

Reputation: 397

sf::SocketSelector::wait() without any parameters will wait forever until something is received on one of it's sockets, so you won't be responding to events in your window.

If you pass it a time to wait, for example sf::milliseconds(5) then you can continue to poll for events

Relevent docs here

Upvotes: 2

Related Questions