Задать вопрос
@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 != "")
				{
//устанавливаю позицию и поворот на клиенте
				}
			}


Мне нужно сформировать экономный пакет данных об игроках для клиента. Без пустых массивов.
  • Вопрос задан
  • 312 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 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); // Имеем право так делать, т.к. вектор гарантирует последовательное хранение элементов. Со списком подобное делать нельзя
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы