W JavaScript robię bardzo podstawowy typ powieści wizualnej . Jestem początkującym, więc robię to tylko dla zabawy i nauki, a z powodu złego planowania natknąłem się na pewien problem, kiedy wchodzisz do oddziału w dialogu.
Obecnie trzymam skrypt gry w zmiennej łańcuchowej i każdą scenę dzielę tagiem takim jak „# ~” na mniejsze tablice, aby skrypt gry wyglądał tak:
var script = "Hello World!#~How are you today?"
var gameText = script.split("#~");
//gameText[0]= Hello World!
Działa to świetnie w przypadku elementów liniowych, ale jak mam obsługiwać gałąź w drzewie dialogowym? Ta metoda wydaje się bardzo skomplikowana, ponieważ musiałbym dokładnie wiedzieć, jak długa jest każda ścieżka, a gdybym kiedykolwiek musiał coś zmienić, byłby to ból głowy.
Jak mogę to zrobić w prostszy sposób? Staram się trzymać waniliowego JavaScript, ponieważ chciałbym, aby gra współpracowała z Web Run Time.
źródło
Odpowiedzi:
Odpowiedź Filipa już pokazuje właściwy kierunek. Myślę, że struktura danych jest niepotrzebnie pełna. Krótsze teksty łatwiej byłoby pisać i czytać.
Nawet jeśli krótsze teksty uczynią algorytm nieco bardziej złożonym, warto to zrobić, ponieważ algorytm pisze się tylko raz, ale większość czasu poświęcisz na napisanie i utrzymanie historii. Dlatego zoptymalizuj, aby ułatwić wykonanie części, którą poświęcisz najwięcej czasu.
Kilka wyjaśnień dla tego projektu:
Cała historia jest napisana w jednym szyku. Nie musisz podawać liczb, są one dostarczane automatycznie przez składnię tablicy: pierwszy element ma indeks 0, następny ma indeks 1 itd.
W większości przypadków nie jest konieczne wpisanie numeru następnego kroku. Zakładam, że większość wierszy tekstu nie jest gałęziami. Uczyńmy „następnym krokiem jest następujący element” domyślne założenie i robimy notatki tylko wtedy, gdy jest inaczej.
Do skoków używaj etykiet , a nie liczb. Następnie, jeśli później dodasz lub usuniesz kilka wierszy, logika historii zostanie zachowana i nie będziesz musiał dostosowywać liczb.
Znajdź rozsądny kompromis między jasnością a skrótem. Na przykład proponuję napisać „m” zamiast „wiadomość”, ponieważ będzie to najczęściej używane polecenie w historii, więc skrócenie go spowoduje, że tekst będzie bardziej czytelny. Ale nie ma potrzeby skracania pozostałych słów kluczowych. (Rób jednak, co chcesz. Ważne, aby było to dla Ciebie najbardziej czytelne . Alternatywnie możesz podać zarówno „m”, jak i „wiadomość” jako prawidłowe słowa kluczowe.)
Algorytm gry powinien wyglądać mniej więcej tak:
Nawiasem mówiąc, te pomysły zostały zainspirowane przez Ren'Py , który nie jest dokładnie tym, czego chcesz (nie JavaScript, nie internet), ale i tak może dać ci fajne pomysły.
źródło
({ label: "like_yes"; m: "I am happy you like my game!"; next: "like_end" },)
powinno być „,” a nie; Co dokładnie nazywa się rzecz w nawiasach klamrowych? Czy to obiekt w tablicy? gdybym chciał więcej informacji o tym, jak z tego korzystać, czego bym szukał?{...}
jest przedmiotem. W JavaScript obiekt jest tablicą asocjacyjną klucz-wartość (z pewnymi dodatkowymi funkcjami, nieużywanymi w tym przykładzie), podobną do tablicy w PHP lub mapy w Javie. Aby uzyskać więcej informacji, zobacz artykuły w Wikipedii na temat JavaScript i ECMAScript, a także dokumentację z tym powiązaną, zwłaszcza oficjalną dokumentację ECMAScript.Poleciłbym ci stworzyć tablicę zdarzeń dialogowych. Każde zdarzenie to obiekt zawierający tekst, który mówi NPC i tablicę możliwych odpowiedzi graczy, które z kolei są obiektami z tekstem odpowiedzi i indeksem zdarzenia, które następuje po tej odpowiedzi.
źródło
Powinieneś zastosować inne podejście. JavaScript obsługuje tablice i obiekty, więc dlaczego nie użyć jednego dla każdego wpisu, oszczędzając ci podziału, a także ułatwiając edycję / czytanie tekstu?
Jeśli chcesz, możesz rzucić okiem na prototyp , który zrobiłem w ciągu kilku godzin dla # 1gam . Źródła można używać bezpłatnie na GPLv3 (nic mi nie jest, jeśli nie trzymasz się GPL, jeśli używasz go tylko jako inspiracji. Ale daj mi znać, kiedy skończysz grę.) Po prostu nie oczekuj wspaniałego pisania ani czegoś takiego. ;)
Aby krótko wyjaśnić, jak działa kod, ignorując animację CSS i podobne rzeczy:
var data
zasadniczo zawiera całą historię ze wszystkimi możliwymi wyborami itp.start
drugicwait
itd.[target location:display text]
.navigate()
: Ta funkcja sprawia, że linki znaczników są klikalne. Jest trochę dłużej, ponieważ tam też obsługuję statyczny tekst dla Dead Ends. Ważną częścią są dwa pierwsze połączenia zreplace()
.Zamiast definiować te kolory, możesz również dodać linki prowadzące do innych lokalizacji (zwróć uwagę, że mój kod tego nie obsługuje; to tylko pewien pomysł, aby to zademonstrować):
'start': ['Waking up', 'You wake...', 'cwait:yell for help', 'cwait: wait a bit', 'clook: look around']
źródło