@Daamgo

Как правильно сформировать экономный пакет данных об игроках?

typedef struct 
{
 int id;
 std::string name;
 float pos[3];
 float eye[3];
} PacketMultiPlayer;

PacketMultiPlayer serverMuPacket[10];

//вот так отсылает сервер -> клиенту
send(sock,(char*)serverMuPacket,sizeof(serverMuPacket),0);


Задача примерно следующая. Есть 3d пространство в котором передвигаются игроки.
На сервер передаются координаты игрока (X/Y/Z) и поворот (Y).
Сервер отдает массив в 10 - 1(твой игрок) игроков в котором передаются координаты других для установки их позиций на клиенте.

Проблема следующая.

Массив от сервера получаю, но скажем если игроков 2ое. То 8 остальных пустые. Я считаю что есть более экономичный способ хранить информацию об игроках, проблема в том что я не знаю как.

Прогуглив немного забугорные сайты и форумы, спасибо переводчику. Мне удалось обнаружить что используют векторы, листы. Печально то что не удалось найти примеров использования.

for(int np = 0; np < 11; np++)
			{
				if(serverMuPacket[np].name != name && serverMuPacket[np].id != 0 && serverMuPacket[np].name != "")
				{
//устанавливаю позицию и поворот на клиенте
				}
			}


Мне нужно сформировать экономный пакет данных об игроках для клиента. Без пустых массивов.
  • Вопрос задан
  • 310 просмотров
Решения вопроса 2
mannaro
@mannaro
Умею профессионально гуглить
Ответ написан
Комментировать
Nipheris
@Nipheris Куратор тега C++
Ваша проблема решается даже не просто, а элементарно.
Для этого нужно запомнить простейший способ передачи групп элементов переменной (т.е. заранее неизвестной) длины: сначала передавать длину, а потом уже сами элементы в нужном количестве.
Этот подход используется повсеместно. Например, когда на диск сохраняют строки переменного размера, и в строке неудобно/невозможно применить символ-терминатор, то сначала записывают длину строки (неотрицательное число нужной разрядности - байт, 2-х байтовое целое, 4-х байтовое целое), а потом уже содержимое строки. Кстати, такие строки называются паскалевскими (в альтернативу нуль-терминированным Cи-строкам).
Разумеется, приемник пакета должнен быть достаточно умным, чтобы сначала принять длину, выделить себе некую стркутуру нужного размера (вектор подходит отлично, т.к. можно попросить его сразу зарезервировать нужное количетсво элементов), а затем записать ожидамое количество элементов.

Вариант кода передачи:
std::vector<PacketMultiPlayer> serverMuPackets;
......
const unsigned int packetsCount = serverMuPackets.size();
send(sock,(char*)(&packetsCount), sizeof(packetsCount), 0);
send(sock,(char*)serverMuPackets.data(), sizeof(PacketMultiPlayer) * packetsCount, 0); // Имеем право так делать, т.к. вектор гарантирует последовательное хранение элементов. Со списком подобное делать нельзя
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы