Как сделать систему инвентаризации мира для игрока?

11

Я сталкиваюсь с проблемой попытки внедрить систему инвентаризации в XNA (не имеет значения, может быть любая платформа), но пока. Вот проблема, которую я пытаюсь обернуть вокруг:

Как я могу получить предмет из мира (подумайте, когда вы убиваете монстра, он сбрасывает броню) и доставляет его в инвентарь моего игрока?

Если инвентарь - это просто список предметов, технически, как я могу получить Стальной Меч из мира в инвентарь моего игрока, не имея класса, делающего больше чем одну вещь?

В настоящее время у меня есть структура элементов, которая содержит уникальное шестнадцатеричное значение, счетчик количества элементов (для наращиваемых элементов, таких как стрелки) и текстуру для рендеринга в инвентаре, а также некоторые другие неважные свойства (имя, описание и т. Д.) ,

Было бы плохо проектировать, если бы мне пришлось изменить свой существующий класс предметов, чтобы разместить мировую позицию, наряду с обнаружением столкновений (не хочу, чтобы предмет падал сквозь землю).

Спасибо за любые соображения!

Росс
источник
4
Разве ты не можешь иметь WorldItemчто-то отдельное от твоего InventoryItem? (Может быть, WorldItemесть InventoryItemшаблон, который помещается в инвентарь игрока при поднятии).
Джордж Дакетт
1
@ GeorgeDuckett Вы должны сделать это ответом .., вероятно, должен быть какой-то метод, Inventoryкоторый принимает WorldItemи добавляет его как InventoryItem. Так что он также может обрабатывать случаи, когда предметы должны складываться (например, стрелки).
bummzack
@bummzack: Готово.
Джордж Дакетт

Ответы:

17

Подход, который я бы выбрал, состоит в том, чтобы иметь 2 разных структуры (или класса). WorldItemи InventoryItem.

Затем вы можете добавить в InventoryItemкачестве своего свойства / поля WorldItemто, что будет помещено в инвентарь игрока при поднятии предмета мира.

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

Джордж Дакетт
источник
Мне очень нравится этот ответ, большое спасибо, он имеет такой смысл! Еще одна мысль, скажем, человек хочет отбросить предмет, будет ли предмет инвентаря также нуждаться в WorldItem внутри него?
Росс
Если это должно быть 2 способа, у меня будет соблазн иметь отдельный класс 'lookup', в котором будут храниться пары предметов мира и предметов инвентаря. Затем вы использовали бы это, чтобы найти одно, учитывая другое.
Джордж Дакетт
Оооо приятно, никогда не думал об этом. Это очень интересная идея. Поскольку все предметы являются конкретными, имеет смысл искать их.
Росс
2
Я уничтожил бы WorldItem, когда он был поднят, и создал бы новый, когда предмет был уронен.
Саймон Рихтер
Согласовано. Не хотел подразумевать иное.
Джордж Дакетт
0

Как уже упоминалось, прежде чем разбить на несколько классов или массивов, будет лучшим выбором. Я бы создал 3 класса, World, Player и Item. В мировом классе был бы List WorldItems, так же как и класс Player, но с именем List Inventory. Когда игрок берет предмет, вы перемещаете его из списка в Мире. Класс к списку в классе Player.

В цикле рисования вашей игры вы можете создать цикл, который рисует все элементы из списка WorldItems на экране, но, конечно, игнорирует список инвентаря на объекте игрока.

Томас
источник
Мой текущий метод прямо сейчас, что у меня есть класс , который инкапсулирует WorldItem в InventoryItem оба относящихся к тому же пункт. В игре в методе Update I цикле через все мировые пункты и границы столкновения теста с игроком. Если два Collide, то WorldItem удаляется из списка WorldItem и помещается в инвентарь игрока (который является List <> из InventoryItem)
Росс