Tworzę silnik gry. To ma być jednostka / komponenty. Aby rozwinąć moją grę, sam pomyślałem o użyciu języka skryptowego do stworzenia jednostek.
Na przykład, jeśli chcę dodać do gracza rodzaj potwora, który jest agresywny, będzie to istota z kilkoma komponentami; komponenty te zmienią się w zależności od typu potwora, więc jeśli mam sto różnych rodzajów potworów, w mojej grze nie będę musiał tworzyć nowej metody dla każdego z nich bezpośrednio w kodzie gry.
Czy powinienem używać języka skryptowego do opisywania tego elementu pod względem komponentów, czy może jest coś jeszcze, co działałoby lepiej? Mówiąc bardziej ogólnie, jak powinienem używać skryptów w mojej grze?
scripting
entity-component
Natan
źródło
źródło
Odpowiedzi:
Moja gra używa frameworku komponentu encji i skryptów do definiowania encji (to nie definiuje bezpośrednio zachowania, o tym powiem więcej na końcu). Skrypty definiują rzeczywiste komponenty, które zostaną użyte do utworzenia każdego elementu. Używa prostego języka skryptowego, który stworzyłem. Oto uproszczona wersja jednego z moich skryptów:
Wiele z nich jest samoopisujących się, ale oto kilka najważniejszych informacji:
baseAttributes
odniesienia tag inny skrypt, który określa wspólne elementy, które nie chcą mieć do przedefiniowania wielokrotnie. Zawiera składniki, takie jakposition
,liferequirements
i tak dalej. Jeśli jakikolwiek komponent zostanie tu zdefiniowany ponownie, zastąpi on ten wspólny.[NAME] { }
zestaw definiuje nowy komponent, który zostanie dodany do tych jednostek.0.01:0.015
), Kiedy tworzony jest nowy goblin, zostaje on utworzony ze składnikiem, który ma losową wartość w tym zakresie. Więc każdy goblin będzie miał nieco inne umiejętności i nieco inne prędkości. Ta konfiguracja określa, że wszystkie gobliny zaczną od naprawdę dobrych umiejętności w układaniu kostek i wydobywaniu, co jest naprawdę tylko dla moich własnych celów testowych. Ale jestem pewien, że można się domyślić, że bardzo łatwo jest zmienić wartości na dowolne.Cała ta sprawa polega na utworzeniu niestandardowego analizatora składni, pewnego rodzaju struktury do przechowywania definicji encji (nazywam mój Leksykon!) I fabryki do pobierania tych definicji encji i generowania nowych encji. Dla mnie ten system jest wciąż w początkowej fazie, ale okazuje się naprawdę, bardzo dobrze. Jest to dość potężny system do szybkiego definiowania encji i pozwala tworzyć dowolne encje za pomocą utworzonych komponentów. Jeśli nie masz ochoty tworzyć własnego parsera, myślę, że XML będzie działał dobrze. Przekształciłem mój z rekurencyjnego parsera wypychanego, który napisałem, dla trochę wymyślonego języka programowania.
Jak widać, definiuje to byt. Wspomniałem, że nie określa bezpośrednio zachowania. Może jednak łatwo zdefiniować takie rzeczy, jak znienawidzeni wrogowie i jak agresywnie reagować na wspomnianych wrogów. Byłoby to tak proste, jak zdefiniowanie dowolnego komponentu używanego do kontrolowania takiego zachowania. Moje byty mają również komponent inteligencji (nie pokazano), który definiuje takie rzeczy jak:
Jakkolwiek twój jest zdefiniowany, to twój system będzie kierował danymi w tym komponencie, co z kolei wpływa na zachowanie twoich entites.
źródło
if player.hasPoints(10) then i++ end skillTree[i]
byłby jakimś pseudokodem. Nie mam jednak pojęcia, jak ważne jest to pytanie dla tego postu.Jeśli wszystko, czego naprawdę potrzebujesz, to sposób definiowania składników Potwora, to XML działałby dobrze zarówno w języku C #, jak i java błyskawicznie go implementuje.
Twój xml może być
Wtedy mogłaby wyglądać twoja klasa mafijna. (Jawa)
Gdzie IPersonality jest interfejsem.
Następnie możesz załadować swój plik XML i przeanalizować każdą wartość w fabryce.
na przykład Parsuj wartość osobowości do PersonalityFactory, który jest po prostu:
Następnie możesz ustawić taki tłum
Kluczem jest to, że silnik zna format xml i ma fabrykę dla wszystkich potrzeb.
Jedną z zalet xml jest to, że możesz zdefiniować własny schemat, aby mieć pewność, że format jest zawsze poprawny, zobacz tutaj .
Mam nadzieję że to pomoże
źródło
Myślę, że Python jest w porządku. Często LUA jest również dobrą alternatywą, jeśli chcesz dodać możliwości skryptowe do swoich programów.
Możesz albo użyć XML do opisania zachowania swoich potworów, wymagałoby to trochę kodowania w rzeczywistym kodzie gry, ponieważ zapisujesz tylko „nazwę” lub niektóre atrybuty zgodnie z zachowaniem (prędkość, rodzaj broni, której używa potwór, itp.) zachowania, które należy zastosować w kodzie gry.
Jeśli używasz Scriptengine (np. LUA), możesz przenieść ten kod ze wstępnie skompilowanego programu do plików skryptowych, które są ładowane w czasie wykonywania. Aby to zrobić, musisz udostępnić interfejs API swoich „potworów” silnikowi skryptowemu. Pozwala to wywoływać metody kodu potwora z zewnątrz.
źródło