Как хранить слоты инвентаря в базе данных (MySQL)?
Здравствуйте.
Есть система инвентаря в игре.
У инвентаря есть поля:
InventorySlot container[48];
float capacity;
float weight;
То есть у инвентаря 48 слотов в виде массива объектов типа InventorySlot, емкость (float) и вес (float).
У объекта InventorySlot такие поля: int ItemID, int Amount.
Сохранить capacity и weight в БД не вызывает проблем. Но как быть со слотами (массив объектов)?
Евгений Шатунов, нет, просто в последних вопросах люди не понимают, что я хочу. Они пытаются доказать мне, что я что-то не так делаю, вместо того, чтобы просто ответить на вопрос. Да и какая разница? Это что-то дает им?
Лев Александров, скажем так, у меня есть решение твоего вопроса, которое точно будет работать, является гибким и позволяет довольно эффективное управление базой в дальнейшем. Можешь заглянуть ко мне в профиль и посмотреть уровень проработки моих ответов.
Но уже по твоему вопросу я вижу что ты уже сейчас многое делаешь не так. Твои действия и твое мышление сперва нужно исправить.
От меня это потребует некоторых усилий. И если ты вот так просто возьмешь и отмахнешься от моего ответа, который будет 100% решением твоего вопроса, мои усилия будут потрачены впустую. Моё время и мои усилия.
Думаю, теперь для тебя разница должна стать очевидна и понятна.
Пока я не вижу перспектив излагать тебе полностью рабочее решение и тебе остается довольствоваться тем, что у тебя есть сейчас.
Евгений Шатунов, я не отмахиваюсь от ответов. Внизу Владимир написал что-то про отношение "многие ко многим", я пошел загуглил и более менее понял (и + один ко многим). А потом написал ему, как я это понял и спросил верно ли. Но он почему-то решил спросить про поля weight и capacity в инвентаре. Я подумал, ему просто интересно стало, как я делаю, а он оказывается искал какие-то недостатки всей моей системы. Зачем ему вообще понадобилось узнать когда я делаю запросы, как вычисляется вес. Wtf. Хотя я всего лишь хотел узнать, как сохранять сложные структуры данных в базе.
Мне не трудно раскрыть все карты. Просто он не понял бы ничего из моего проекта, т. к. я делаю игру ни на каком-то Unity, а в старой игрушке.
В прошлом моем вопросе про пустые ячейки в массиве я ступил и неправильно написал вопрос, поэтому забил на него, т. к. было поздно редактировать. Но и там чуваки начали докапываться типо почему ты вообще решил с массивом все делать, ты изначально на неправильную дорогу встал. Я не мог там им полностью всю ситуацию объяснить, т. к. они скорее всего не знают, где я столкнулся с этой проблемой. Хотя один человек написал хорошую идею и я просто лайкнул его ответ, т. к. мне понравился его алгоритм.
В позпрошлом вопросе я не получил ответ. А в остальных я просто благодарил словами, я даже не думал существование кнопки для отметки.
Если для тебя так важно, чтоб я нажал на эту кнопочку "Отметить решением" - без проблем вообще.
Лев Александров, давай пока эту ситуацию переложим в более привычное для тебя пространство.
Ты идешь по улице и хочешь съесть пончик. Вот завела нелегкая пожелать вкусный пончик. Воображение уже нарисовало тебе картину желаемого пончика.
Впереди три булочные. Ты заходишь в первую и говоришь: Дайте мне пончик. Как-то пытаешься описать желаемый результат словами. Тебе дают пончик согласно твоему описанию, ты его съедаешь, но он не соответствует твоим ожиданиям и ты уходишь из булочной ничего не заплатив. Ведь полученное не соответствует твоим ожиданиям.
Ты идешь во вторую булочную, где тоже говоришь: Дайте мне пончик. И ты снова как-то пытаешься объяснить свое желание. И второй раз переданный тебе на пробу пончик никак не удовлетворяет твоим ожиданиям. И ты снова отказываешься внести плату за съеденный пончик.
И в третьей булочной, куда ты тоже заходишь, все повторяется. Ты пытаешься описать, тебе дают то, что по их мнению соответствует твоему описанию, тебя это не удовлетворяет и ты отказываешься платить.
Но все дело в том, что ты съел уже три пончика, но не заплатил за них. Люди вложили в них свои силы, а ты эти вложения не оценил должным образом. Конечно же пекарю будет абсолютно не важно, получит за свои старания он оплату или нет. Правда ведь?
Такова история твоих прошлых вопросов на самом деле.
Если для тебя так важно
Такого никогда не говори. Старайся понимать ценность и цену даже самых простых коммуникаций.
Евгений Шатунов, в общем, понял. Буду более точнее потом излагаться. И кажись я немного злоупотребляю этим сервисом. Хочу удалить акк, чтобы начать сначала
Лев Александров, удаляться тебе незачем, кардинальных проблем для продолжения участия с текущей учетки у тебя нет.
Я не могу утверждать этого, на мой личный взгляд ты просто совершил несколько ошибок в плане пользования тостером.
Исправить твои ошибки очень легко. Просто изучи правила, соблюдай их и поступай с людьми так, как хочешь чтобы они поступали с тобой.
На счет ответа на твой вопрос я подумаю. Если коротко, то тебе потребуется две таблицы. В первой нужно расположить общие характеристики инвентаря персонажа. Во второй - расположить слоты инвентаря. Связь ячеек с инвентарем идет через идентификатор инвентаря в записи ячейки инвентаря. Идентификатор инвентаря должен быть записан в запись персонажа в таблице персонажей.
Детали и просто больше информации ты можешь найти тут. Я когда-то давно занимался этим проектом и, собственно, там реализована почти описанная мной схема. Я не советую брать прямо оттуда, т.к. используемый там подход лишен гибкости управления инвентарем на уровне БД.
Метод не совсем адекватный. Самый лучший это сделать табличку многие ко многим и хранить там. Другой вариант это JSON поле и сохранять там нужные значения.
Владимир Коротенко, в итоге у меня будет 2 таблицы? Одна для инвентарей (inventories) со столбцами id, weight, capacity. Другая для слотов (inventory_slots) со столбцами id, inventory_id, num (теперь нужно сохранять номер слота?), itemID, amount? Как-то не очень удобно. Ведь есть один класс Inventory и было бы удобнее, если б было "один класс - одна таблица". И каждая запись была бы экземпляром этого класса.
Да. weight будет высчитываться при взаимодействии с инвентарем (добавление/удаление предмета). При добавлении айтема будет что-то вроде inv.weight += item.weight. Сделал, чтобы каждый раз не пересчитывать. А capacity служит для ограничения.
Лев Александров, скиньте схему, я подойду накидаю как может выглядеть по моему мнению. В комментах к столбцу добавьте почему и как он вычисляется. Ну и до кучи в какой момент идёт запрос из логики. Возможно экономим на спичках нарушая структуру и понятность