Як зробити систему інвентаризації світового гравця?


11

У мене виникає проблема спроби впровадити систему інвентаризації в XNA (насправді не має значення, може бути будь-яка платформа), але поки що. Ось питання, яке я намагаюся обернути головою:

Як я можу отримати предмет із світу (подумайте, коли ви вб'єте монстра, він скидає броні) і занести його в інвентар мого гравця?

Якщо інвентар - це лише перелік предметів, технічно, як я можу перенести сталевий меч у світ в інвентар мого гравця, не маючи класу робити більше ніж одну справу?

Наразі у мене є структура елемента, яка містить унікальне шістнадцяткове значення, підрахунок кількості елементів (для складання, як стрілки) та Текстуру для візуалізації в інвентарі та деякі інші неважливі властивості (ім'я, опис тощо) .

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

Дякуємо за будь-які міркування!


4
Ви не можете просто мати WorldItemокремий до вашого InventoryItem? (Можливо, у шаблону WorldItemє InventoryItemшаблон, який потрапляє в інвентар гравця, коли його забрали).
Джордж Дакетт

1
@GeorgeDuckett Ви повинні зробити цю відповідь .. Мабуть, має бути якийсь метод у тому, Inventoryщо приймає WorldItemі додає його як InventoryItem. Так що він також міг обробляти випадки, коли предмети потрібно складати (наприклад, стрілки).
bummzack

@bummzack: Готово.
Джордж Дакетт

Відповіді:


17

Я підходив би до того, щоб мати 2 різні структури (або класи). WorldItemі InventoryItem.

Потім ви можете додати своє InventoryItemвластивість / поле, WorldItemяке потрапляє в інвентар гравця, коли підбирається світовий предмет.

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


Мені дуже подобається ця відповідь, дякую тобі, це має стільки сенсу! Остання думка, скажімо, людина хоче скинути предмет, чи потрібен також предмет Інвентаря WorldItem всередині нього?
Росс

Якщо це потрібно двозначно, я б спокусився мати окремий клас "пошуку", який зберігав би пари світових та інвентарних предметів. Потім ви використовуєте це, щоб шукати одне, враховуючи інше.
Джордж Дакетт

О, приємно, ніколи про це не думав. Це дуже цікава ідея. Оскільки всі предмети конкретні, є сенс мати пошук для них.
Росс

2
Я б знищив WorldItem, коли він підхоплений, і створив би новий, коли предмет буде відкинутий.
Саймон Ріхтер

Домовились. Не означало інакше.
Джордж Дакетт

0

Як було сказано, розбиття на кілька класів або масивів було б найкращим варіантом. Я створив би 3 класи, Світ, програвач та предмет. У світового класу був би список WorldItems в ньому, як і клас Player, але названий список інвентаря Коли гравець бере предмет, ви переміщуєте його зі списку у світі класу до списку в класі програвача.

У циклі нічиї вашої гри ви можете зробити цикл, який малює всі елементи зі списку WorldItems на екран, але, звичайно, ігнорує список інвентаря об’єкта гравця.


Мій сучасний метод зараз полягає в тому, що у мене є клас WorldItem, який інкапсулює InventoryItem, обидва стосуються одного і того ж елемента. У способі оновлення гри я переглядаю всі світові товари та перевіряю межі зіткнення з гравцем. Якщо двоє стикаються, WorldItem вилучається зі списку WorldItem і потрапляє в інвентар гравця (що є списком <> InventoryItem)
Росс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.