Созданные ответы форума
-
АвторСообщения
-
В силу некоторых обстоятельств я использовал контейнер map где ключем был ip адресс в формате string (да да тупо, так не делают это было дано и не правда, но работало), а значение хранимое объект Unit в котором есть sf:IpAddress и порт unsigned short port
далее логика проста снимаю блокинг порта и просматриваю в буфере новые подключение, если ip уже есть значить данные обновляются если нет то новый игрок
C++12345678910111213UdpSocket socket; // 127.0.0.1socket.setBlocking(false);// кодmap <string, Unit> indetificator; // 13.03.2015// код// в цикле чекаем поступающие данные (вроде буфером идут)socket.receive(data, sizeof(data), out, getIp, getPort);string adress = getIp.toString()+ToString(getPort);// какие то действия// массовая рассылка данныхfor (auto it = indetificator.begin(); it != indetificator.end(); it++){socket.send(packet, (*it).second.ip, (*it).second.port);}И да у меня UDP протокол, но я думаю тебе не важно)
Как вариан: прежде чем запускать новый звук поверять играет ли старый, и если играет то ничего не делать
C++1234sf::Sound sound;// что то происходитif(sound.getStatus() == sf::Sound::Status::Stopped)sound.play();…или же останавливать и воспроизводить новый
Если ты устанавливал компилятор вместе с Code::Blocks то тебе нужна версия с SFML: GCC x.x.x TDM (SJLJ)
Поясни за подключения
Вложения:
You must be logged in to view attached files.Ты VS 2015 по программе dreamspark получал?
или где можно скачать?
хочу тоже попробовать, а то eclipse и code block наскучили)
Решения до сих пор нету?
Ну у нас тоже нет проблем с подключением, но мы подключаемся не к внешнему ip а к локальному (192.168.0.103 например)
1) И так у тебя оба приложения открыты на порту в брандмауэр? Попробуй брандмауэр отключи.
2) Ты подключаешься к ip который у тебя в переменной serverip (IpAddress serverip = IpAddress::getPublicAddress(); ) ну то есть ты со своего компа подключаешься сам к себе через публичный адрес? Если да то ты web разработкой раньше не занимался?)
P.S. IpAddress ip = IpAddress::getLocalAddress(); // Считываем локальный ip адрес
А ты пытаешся считать публичный адрес интернера
Ты либо ip тыришь (хотя прога вроде его ни куда не отправляет :D) либо не правильно проблему описал, у меня работает так:(ну типа картинку прикрепил)
Вложения:
You must be logged in to view attached files.Да вот тут и кнопки и поля ввода есть, доприкручиваешь сам:
https://kychka-pc.ru/Forum/topic/interfejsy-upravleniya-textbox-button
Nice! Все робит +реп
Такс такс такс 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;}Если помогло репу+ а то админ по доганяет по рейтингу 😀
Да и очень легко!
Создаешь текст который необходимо вывести:
C++12345678910Font None; // ШрифтNone.loadFromFile("ttf/None.ttf"); //передаем нашему шрифту файл шрифтаText TXT; //Создаем тип данных текстTXT.setFont(None); // загружаем фрифтTXT.setCharacterSize(20); // в пикселях, а не точках!TXT.setColor(Color::White); // устанавливаем цвет выводимого текстаTXT.setPosition(x,y); // позиция текста (думаю сам подгонишь)TXT.setString(“You Lose”); // загружаем в выводимый текстbool logic = false; //логическая переменная для определения взаимодействия двух объектовэто делаешь до цикла (можешь даже до main() функции)
затем в том месте цикла который отвечает за отрисовку делаешь логику вида:
C++1234if(logic == true){window.draw(TXT);}а в коде где при достижении объектом другого объекта в событии установи logic == true
Easy!
C++12345678/*char bufRus[256];char* Rus(const char* text) {CharToOem(text, bufRus);return bufRus;}*/Ты про это?)) ахах это я пытался русский ввод символов организовать
Насчет отдельного потока так и есть ты можешь создать n количество Input и вводить туда текст.
Threads это распараллеливание?
sf::Event::TextEntered я это и применял)
Ах да чуть не забыл вот мой шрифт:
-
АвторСообщения