Zacząłem tworzyć małe gry w Javie i rozważam naukę języka C # dla większego projektu. Bardzo chciałbym stworzyć grę modyfikowalną, ale ktoś powiedział mi, że muszę trzymać się Javy, jeśli chcę, aby gra była modyfikowalna, chociaż nie rozumiem dlaczego.
Jakie cechy języka programowania sprawiają, że język jest bardziej odpowiedni dla gier z możliwością modyfikacji?
Odpowiedzi:
To zależy od tego, jak chcesz zaprojektować swój system modów. Zbadam dwa z nich.
SDK
Najprawdopodobniej będziesz wymagał od modderów używania tego samego języka co ty i ładowania modów poprzez odbicie (lub podobny, w zależności od wybranego języka). To oczywiście ograniczy cię do języków, które potrafią późno wiązać - i jest wielu, którzy potrafią to zrobić (nawet C może zrobić późne wiązanie za pomocą sprytnych
LoadLibrary
sztuczek). Możesz nawet zrobić trochę meta-modowania, gdzie mod może obsługiwać inne mody (np. Mody skryptowe).Pierwszym problemem związanym z tym podejściem jest ukrywanie stanu wewnętrznego. Biorąc na przykład C #, na przykład modder może po prostu użyć refleksji, aby uzyskać dostęp do prywatnych członków, C może również to zrobić (chociaż wymaga więcej wysiłku).
Drugim problemem jest hosting. Ludzie nie lubią obcego kodu działającego w ich systemie bez piaskownicy. Jako najgorszy scenariusz możesz napisać mod, który konfiguruje seedbox; jeśli zostanie zainstalowany u dostawcy usług internetowych, może poważnie zaszkodzić jego reputacji.
Skrypty
Modders używałby języka takiego jak Lua do tworzenia modów. Będziesz albo potrzebował języka, który mógłby wywoływać kod macierzysty (do interfejsu z Lua); albo będziesz musiał napisać własny język skryptowy w wybranym przez siebie języku.
Pierwszy problem polega na tym, że większość języków skryptowych jest interpretowana, co może być nie do zaakceptowania w systemach czasu rzeczywistego (chociaż patrz LuaJIT); takie jak gry.
Jak na ironię drugi problem wciąż tu istnieje; biorąc za przykład Luę, byłem bardzo rozczarowany, że ma funkcje „wyrzucania” zawarte w bibliotece podstawowej / domyślnej - co czyni ją całkowicie bezużyteczną jako środowisko sandboxowane (bez dużego wysiłku, szczęścia i konserwacji), trudno jest pokaż, jak bardzo jestem na to zły, ale naprawdę mam nadzieję, że pili mocne koktajle, gdy dodali te anty-funkcje . Można oczywiście łatwo tego uniknąć, jeśli stworzysz własny język (patrz: UnrealScript).
Wreszcie, koszt interakcji z silnikiem skryptowym może być wygórowany - ponownie biorąc Lua za przykład w połączeniu z C #: C # ma znaczny narzut podczas wywoływania funkcji natywnych (przez P / Invoke), a Lua jest dość „gadatliwym” API. Może to prowadzić do problemów, jeśli sposób zaprojektowania „zestawu SDK skryptów” wymaga dużej ilości rozmów między językiem podstawowym a językiem skryptowym (zauważ, że C tak naprawdę nie ma tego problemu). Ponownie możesz tego uniknąć, pisząc własny język skryptowy (aw przypadku C # kompilując go do MSIL) i wykonując go w najszybszy sposób w środowisku [wirtualnym].
Ponieważ skrypt działa zasadniczo w systemie zupełnie innym niż kod podstawowy, możesz całkowicie kontrolować dostęp do stanu wewnętrznego (chyba że wykonują jakieś wymyślne czynności z wcześniej wspomnianymi funkcjami powłoki).
Wniosek
Odwróciłem się trochę od tematu, jednak to, co możesz zasadniczo wyciągnąć z tej ściany tekstu, to to, że powinieneś być w stanie stworzyć grę z możliwością modyfikacji w dowolnym języku (zaryzykowałbym stwierdzenie, że możesz ) - ale w niektórych językach może prowadzić do większej pracy. Czy jestem trochę analny w kwestii bezpieczeństwa? Tak, powinieneś być też jeśli chodzi o kod użytkownika.
źródło
Powiedziałbym, że język nie jest tutaj decydującym czynnikiem, tak naprawdę to, jak elastyczna i oparta na danych twoja gra ją definiuje.
Każda gra działa na zestawie danych (np. Wszystko od poziomów, siatek, konfiguracji, przedmiotów). Różnica między normalną i modyfikowalną grą polega na tym, że później udostępnia ona narzędzia, które pozwalają użytkownikowi modyfikować istniejące dane (lub dodawać własne dane). Niezależnie od tego, jaki język wybierzesz, po prostu staraj się, aby twoja gra była oparta na danych, jak to możliwe, i unikaj twardego zapisywania zawartości gry. Praktycznie każdy język, który prawdopodobnie wybierzesz, może odczytywać dane z dysku, co jest w większości potrzebne.
Jest to również w połowie drogi, jeśli po prostu stworzysz narzędzia na własny użytek (na przykład własny edytor poziomów), a następnie udoskonalisz je i udostępnisz użytkownikom. Edytor poziomów Super Meat Boy było dość dużo, że ulepszony verision narzędzia wykorzystywane podczas tworzenia gry.
W zależności od rodzaju gry możesz zezwolić użytkownikom na skryptowanie niektórych zachowań w grze. W takim przypadku od samego początku powinieneś rozważyć włączenie do gry języka skryptowego (albo własnego, albo istniejącego, takiego jak Lua lub Python, które są popularnymi opcjami). Dotyczy to również kategorii projektowania opartego na danych. Jeśli zdecydujesz się na użycie istniejącego języka skryptowego, warto sprawdzić, czy wybrany język programowania ma powiązania dla tego języka skryptowego (zwykle w postaci bibliotek stron trzecich).
źródło
Wybrany język tak naprawdę nie decyduje o tym, jak dająca się modyfikować gra, sposób, w jaki go używasz, ma większe znaczenie.
Jeśli większość twojej gry opiera się na danych (to znaczy, że dane gry są zdefiniowane w pliku odczytywanym z twojego kodu), gra może być bardzo modyfikowalna. Można to zrobić w prawie każdym języku. Używanie języka skryptowego ułatwia także modyfikowanie gry.
Nie oznacza to jednak automatycznie, że nieużywanie tych rzeczy uniemożliwia modyfikację gry. Na przykład Minecraft wcale nie jest bardzo modyfikowalną grą, jednak istnieją całkiem dobre dekompilatory dla Javy i bardzo duża społeczność dla Minecrafta, dlatego stworzono wiele narzędzi, dzięki którym można modyfikować Minecraft (różne moduły ładujące, Bukkit). Za pomocą tych narzędzi można modyfikować Minecraft (jednak są one prawdopodobnie technicznie nielegalne w niektórych krajach).
Najlepsza rada, jaką mogę ci dać, to użyć narzędzi, których chcesz używać modderów; Jeśli zdefiniujesz NPC z pliku, możesz go zmodyfikować, jeśli w specjalnym przypadku jest to kod, prawdopodobnie nie będzie.
źródło
Java doskonale nadaje się do pisania gry z możliwością modyfikacji.
Powiedziawszy to, najlepszym sposobem na modyfikację gry jest zazwyczaj przyjęcie dynamicznego języka, który można osadzić w szerszej aplikacji i wykorzystać do pisania skryptów. Zwykle potrzebujesz dynamicznego języka, ponieważ chodzi o to, aby móc wchodzić w interakcje z kodem w czasie wykonywania, bez przechodzenia przez cały cykl kompilacji / kompilacji / testowania.
Niektóre dynamiczne wybory językowe do rozważenia:
źródło
Jest o wiele łatwiejszy sposób na zrobienie tego w Javie, choć jest to trochę niechlujne. Wszystko, co musisz zrobić, to wziąć pliki dot java do folderu, a następnie umieścić ten plik wsadowy w folderze, nazwij go Uruchom:
javac /src/.java Java / src /
Uwaga: Możesz dodać tyle zajęć, ile chcesz. Uwaga: w ostatnim wierszu pamiętaj, aby NIE umieszczać żadnych rozszerzeń, takich jak .java, .exe, .bat, ect.
To po prostu przekompiluje kod za każdym razem, gdy gra zostanie uruchomiona, więc jeśli źródło gry zostanie zmienione, skompiluje je, a następnie uruchomi nowo skompilowaną grę ... Niestety nie można dodawać modów innych osób do gry.
źródło