PDA

Просмотр полной версии : [Вопрос] Использование массива



Boulevard_Picard
16.09.2020, 10:36
Приветствую пользователей форума.

Мне в игровом режиме нужно хранить для каждого игрока несколько автомобилей (16), осложняется это тем что каждый автомобиль имеет ряд переменных (тюнинг, номер, состояние двигателя и топливо). Вопрос в том, как будет правильнее хранить эти данные.

На данный момент у меня заложена такая структура массива:

enum vInfo {
ID,
Model,
Color_Primary,
Color_Second,
Plate[32],
Flasher,
Fuel,
Engine,
Paintjob,
Spoiler,
Hood,
Roof.... (и так далее)
};

#define MAX_PLAYER_VEHICLES (16)

new VehicleInfo[MAX_PLAYERS][MAX_PLAYER_VEHICLES][vInfo];


Решение работает, но есть сомнения по поводу его правильности. Был вариант организовать структуру чтобы массив был двухмерным:
new VehicleInfo[MAX_PLAYERS*MAX_PLAYER_VEHICLES][vInfo];
Но отпугнуло обращение к данным при индексе 0. Жду ваших советов, как грамотнее осуществить то что я задумал

DeimoS
16.09.2020, 13:43
А ты точно хочешь загружать все данные? Зачем создавать сразу все автомобили, которые есть у игрока, если он может пользоваться только одним и если, при этом, количество автомобилей, которые можно создать, ограничено 2000 шт.? То бишь, даже уже при онлайне в 200 игроков ты уже исчерпаешь лимит.

А если, собственно, грузить все данные не нужно, то проще загружать данные конкретного автомобиля. Если же игрок решит его сменить - тут же подгрузить данные другого автомобиля. Нет никакого практического смысла в хранении данных обо всех 16 автомобилях сразу.

Boulevard_Picard
16.09.2020, 14:23
Создавать все автомобили сразу я не планировал. Задумка в том что у игрока есть список, где выбранный транспорт можно заспавнить (скриншот прикрепил). Если загружать данные только об одном автомобиле, такой список сделать не представляется возможным. Только если каждый раз при форматировании списка делать запрос и получать названия всех имеющихся у игрока транспортных средств и их номеров. Довольно накладно выйдет, нет?

https://i.imgur.com/76ar6Z5.png
В любом случае интересен ответ на изначальный вопрос касательно массивов, хотя бы для общего понимания

DeimoS
17.09.2020, 04:36
Вполне можно и делать каждый раз запрос, если правильно организовать структуру таблицы, расставив индексы и т.п.
Но можно и ограничиться тем, что вместо всей информации, просто загружать то, что нужно для отображения диалога + ID строки для конкретной машины из таблицы. А уже при нажатии на конкретный пункт диалога, загружать данные по сохранённому ID строки.
То бишь, будет один массив, который будет содержать в себе всю информацию о текущем выбранном автомобиле + ещё один массив, который будет содержать только частичную информацию, которая будет нужна для отображения диалога. Это будет довольно оптимальный и не сложный в исполнении вариант, с минимальным расходом лишней памяти.



Касаемо изначального вопроса - второй вариант крайне неудачный, ибо работать с данными будет неудобно.
Делать стоит либо как первый вариант, либо так:
#define MAX_PLAYER_VEHICLES (16)
enum vInfo {
ID[MAX_PLAYER_VEHICLES],
Model[MAX_PLAYER_VEHICLES],
Color_Primary[MAX_PLAYER_VEHICLES],
Color_Second[MAX_PLAYER_VEHICLES],
Plate[32][MAX_PLAYER_VEHICLES],
Flasher[MAX_PLAYER_VEHICLES],
Fuel[MAX_PLAYER_VEHICLES],
Engine[MAX_PLAYER_VEHICLES],
Paintjob[MAX_PLAYER_VEHICLES],
Spoiler[MAX_PLAYER_VEHICLES],
Hood[MAX_PLAYER_VEHICLES],
Roof[MAX_PLAYER_VEHICLES],
//.... (и так далее)
};

new VehicleInfo[MAX_PLAYERS][vInfo];
Мой пример, в теории, даже лучше, ибо вместо трёхмерного массива будет двумерный, как в твоём втором примере, только распределение ячеек и обращение к ним мы переложили на плечи компилятора благодаря enum.

Хотя напомню, что наиболее оптимальный вариант - тот, который я предложил в начале этого сообщения (с частичной загрузкой информации для диалога).