SFML и C++ Уроки \ Разработка игр › Форумы › SFML Network › UDP проблеми
В этой теме 4 ответа, 3 участника, последнее обновление tyman 8 года/лет, 6 мес. назад.
-
АвторСообщения
-
Проблема в том, что переменные не изменяются, я изменяю, а на сервере не меняет.
C++1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162#include <SFML/Graphics.hpp>#include <SFML/Network.hpp>#include <iostream>#include <string>using namespace std;using namespace sf;int main() {setlocale(LC_ALL, ""); // Поддержка кириллицы в консоли WindowsIpAddress ip,ipserver = "192.168.0.101"; //Локальный ip Адрессsf::UdpSocket socket;//программный интерфейс для обеспечения обмена данными между процессамиPacket packet; //Для осуществления пакетной передачи дынныхunsigned short port = 2000;char type;string text = "Connect to: ";int x1=20,y1=30;//***********Подключение***************//cout << "Введите тип подключения: c -клиент, s -сервер :";cin >> type;if(type=='c'){cout << text << ipserver << endl;if (socket.bind(2000) != sf::Socket::Done){cout << "errors"<<endl;system("pause");exit(1);}else{cout <<"1.ok"<<endl;}//Прослушивает порт//**********Отрисовка Формы***********************//RenderWindow window(sf::VideoMode(640, 420), "Network");//Создаем размер Главного окна//*******Элементы********************//CircleShape shape1(10); //создаем шар с радиусом 50shape1.setFillColor(sf::Color::Green);while(window.isOpen()){sf::Event event;while(window.pollEvent(event)){if(event.type == sf::Event::Closed){window.close();}}if (Keyboard::isKeyPressed(Keyboard::D)) x1 ++;if (Keyboard::isKeyPressed(Keyboard::A)) x1 --;if (Keyboard::isKeyPressed(Keyboard::S)) y1 ++;if (Keyboard::isKeyPressed(Keyboard::W)) y1 --;packet<<x1<<y1;cout<<x1<<"|"<<y1; //Пакуем значения координат в Пакетif (socket.send(packet, ipserver, 2001)!= sf::Socket::Done) {cout<<"send.errors"<<endl;}//Отправляет на серверif (socket.receive(packet, ipserver, port)!= sf::Socket::Done) {cout <<"receive.errors"<<endl;}//Получает с сервераif (packet >> x1 >> y1){shape1.setPosition(x1, y1);cout<<x1<<"|"<<y1<<endl;}//Распаковываетwindow.clear();window.draw(shape1); //Отрисовываем шарwindow.display();sleep(sf::milliseconds(10));//Задержка}}if(type=='s'){if (socket.bind(2001) != sf::Socket::Done){cout << "errors"<<endl;system("pause");exit(1);}else{cout <<"1.ok"<<endl;}//Прослушивает портRenderWindow window(sf::VideoMode(100, 100), "Network");//Создаем размер Главного окнаwhile(window.isOpen()){sf::Event event;while(window.pollEvent(event)){if(event.type == sf::Event::Closed){window.close();}}if (socket.receive(packet, ip, port)!= sf::Socket::Done) {cout <<"receive.errors"<<endl;} else {//Принимает пакетint x2,y2;packet>>x2>>y2;//Распаковываетcout<<x2<<"|"<<y2<<endl;packet<<x2<<y2;//Пакуетif (socket.send(packet, ip, 2000)!= sf::Socket::Done) {cout<<"send.errors"<<endl;}//Отправляет назад}sleep(sf::milliseconds(10));//Задержка}}return 0;}Такс такс такс network Наконецта!
Во первых бросается во внимание метод подключения Udp, для него ненужно устанавливать соединение, он закидывает все данные на прямую(ваш метод рабочий) только убедитесь в правильности ip сервера!
Во вторых пакует данные строчка 35, а не 36. 36 лишь выводит значения x1 и y1 в консоль.
В третьих необходимо “вычищать предыдущие значения пакета” для пакета есть метод clear().
Скорее всего вы хотели получить что то подобное:
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687#include <SFML/Graphics.hpp>#include <SFML/Network.hpp>#include <iostream>#include <string>using namespace std;using namespace sf;int main() {setlocale(LC_ALL, ""); // Поддержка кириллицы в консоли WindowsIpAddress ip,ipserver = "192.168.0.101"; //Локальный ip Адрессsf::UdpSocket socket;//программный интерфейс для обеспечения обмена данными между процессамиPacket packet; //Для осуществления пакетной передачи дынныхunsigned short port = 2000;char type;string text = "Connect to: ";int x1=20,y1=30;//***********Подключение***************//cout << "Введите тип подключения: c -клиент, s -сервер :";cin >> type;if(type=='c'){cout << text << ipserver << endl;if (socket.bind(2000) != sf::Socket::Done){cout << "errors"<<endl;system("pause");exit(1);}else{cout <<"1.ok"<<endl;}//Прослушивает порт//**********Отрисовка Формы***********************//RenderWindow window(sf::VideoMode(640, 420), "Network");//Создаем размер Главного окна//*******Элементы********************//CircleShape shape1(10); //создаем шар с радиусом 50shape1.setFillColor(sf::Color::Green);while(window.isOpen()){sf::Event event;while(window.pollEvent(event)){if(event.type == sf::Event::Closed){window.close();}}if (Keyboard::isKeyPressed(Keyboard::D)) x1 ++;if (Keyboard::isKeyPressed(Keyboard::A)) x1 --;if (Keyboard::isKeyPressed(Keyboard::S)) y1 ++;if (Keyboard::isKeyPressed(Keyboard::W)) y1 --;packet<<x1<<y1;cout<<x1<<"|"<<y1 << endl; //Пакуем значения координат в Пакетif (socket.send(packet, ipserver, 2001)!= sf::Socket::Done) {cout<<"send.errors"<<endl;}//Отправляет на серверpacket.clear();if (socket.receive(packet, ipserver, port)!= sf::Socket::Done) {cout <<"receive.errors"<<endl;}//Получает с сервераif (packet >> x1 >> y1){shape1.setPosition(x1, y1);cout<<x1<<"|"<<y1<<endl;packet.clear();}//Распаковываетwindow.clear();window.draw(shape1); //Отрисовываем шарwindow.display();sleep(sf::milliseconds(10));//Задержка}}if(type=='s'){if (socket.bind(2001) != sf::Socket::Done){cout << "errors"<<endl;system("pause");exit(1);}else{cout <<"1.ok"<<endl;}//Прослушивает портRenderWindow window(sf::VideoMode(100, 100), "Network");//Создаем размер Главного окнаwhile(window.isOpen()){sf::Event event;while(window.pollEvent(event)){if(event.type == sf::Event::Closed){window.close();}}if (socket.receive(packet, ip, port)!= sf::Socket::Done) {cout <<"receive.errors"<<endl;} else {//Принимает пакетint x2,y2;packet>>x2>>y2;//Распаковываетcout<<x2<<"|"<<y2<<endl;packet<<x2<<y2;//Пакуетif (socket.send(packet, ip, 2000)!= sf::Socket::Done) {cout<<"send.errors"<<endl;}//Отправляет назадpacket.clear();}sleep(milliseconds(10));//Задержка}}return 0;}Если помогло репу+ а то админ по доганяет по рейтингу 😀
Я после таких ответов, вроде твоего, Cefasolin’a , MicroSDA и MVRKUS и добавил рейтинг:)) тут +9999….n , админу не догнать:)
смотри, у тебя уже репутация в окно не помещается)) вечером css поправлю:-)
Да, чистка пакета помогла. Огромное спасибо.
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.