Я хочу сделать модную игру. Как это влияет на мой выбор языка программирования? [закрыто]

26

Я начал делать небольшие игры на Java, и я изучаю C # для более крупного проекта. Я бы очень хотел сделать игру с возможностью модификации, но кто-то сказал мне, что мне нужно придерживаться Java, если я хочу, чтобы игра была модифицируемой, хотя я не понимаю, почему.

Итак, какие характеристики языка программирования делают язык более подходящим для изменяемых игр?

наркоман игры
источник
3
Если вы хотите создать изменяемую игру, PhysicsFS может быть очень полезной библиотекой, о которой нужно знать. (Это не имеет ничего общего с физикой, не позволяйте имени обмануть вас. :))
Пол Манта,
10
«но кто-то сказал мне, что я должен придерживаться Java, если я хочу, чтобы игра была модифицируемой». Это, кстати, BS.
Рэй Дей

Ответы:

18

Это зависит от того, как вы хотите создать свою мод-систему. Я исследую два из них.

SDK

Скорее всего, вам потребуется, чтобы ваши моддеры использовали тот же язык, что и вы, и загружали моды через отражение (или подобное, в зависимости от того, какой язык вы выбрали). Это, очевидно, ограничит вас языками, которые могут выполнять позднюю привязку - и многие могут это сделать (даже C может выполнить позднюю привязку с некоторыми хитрыми LoadLibraryхитростями). Вы можете даже сделать мета-моддинг, где мод может содержать другие моды (например, скриптовые моды).

Первая проблема с этим подходом - скрытие внутреннего состояния. Взяв, например, C #, моддер может просто использовать отражение для доступа к закрытым членам, C также может это сделать (хотя требуется больше усилий).

Вторая проблема - хостинг. Людям не очень нравится чужой код, работающий в их системе без песочницы. В худшем случае вы могли бы написать мод, который настраивал бы «семенную коробку»; если он был установлен у интернет-провайдера, это может нанести серьезный вред их репутации.

Scripting

Моддеры будут использовать язык, такой как Lua, для создания модов. Вам потребуется либо язык, который может вызывать нативный код (для взаимодействия с Lua); или вам придется написать свой собственный язык сценариев на выбранном вами языке.

Первая проблема заключается в том, что интерпретируется большинство языков сценариев, что может быть неприемлемо для систем реального времени (хотя, см. LuaJIT); такие как игры.

По иронии судьбы вторая проблема все еще существует здесь; Взяв Lua в качестве примера, я был крайне разочарован тем, что в библиотеку core / default включены функции «обнуления», что делает его совершенно бесполезным в качестве изолированной среды (без больших усилий, удачи и обслуживания), трудно изобразить , как я зол об этом, но я действительно надеюсь , что они пили некоторые сильные коктейли , когда они включали в себя эти анти-функцию . Очевидно, вы могли бы легко избежать этого, если бы вы катались на своем собственном языке (см .: UnrealScript).

Наконец, стоимость взаимодействия со скриптовым движком может быть чрезмерной - опять-таки, взяв Lua в качестве примера, в сочетании с C #: C # имеет значительные накладные расходы при вызове нативных функций (через P / Invoke), а Lua - довольно «болтливый» API. Это может привести к проблемам, если при разработке «SDK-скрипта» требуется много разговоров между вашим основным языком и языком сценариев (обратите внимание, что в C на самом деле такой проблемы нет). Опять же, вы можете избежать этого, написав свой собственный язык сценариев (и в случае C # компилируя его в MSIL) и выполнив его самым быстрым способом в вашей [виртуальной] среде.

Поскольку скрипт в сущности работает в совершенно другой системе, чем ваш основной код, вы можете полностью контролировать доступ к внутреннему состоянию (если только они не делают какие-то причудливые вещи с ранее упомянутыми функциями оболочки).

Вывод

Я немного отклонился от темы, однако, что вы можете получить из этой стены текста, так это то, что вы должны иметь возможность создавать изменяемую игру на любом языке (я бы рискнул сказать, что вы можете ) - но на некоторых языках. может привести к большей работе. Я немного анальный о безопасности? Да, вы должны быть тоже, когда дело доходит до кода пользователя.

Джонатан Дикинсон
источник
В первом сценарии, который вы описали, вы говорите о том, что пользователь фактически программирует свою собственную динамическую библиотеку и вставляет ее в игру? Я видел это раньше в библиотеках (например, в аудио-библиотеке для добавления новых кодеков и т. Д.), Но, возможно, потому что я никогда не слишком много смотрел на моддинг, я никогда не сталкивался с подобным случаем для игры. Мне интересно это (поскольку пользователю кажется очень сложным узнать, как это сделать, и я обычно вижу моды доступными), знаете ли вы какой-нибудь пример? Большую часть времени я вижу специализированные инструменты, такие как редакторы мира с небольшим количеством сценариев.
Дэвид Гувейя
1
@DavidGouveia Я полагаю, что по крайней мере одна версия движка Paradox, используемого для Europa Universalis (и эквивалентных игр для разных периодов времени), поддерживала форму бинарного исправления (хотя это могло быть из-за того, что моддер исправил источник и перекомпилировал одну из игровые DLL вместо правильной поддержки SDK) в дополнение к более часто используемому моду путем изменения реализации файла данных.
Дэн Нили,
2
@DavidGouveia см .: Source engine; или даже плагины Winamp. Я думаю, что Quake даже работает так. Я понял, что вы используете C #; так что вы можете захотеть заглянуть в MEF (Managed Extensibility Framework): открыть интерфейс, загрузить его с помощью рефлексии и Боб - ваш дядя.
Джонатан Дикинсон
@JonathanDickinson О, я понятия не имел, что движок Source работал под этой моделью. Всегда представлял себе набор инструментов, таких как набор The Elder's Scrolls Construction. Спасибо за информацию (у меня была идея, как это работает, я подумал, что это может быть слишком сложно для обычного моддера). И я действительно смеялся над «Бобом - твой дядя» . :-)
Дэвид Гувейя
1
Re Lua: У этих ребят есть Lua с песочницей, подходящая для использования в программном обеспечении вики (и достаточно стабильная, чтобы использовать ее в английской Википедии). Я уверен, что вы могли бы адаптировать его к вашим потребностям, но некоторые части расширения соответствуют требованиям GPL, поэтому проконсультируйтесь с вашим адвокатом.
Кевин
16

