Jak zdefiniować elementy w mojej grze RPG, takie jak gra Java?

21

Od niechcenia pracuję nad grą typu RPG w Javie, ale mam problem z ustaleniem, w jaki sposób mogę mieć przedmioty, które mogą robić wiele różnych rzeczy bez tworzenia innej klasy dla każdego przedmiotu.

Na przykład, jak mam stworzyć Topór, który mógłby ścinać drzewa i atakować potwory?

Jeśli przedłużę klasę rąbania lub broni, nie będę mógł przedłużyć drugiej klasy.

Jeśli mam siekanie, a broń jest interfejsem, będę miał dużo zduplikowanego kodu, gdy sztylet może również atakować potwory, a inny topór może ścinać drzewa.

Mam nadzieję, że istnieje sposób, aby mieć jedną klasę przedmiotów i ładować przedmioty oraz ich odpowiednie umiejętności z pliku. Jeśli to możliwe, jak to zrobić? Jeśli nie, to jaki jest najlepszy sposób na posiadanie przedmiotów w grze?

MESLewis
źródło

Odpowiedzi:

15

Odpowiedź Grega Weira to moja ulubiona metoda tworzenia instancji przedmiotów w celu wykonywania wielu ról.

Aby załadować z pliku:

Najpierw użyj YAML. YAML to funkcjonalny język opisu danych; może być analizowany stosunkowo szybko, odczytywany i edytowany przez ludzi, obsługuje dane binarne, a biblioteki są dostępne dla większości języków programowania, w tym Java. To rozwiązuje problem „jak uzyskać dane z plików do obiektów?”

Po drugie, użyj wzoru flyweight . Większość danych odczytywanych z tych plików jest statyczna. Nie zmieni się na instancję („topór zadaje podstawowe obrażenia 1d10 i łamie drewno, ale nie kamień” - dotyczy to wszystkich pięciu osi gracza). To, co faktycznie odczytujesz z plików YAML, to te platoniczne definicje, a twoje indywidualne instancje przedmiotów mają do nich nieposiadane (i stałe) odniesienia do nich, wraz z danymi dla poszczególnych instancji, takimi jak „Ile huśtawek, zanim pęknę?”, „Czy odtwarzacz dał mi niestandardową nazwę? ”i tak dalej.

Udostępniając dane między instancjami w jednym obiekcie, oszczędzasz dużo pamięci i ułatwiasz aktualizację elementów bez trwałego stanu gry (zapisywanie gier lub bazy danych graczy).

Struktura twojej klasy wygląda więc tak:

  • Przedmiot klasy - Jedna instancja na element
    • Jest właścicielem instancji broni
    • Jest właścicielem instancji Tool
    • Ma niestandardową nazwę itp.
  • Weapon klasy - (maksymalnie) jedna instancja na przedmiot
    • Is-a ItemComponent
    • Odnosi się do WeaponDef
    • Ma dodatkowy poziom zaklęcia itp.
  • narzędzie klasy - (maksymalnie) jedna instancja na element
    • Is-a ItemComponent
    • Odnosi się do ToolDef
    • Ma trwałość itp.
  • class WeaponDef - Jedna instancja na rodzaj broni
    • Odczytane z pliku, pola powinny być stałe.
    • Ma podstawową wartość obrażeń, 1 lub 2 ręce itp.
  • klasa ToolDef - Jedna instancja dla każdego rodzaju narzędzia
    • Odczytane z pliku, pola powinny być stałe.
    • Ma podstawową wytrzymałość, materiały, które może złamać itp.
Marko Zajc
źródło
18

Wzorzec projektowy Komponent (nie Kompozyt) jest świetny do tego celu: http://gameprogrammingpatterns.com/component.html

Zasadniczo Axe byłoby instancją klasy Item, która zawierała WeaponComponent i ToolComponent (być może). Aby sprawdzić, czy coś może być użyte jako broń, sprawdź, czy ma on dołączony składnik WeaponComponent, a następnie porozmawiaj z tą instancją WeaponComponent, aby uzyskać informacje o broni przedmiotu.

Ładowanie z pliku to oczywiście osobne ćwiczenie.

Gregory Avery-Weir
źródło
Oczywiście, kiedy już masz komponenty, możesz ponownie dobrze wykorzystać interfejsy. Twój typ Axe może zaimplementować IChopper i IWeapon, ale może następnie ujawnić zachowanie komponentu, umożliwiając ponowne użycie zarówno typu, jak i implementacji w razie potrzeby oraz wycięcie testu dla komponentów. Jeśli wszystkie osie mają takie same możliwości, ale różne statystyki, to jesteś złoty. Jeśli potrzebujesz przedmiotów o unikalnych zdolnościach, może być konieczne zaimplementowanie kolekcji elementów gry i poproszenie procedur aktualizacji o sprawdzenie, co mogą zrobić, dzięki którym komponenty są obecne.
CodexArcanum
6
@CodexArcanum: „Twój typ Axe może zaimplementować IChopper i IWeapon, ale może ujawnić zachowanie komponentu” - Jaki jest tego sens? To po prostu przesadza z twoją hierarchią klas. Chodzi o to, że nie potrzebujesz klasy Axe, interfejsu IChoppera lub interfejsu IWeapon, tylko konkretne komponenty Rozdrabniacza i Broni oraz Przedmiot najwyższego poziomu.
Obecnie pracuję nad systemem komponentów dla moich elementów gry i naprawdę mam tylko jedną główną skargę dotyczącą sposobu użycia tego wzoru. Biorąc pod uwagę elementy broni, odzieży i materiałów eksploatacyjnych, przedmiot może być teoretycznie „uszkodzony” pod względem przedmiotów, które nie mogą być jednocześnie bronią i odzieżą, lub odzieży, która również jest materiałem eksploatacyjnym. Logicznie rzecz biorąc, element może być tylko jednym „głównym komponentem”, ale ograniczając komponenty, łamiesz potrzebę posiadania jednego systemu komponentów. Tak więc jedna z podstawowych wad systemu, który
byłby