Chcę stworzyć grę z możliwością modyfikacji. Jak to wpływa na mój wybór języka programowania? [Zamknięte]

26

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?

uzależniony od gry
źródło
3
Jeśli chcesz stworzyć grę modyfikowalną, PhysicsFS może być bardzo przydatną biblioteką, o której warto wiedzieć. (To nie ma nic wspólnego z fizyką, nie daj się zwieść nazwie. :))
Paul Manta
10
„ale ktoś powiedział mi, że muszę pozostać przy Javie, jeśli chcę, aby gra była modyfikowalna”. Nawiasem mówiąc, jest to BS.
Ray Dey,

Odpowiedzi:

18

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 LoadLibrarysztuczek). 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.

Jonathan Dickinson
źródło
W pierwszym opisanym scenariuszu mówisz o tym, że użytkownik faktycznie programuje własną bibliotekę dynamiczną i podłącza ją do gry? Widziałem to używane wcześniej w bibliotekach (np. Biblioteka audio do dodawania nowych kodeków itp.), Ale prawdopodobnie dlatego, że nigdy nie zastanawiałem się zbytnio nad modowaniem, nigdy nie spotkałem się z taką sytuacją w przypadku gry. Jestem tego ciekawy (ponieważ użytkownikowi wydaje się bardzo trudno wiedzieć, jak to zrobić i zwykle widzę mody jako dostępne), więc czy znasz jakiś przykład? Przez większość czasu widzę wyspecjalizowane narzędzia, takie jak światowe edytory z odrobiną skryptów.
David Gouveia,
1
@DavidGouveia Uważam, że co najmniej jedna wersja silnika Paradox zastosowana w Europa Universalis (i równoważne gry dla różnych okresów) wspierała pewną formę łatek binarnych (chociaż mogło to być spowodowane tym, że łatka modder była źródłem i rekompilacją jednego z biblioteki DLL gier zamiast odpowiedniej obsługi zestawu SDK) oprócz częściej używanych modów poprzez zmianę implementacji pliku danych.
Dan Neely,
2
@DavidGouveia patrz: silnik źródłowy; a nawet wtyczki Winampa. Myślę, że Quake nawet tak działa. Dowiedziałem się, że używasz C #; więc możesz zajrzeć do MEF (Managed Extensibility Framework): ujawnij interfejs, załaduj go przez odbicie i Bob jest twoim wujem.
Jonathan Dickinson
@JonathanDickinson Och, nie miałem pojęcia, że ​​silnik Source działa pod tym modelem. Zawsze wyobrażałem sobie zestaw narzędzi, takich jak Zestaw Budowy Zwojów Starszego. Dzięki za informację (miałem pomysł, jak to działa, po prostu pomyślałem, że może być zbyt skomplikowane, aby użyć ogólnego moddera). I naprawdę śmiałem się z „boba to twój wujek” . :-)
David Gouveia
1
Re Lua: Ci faceci mają Lua w piaskownicy, który nadaje się do użycia w oprogramowaniu wiki (i jest na tyle stabilny, że używa go angielska Wikipedia). Jestem pewien, że możesz dostosować go do swoich potrzeb, ale niektóre części rozszerzenia są objęte licencją GPL, więc skontaktuj się z prawnikiem.
Kevin
16

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).

David Gouveia
źródło
5

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.

Elva
źródło
1

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:

  • Groovy - doskonały dynamiczny język podobny do Java, który można osadzić w większych programach Java.
  • Clojure - potężny, dynamiczny Lisp dla JVM. Może być trudne dla niektórych modderów, aby się rozejrzeć, ale jest to wyjątkowo potężny język i można go bardzo łatwo osadzić. Nie widziałem go jeszcze używanego do modowania gier, ale nie ma powodu, dlaczego nie.
  • Lua - bardzo popularny język skryptowy gry. Wierzę, że istnieją wersje JVM, których można używać z poziomu Javy (chociaż sam ich nie próbowałem)
  • JavaScript - dostępny w JVM przez Rhino . Całkiem niezły wybór do skryptów gier, ponieważ wiele osób zna trochę JavaScript, a prototypowy model obiektowy bardzo dobrze pasuje do modów gry.
mikera
źródło
-2

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.

Jacob Picke s
źródło
Jacob Nie sądzę, że zrozumiałeś pytanie, przeczytaj odpowiedzi i sprawdź, czy to pomoże ci zrozumieć, o czym tu mówiono.
vikki,