2015-09-23 3 views
6

Я хотел бы добавить возможности сценариев в свой движок игры на C++.Racket как язык сценариев в игровом движке

У меня есть Engine.exe, Physics.dll, Audio.dll и я добавляю Scripting.dll, который ракетка обертки высокого уровня.

Engine.exe загружает Physics.dll и устанавливает физический мир, загружает Audio.dll и устанавливает звуковой мир. Предполагается загрузить Scripting.dll, настроить привязки на Physics.dll, Audio.dll и загрузить игровые скрипты.

AFAIK есть два возможных способа встроить ракетки в программу C++:

Использование Foreign Interface кажется странным из-за необходимости загружать Physics.dll, Audio.dll два раза: сначала от Engine.exe, а затем от сценария игры.

Письмо Extensions выглядит более привлекательным, поскольку позволяет выполнять привязки скриптов на стороне C++. С другой стороны, вам нужно построить расширение с помощью raco ctool, связать его с объектным файлом mzdyn - что тоже выглядит неудобно: почему бы не сделать mzdyn статической библиотекой?

Я хотел бы реализовать один метод, например. setupScriptBindings(), как в Physics.dll, так и в Audio.dll, и называть его от Engine.exe при запуске.

Есть ли простой способ сделать это?

+0

Хм, возможно, это [это] (http://docs.racket-lang.org/inside/embedding.html) описание помогает. –

+0

Hm ... ссылки, которые вы предоставляете, говорят о вложении C/другого кода ** в ** программу Racket. Из вашего описания, я думаю, вы хотите, чтобы это было наоборот, например. встраивание Racket в ваше приложение на C++: http://docs.racket-lang.org/inside/embedding.html Хотя самым простым и, вероятно, самым чистым решением было бы определить какой-то протокол для управления вашими игровыми объектами, а затем запустить ракетку как новый процесс, сообщающий использование сокетов или другого механизма IPC. –

+0

Оффтоп: Ракетка была успешно использована в производстве видеоигр Naughty Dog. См. [«Ракетка на Playstation 3»] (http://www.youtube.com/watch?v=oSmqbnhHp1c) и [«Разработка сценариев на основе состояния в Uncharted 2: Among Thieves»] (http: //www.gameenginebook .com/ресурсы/gdc09-statescripting-uncharted2.pdf). –

ответ

3

Используя как расширение, так и методы FFI для подключения кода Racket к C, я должен сказать, что подход FFI - это много приятнее. Связывания в Racket с функциями C хорошо определены и надежны, а работа с типами C в Racket очень приятная. Единственным недостатком использования подхода FFI является то, что AFAIK, ваша программа Racket должна быть приложением драйвера.

С внедрением встраивания ваш исполняемый файл C/C++ является драйвером, но объявление интерфейса с кодом Racket гораздо более ручное и подверженное ошибкам. Не говоря уже о том, что вам нужно либо разобраться в raco ctool, либо воспроизвести его, либо использовать систему сборки ракетки. Для наших целей мы запустили извлечение источников ракетки и построили их сами. Я не рекомендую этот подход.

В конечном счете, для моих целей, когда мое приложение было приложением Racket с иностранным файлом .DLL/.so, который он загрузил для функций C, работал лучше всего, но похоже, что вы можете придерживаться подхода внедрения.

+0

Спасибо. Да, мне нужно встроенное решение. Хотя вы говорите, что это может быть сложно, создание Racket из источника кажется более привлекательным для меня. Если бы вы могли привести пример привязки «native» ↔ «script» из вашего подхода, основанного на внедрении, это было бы очень полезно. Какую форму выполнения сценария вы выбрали: обычный текст, [байт-код] (http://docs.racket-lang.org/raco/make.html) или [автономный исполняемый файл] (http: //docs.racket-lang. орг/Raco/exe.html)? –

+2

Мы использовали бы обычный текст или байт-код. Байт-код заметно быстрее, но вам нужно позаботиться о том, чтобы он обновлялся или что Racket скомпилирует его, когда это необходимо. –

+2

И наш родной <-> связывание скриптов выглядело как пример в документах ... ничего особенного. –

Смежные вопросы