Jak stworzyć system ekwipunku dla każdego gracza?

11

Mam problem z wdrożeniem systemu ekwipunku w XNA (to nie ma znaczenia, może to być dowolna platforma), ale jak dotąd. Oto problem, który próbuję owinąć głową:

Jak mogę zdobyć przedmiot ze świata (pomyślisz, że kiedy zabijesz potwora, upuści zbroję) i weź go do ekwipunku mojego gracza?

Jeśli ekwipunek jest tylko listą przedmiotów, technicznie, jak mogę przenieść Stalowy Miecz ze świata do ekwipunku mojego gracza bez klasy, która może zrobić więcej niż jedną rzecz?

Obecnie mam strukturę przedmiotu, która zawiera unikalną wartość heksadecymalną, liczbę sztuk (dla stosów, takich jak strzały) i teksturę do renderowania w ekwipunku oraz niektóre inne nieistotne właściwości (nazwa, opis itp.) .

Byłbym źle zaprojektowany, gdybym musiał zmodyfikować istniejącą klasę przedmiotów, aby pomieścić pozycję na świecie, wraz z wykrywaniem kolizji (nie chcę, aby przedmiot spadł przez ziemię).

Dziękuję za wszelkie uwagi!

Ross
źródło
4
Czy nie możesz mieć WorldItemczegoś, co jest oddzielne od twojego InventoryItem? (Może WorldItemma InventoryItemszablon, który po podniesieniu umieszcza się w ekwipunku gracza).
George Duckett
1
@GeorgeDuckett Powinieneś zrobić z tego odpowiedź. Prawdopodobnie powinna być jakaś metoda, Inventoryktóra pobiera WorldItemi dodaje ją jako InventoryItem. Tak, aby mógł obsługiwać przypadki, w których przedmioty muszą się układać w stosy (np. Strzałki).
bummzack
@bummzack: Gotowe.
George Duckett

Odpowiedzi:

17

Podejście, które wybrałbym, to mieć 2 różne struktury (lub klasy). WorldItema InventoryItem.

Możesz następnie dodać InventoryItemjako własność / pole, WorldItemktóre jest umieszczane w ekwipunku gracza po podniesieniu przedmiotu na świecie.

Chcesz gdzieś (w klasie gracza lub dowolnej klasie przedmiotów) metody, która obsługuje dodawanie przedmiotów ekwipunku do ekwipunku gracza, aby poradzić sobie ze stosami jak przedmioty.

George Duckett
źródło
Naprawdę podoba mi się ta odpowiedź, dziękuję bardzo, ma to taki sens! Jeszcze jedna myśl, powiedzmy, że osoba chce upuścić przedmiot, czy przedmiot ekwipunku również potrzebuje w nim przedmiotu WorldItem?
Ross
Jeśli musi to być sposób 2, kusiłoby mnie, aby mieć oddzielną klasę „lookup”, która przechowywałaby pary przedmiotów świata i przedmiotów ekwipunku. Następnie użyłbyś tego do sprawdzenia jednego, biorąc pod uwagę drugi.
George Duckett
Och, fajnie, nigdy o tym nie myślałem. To bardzo ciekawy pomysł. Ponieważ wszystkie przedmioty są konkretne, warto poszukać ich.
Ross
2
Zniszczyłbym WorldItem, gdy jest on podnoszony, i tworzyłem nowy, gdy przedmiot jest upuszczany.
Simon Richter
Zgoda. Nie chciałem sugerować inaczej.
George Duckett
0

Jak wspomniano wcześniej, najlepszym rozwiązaniem byłoby podzielenie na wiele klas lub tablic. Stworzyłbym 3 klasy: Świat, Gracz i Przedmiot. Klasa światowa zawierałaby List WorldItems, podobnie jak klasa Gracza, ale o nazwie Lista Inwentarza. Kiedy gracz podnosi przedmiot, przenosisz go z listy na Świecie klasa do listy w klasie Player.

W pętli losowania w grze można utworzyć pętlę, która wyciąga wszystkie elementy z listy WorldItems na ekran, ale oczywiście ignoruje listę ekwipunku na obiekcie gracza.

Tomasz
źródło
Moja obecna metoda polega obecnie na tym, że mam klasę WorldItem, która zawiera InventoryItem, oba odnoszące się do tego samego elementu. W metodzie aktualizacji gry przeglądam wszystkie przedmioty świata i testuję granice kolizji z graczem. Jeśli te dwa kolidują ze sobą, WorldItem jest usuwany z listy WorldItem i jest umieszczany w ekwipunku gracza (który jest Listą <> InventoryItem)
Ross