Я бы сказал, что язык здесь не является решающим фактором, а то, насколько гибкой и управляемой данными вы делаете свою игру, которая его определяет.

Каждая игра запускается на наборе данных (например, все от уровней, сеток, конфигураций, предметов). Разница между обычной игрой и изменяемой игрой заключается в том, что последняя предоставляет инструменты, которые позволяют пользователю изменять существующие данные (или добавлять свои собственные данные). Какой бы язык вы ни выбрали, просто постарайтесь сделать свою игру максимально управляемой данными и избегайте жесткого кодирования любого игрового контента. Практически любой язык, который вы, вероятно, выберете, может читать данные с диска, что является большинством того, что вам нужно.

Это также на полпути, если вы просто создадите инструменты для своего личного использования (например, ваш собственный редактор уровней), а затем улучшите их и поделитесь ими с вашими пользователями. Редактор уровней Super Meat Boy был в значительной степени , что усовершенствованный verision инструмента используется в процессе разработки игры.

И в зависимости от типа игры вы можете разрешить пользователям писать сценарии поведения игры. В этом случае вам следует рассмотреть вопрос о включении языка сценариев в вашу игру с самого начала (либо вашего собственного, либо существующего, такого как Lua или Python, которые являются популярным выбором). Это также подпадает под категорию дизайна, управляемого данными. Если вы решите использовать существующий язык сценариев, возможно, стоит проверить, есть ли у языка программирования по вашему выбору привязки для этого языка сценариев (обычно в форме сторонних библиотек).

Дэвид Гувея
источник
5

Язык, который вы выбираете, на самом деле не определяет, насколько модифицируема игра, то, как вы используете язык, имеет большее значение.

Если большая часть вашей игры основана на данных (то есть данные игры определены в файле, который читается из вашего кода), игра может быть очень изменяемой. Это можно сделать практически на любом языке. Использование языка сценариев также облегчает модификацию игры.

Однако это не означает автоматически, что неиспользование этих вещей делает невозможным модификацию игры. Minecraft, например, не очень модифицируемая игра, однако есть довольно хорошие декомпиляторы для Java и очень большое сообщество для Minecraft, поэтому было сделано множество инструментов, чтобы сделать Minecraft модифицируемым (различные загрузчики модов, Bukkit). С помощью этих инструментов можно модифицировать Minecraft (однако в некоторых странах они, вероятно, технически незаконны).

Лучший совет, который я могу вам дать, это использовать инструменты, которые вы хотите использовать моддерами; Если вы определяете NPC из файла, он может быть модифицирован, если вы используете его в коде, это, вероятно, не может быть.

Эльва
источник
1

Java прекрасно подходит для написания модных игр.

Сказав это, лучший способ сделать игру модифицируемой - обычно использовать динамический язык, который можно встроить в более широкое приложение и использовать для сценариев. Обычно вам нужен динамический язык, потому что смысл в том, чтобы иметь возможность взаимодействовать с кодом во время выполнения, не проходя весь цикл компиляции / сборки / тестирования.

Некоторые варианты выбора динамического языка:

  • Groovy - отличный динамический Java-подобный язык, который может быть встроен в более крупные Java-программы.
  • Clojure - мощный динамический Лисп для JVM. Некоторым моддерам может быть сложно разобраться, но это исключительно мощный язык, и его можно легко внедрить. Еще не видел, чтобы он использовался для моддинга игры, но нет причин, почему бы и нет.
  • Lua - очень популярный игровой скриптовый язык. Я полагаю, что есть версии для JVM, которые вы можете использовать из Java (хотя я сам не пробовал их)
  • JavaScript - доступен на JVM через Rhino . Довольно хороший выбор для сценариев игры, так как многие люди знают JavaScript, плюс объектная модель-прототип очень хорошо подходит для игровых модов.
mikera
источник
-2

Есть более простой способ сделать это в Java, хотя это немного небрежно. Все, что вам нужно сделать, это взять точечные Java-файлы в папку и затем поместить этот пакетный файл в папку, назовите ее Run:

javac /src/.java Java / src /

Примечание. Вы можете добавить столько классов, сколько захотите. Примечание: в последней строке убедитесь, что НЕ помещены какие-либо расширения, такие как .java, .exe, .bat, ect.

В основном это будет просто перекомпилировать код при каждом запуске игры, поэтому, если исходный код игры изменится, он скомпилирует его и запустит вновь скомпилированную игру ... К сожалению, вы не можете добавлять моды других людей в игру.

Джейкоб Пикке с
источник
Джейкоб, я не думаю, что ты понял вопрос, пожалуйста, прочитай ответы и посмотри, поможет ли это тебе понять то, что здесь обсуждалось.
Викки