Я начал делать небольшие игры на Java, и я изучаю C # для более крупного проекта. Я бы очень хотел сделать игру с возможностью модификации, но кто-то сказал мне, что мне нужно придерживаться Java, если я хочу, чтобы игра была модифицируемой, хотя я не понимаю, почему.
Итак, какие характеристики языка программирования делают язык более подходящим для изменяемых игр?
Ответы:
Это зависит от того, как вы хотите создать свою мод-систему. Я исследую два из них.
SDK
Скорее всего, вам потребуется, чтобы ваши моддеры использовали тот же язык, что и вы, и загружали моды через отражение (или подобное, в зависимости от того, какой язык вы выбрали). Это, очевидно, ограничит вас языками, которые могут выполнять позднюю привязку - и многие могут это сделать (даже C может выполнить позднюю привязку с некоторыми хитрыми
LoadLibrary
хитростями). Вы можете даже сделать мета-моддинг, где мод может содержать другие моды (например, скриптовые моды).Первая проблема с этим подходом - скрытие внутреннего состояния. Взяв, например, C #, моддер может просто использовать отражение для доступа к закрытым членам, C также может это сделать (хотя требуется больше усилий).
Вторая проблема - хостинг. Людям не очень нравится чужой код, работающий в их системе без песочницы. В худшем случае вы могли бы написать мод, который настраивал бы «семенную коробку»; если он был установлен у интернет-провайдера, это может нанести серьезный вред их репутации.
Scripting
Моддеры будут использовать язык, такой как Lua, для создания модов. Вам потребуется либо язык, который может вызывать нативный код (для взаимодействия с Lua); или вам придется написать свой собственный язык сценариев на выбранном вами языке.
Первая проблема заключается в том, что интерпретируется большинство языков сценариев, что может быть неприемлемо для систем реального времени (хотя, см. LuaJIT); такие как игры.
По иронии судьбы вторая проблема все еще существует здесь; Взяв Lua в качестве примера, я был крайне разочарован тем, что в библиотеку core / default включены функции «обнуления», что делает его совершенно бесполезным в качестве изолированной среды (без больших усилий, удачи и обслуживания), трудно изобразить , как я зол об этом, но я действительно надеюсь , что они пили некоторые сильные коктейли , когда они включали в себя эти анти-функцию . Очевидно, вы могли бы легко избежать этого, если бы вы катались на своем собственном языке (см .: UnrealScript).
Наконец, стоимость взаимодействия со скриптовым движком может быть чрезмерной - опять-таки, взяв Lua в качестве примера, в сочетании с C #: C # имеет значительные накладные расходы при вызове нативных функций (через P / Invoke), а Lua - довольно «болтливый» API. Это может привести к проблемам, если при разработке «SDK-скрипта» требуется много разговоров между вашим основным языком и языком сценариев (обратите внимание, что в C на самом деле такой проблемы нет). Опять же, вы можете избежать этого, написав свой собственный язык сценариев (и в случае C # компилируя его в MSIL) и выполнив его самым быстрым способом в вашей [виртуальной] среде.
Поскольку скрипт в сущности работает в совершенно другой системе, чем ваш основной код, вы можете полностью контролировать доступ к внутреннему состоянию (если только они не делают какие-то причудливые вещи с ранее упомянутыми функциями оболочки).
Вывод
Я немного отклонился от темы, однако, что вы можете получить из этой стены текста, так это то, что вы должны иметь возможность создавать изменяемую игру на любом языке (я бы рискнул сказать, что вы можете ) - но на некоторых языках. может привести к большей работе. Я немного анальный о безопасности? Да, вы должны быть тоже, когда дело доходит до кода пользователя.
источник
Я бы сказал, что язык здесь не является решающим фактором, а то, насколько гибкой и управляемой данными вы делаете свою игру, которая его определяет.
Каждая игра запускается на наборе данных (например, все от уровней, сеток, конфигураций, предметов). Разница между обычной игрой и изменяемой игрой заключается в том, что последняя предоставляет инструменты, которые позволяют пользователю изменять существующие данные (или добавлять свои собственные данные). Какой бы язык вы ни выбрали, просто постарайтесь сделать свою игру максимально управляемой данными и избегайте жесткого кодирования любого игрового контента. Практически любой язык, который вы, вероятно, выберете, может читать данные с диска, что является большинством того, что вам нужно.
Это также на полпути, если вы просто создадите инструменты для своего личного использования (например, ваш собственный редактор уровней), а затем улучшите их и поделитесь ими с вашими пользователями. Редактор уровней Super Meat Boy был в значительной степени , что усовершенствованный verision инструмента используется в процессе разработки игры.
И в зависимости от типа игры вы можете разрешить пользователям писать сценарии поведения игры. В этом случае вам следует рассмотреть вопрос о включении языка сценариев в вашу игру с самого начала (либо вашего собственного, либо существующего, такого как Lua или Python, которые являются популярным выбором). Это также подпадает под категорию дизайна, управляемого данными. Если вы решите использовать существующий язык сценариев, возможно, стоит проверить, есть ли у языка программирования по вашему выбору привязки для этого языка сценариев (обычно в форме сторонних библиотек).
источник
Язык, который вы выбираете, на самом деле не определяет, насколько модифицируема игра, то, как вы используете язык, имеет большее значение.
Если большая часть вашей игры основана на данных (то есть данные игры определены в файле, который читается из вашего кода), игра может быть очень изменяемой. Это можно сделать практически на любом языке. Использование языка сценариев также облегчает модификацию игры.
Однако это не означает автоматически, что неиспользование этих вещей делает невозможным модификацию игры. Minecraft, например, не очень модифицируемая игра, однако есть довольно хорошие декомпиляторы для Java и очень большое сообщество для Minecraft, поэтому было сделано множество инструментов, чтобы сделать Minecraft модифицируемым (различные загрузчики модов, Bukkit). С помощью этих инструментов можно модифицировать Minecraft (однако в некоторых странах они, вероятно, технически незаконны).
Лучший совет, который я могу вам дать, это использовать инструменты, которые вы хотите использовать моддерами; Если вы определяете NPC из файла, он может быть модифицирован, если вы используете его в коде, это, вероятно, не может быть.
источник
Java прекрасно подходит для написания модных игр.
Сказав это, лучший способ сделать игру модифицируемой - обычно использовать динамический язык, который можно встроить в более широкое приложение и использовать для сценариев. Обычно вам нужен динамический язык, потому что смысл в том, чтобы иметь возможность взаимодействовать с кодом во время выполнения, не проходя весь цикл компиляции / сборки / тестирования.
Некоторые варианты выбора динамического языка:
источник
Есть более простой способ сделать это в Java, хотя это немного небрежно. Все, что вам нужно сделать, это взять точечные Java-файлы в папку и затем поместить этот пакетный файл в папку, назовите ее Run:
javac /src/.java Java / src /
Примечание. Вы можете добавить столько классов, сколько захотите. Примечание: в последней строке убедитесь, что НЕ помещены какие-либо расширения, такие как .java, .exe, .bat, ect.
В основном это будет просто перекомпилировать код при каждом запуске игры, поэтому, если исходный код игры изменится, он скомпилирует его и запустит вновь скомпилированную игру ... К сожалению, вы не можете добавлять моды других людей в игру.
источник