Salut à tous,
Alors voilà, j'ai développé une petite application permettant que 2 personnes puissent, depuis leur PC, déplacer un personnage animé avec les touches fléchées.
Le programme fonctionne parfaitement bien en local ou même en wifi avec mon PC de bureau - PC portable, avec l'ip de la box 168.0.0.25 ..
Néanmoins, après avoir renseigné mon adresse IP fixe pour que la connexion se fasse depuis l'extérieur, il ne se passe rien..
Lorsque j'envoi mon programme à un pote par email et que je lui demande de se connecter, il ne se passe rien, pourtant, j'ai ouvert le port que j'utilise ( 2000 ) depuis ma box SFR, mais impossible pour mon pote de se connecter lorsque je lance le serveur..
Merci à tous de bien vouloir m'éclairer sur ce problème.
Voici le code, sait-on jamais :
#include <iostream>
#include <SFML/Graphics.hpp>
#include <SFML/Network.hpp>
using namespace std;
using namespace sf;
int main()
{
string ip = "85.***.**.**2";
TcpSocket socket;
cout << ip << endl;
char connectionType;
bool updateScreen;
cout << "(s) pour serveur / (c) pour client : ";
cin >> connectionType;
if (connectionType == 's')
{
TcpListener listener;
listener.listen(2000);
listener.accept(socket);
}
if (connectionType == 'c')
{
socket.connect(ip, 2000);
}
RenderWindow app(VideoMode(800,600,32),"SFML_Packets");
Clock clock;
Texture perso;
perso.loadFromFile("mario.png");
Sprite S1(perso), S2(perso);
Vector2f prevPosition, p2Position;
Vector2f position(800/2, 600/2);
Vector2f anim, p2Anim;
enum dir {up, right, down, left };
enum p2Dir {up2, right2, down2, left2 };
S1.setTextureRect(IntRect(anim.x*24, anim.y*32, 24, 32));
S2.setTextureRect(IntRect(anim.x*24, anim.y*32, 24, 32));
anim.x = 0;
anim.y = down;
p2Anim.x = 0;
p2Anim.y = down2;
float speed = 3;
View view;
socket.setBlocking(false);
while (app.isOpen())
{
Event event;
while (app.pollEvent(event))
{
if (event.type == Event::Closed)
app.close();
if (event.type == Event::GainedFocus)
updateScreen = true;
if (event.type == Event::LostFocus)
updateScreen = false;
}
prevPosition = S1.getPosition();
position.x = S1.getPosition().x + 12 - (800/2);
position.y = S1.getPosition().y + 16 - (600/2);
if (updateScreen)
{
if (Keyboard::isKeyPressed(Keyboard::Up) && clock.getElapsedTime().asMilliseconds()>100)
{
S1.move(0, -speed);
anim.y = up;
anim.x++;
if (anim.x>2)
anim.x = 0;
clock.restart();
}
if (Keyboard::isKeyPressed(Keyboard::Down) && clock.getElapsedTime().asMilliseconds()>100)
{
S1.move(0, speed);
anim.y = down;
anim.x++;
if (anim.x>2)
anim.x = 0;
clock.restart();
}
if (Keyboard::isKeyPressed(Keyboard::Left) && clock.getElapsedTime().asMilliseconds()>100)
{
S1.move(-speed, 0);
anim.y = left;
anim.x++;
if (anim.x>2)
anim.x = 0;
clock.restart();
}
if (Keyboard::isKeyPressed(Keyboard::Right) && clock.getElapsedTime().asMilliseconds()>100)
{
S1.move(speed, 0);
anim.y = right;
anim.x++;
if (anim.x>2)
anim.x = 0;
clock.restart();
}
if(Keyboard::isKeyPressed(Keyboard::Escape))
app.close();
S1.setTextureRect(IntRect(anim.x*24, anim.y*32, 24, 32));
}
Packet packet;
if (prevPosition != S1.getPosition())
{
packet << S1.getPosition().x << S1.getPosition().y << anim.x << anim.y;
socket.send(packet);
}
socket.receive(packet);
if (packet >> p2Position.x >> p2Position.y >> p2Anim.x >> p2Anim.y )
{
S2.setPosition(p2Position);
S2.setTextureRect(IntRect(p2Anim.x*24, p2Anim.y*32, 24, 32));
}
app.clear();
view.reset(FloatRect(position.x, position.y, 800, 600));
app.setView(view);
app.draw(S1);
app.draw(S2);
app.display();
}
}