PDA

Просмотр полной версии : [Вопрос] Язык скриптинга для игрового движка



KrutoyKrosch
07.11.2017, 19:58
Пишу простенький игровой движок, вроде как загрузка объектов из файла, камера, рендер - сделать получилось. Для начала думаю сделать обычный майнкрафт (чисто для теста первой версии движка), так как там столкновение с объектами просто проверять, не нужно какие-то супер знания в физике и моделировании. Ну вот нужно для этого приделать к движку какой-то язык скриптинга.

Чтобы можно делать что-то на подобии (Pawn):



new
playerid;

public OnGameEngineInit()
{
playerid = CreatePlayer(0.0, 0.0, 1.0, 180.0);
LoadInEngineObjectFile("file.cord");

SetPlayerText(!"Добро пожаловать в игру");
}

public OnPlayerPressKey(id)
{
new
Float:x, Float:y, Float:z;

if(id == "A")
{
GetPlayerPos(playerid, x, y, z);
SetPlayerPos(playerid, косинусы, синусы, плюс минус бла бла бла короче сдвинуть игрока влево);
}
}


Ну и не знаю какой язык лучше выбрать, JS судя по мемам про очистку памяти лучше не нужно брать, Pawn ну хз, Lua мне синтаксис не очень нравится.

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

Fallen A.
07.11.2017, 20:11
ОФФТОП: ааааааа, пихапи давай!!!111!!11

ziggi
07.11.2017, 20:41
Я за JS, но если не хочешь, то Squirrel

$continue$
07.11.2017, 21:41
Angel (https://habrahabr.ru/post/145340/)Script (https://en.wikipedia.org/wiki/AngelScript), Lua, JS, Squirrel (https://en.wikipedia.org/wiki/Squirrel_(programming_language))

Daniel_Cortez
07.11.2017, 23:42
Дисклеймер: для скриптинга я использую преимущественно Pawn, поэтому моё мнение может быть ангажированным.

Выбор языка прежде всего зависит от целей создания игрового движка.
Если требуется язык с низким порогом вхождения, прекрасно подойдут Lua, Pawn или JavaScript.

Нужна динамичность? В этом плане в проигрыше разве что Pawn, т.к. в нём вся память статическая и нельзя динамически зарезервировать новый блок памяти. Обойти это можно разве что путём создания своих нативных функций для работы с памятью.

Нужно что-то надёжное? Динамические языки, такие как Lua, JavaScript и Squirrel вам вряд ли подойдут, поскольку в них нет даже такой элементарной штуки, как диагностические сообщения от компилятора, равно как и самого компилятора вообще (интерпретатору скармливается не скомпилированный файл, а исходный код скрипта). Как результат - обилие ошибок, о которых обычно становится известно только в самый последний момент.
Пример на Lua:


local my_var

-- При попытке присвоения в имени переменной допущена опечатка ("my_val" вместо "my_var").
-- В результате будет создана глобальная переменная my_val, а в my_var ничего не запишется.
my_val = 1

Не знаю, можно ли допустить подобную ошибку ещё и в AngelScript, но компилятора для этого ЯП тоже нет, соответственно и диагностики при компиляции тоже.
Отдельного упоминания стоит отсутствие статической типизации (даже опциональной) в Lua и JavaScript, из-за чего открывается возможность наплодить ещё больше багов (например, пропустить один из аргументов функции и передать строку вместо числа). Как сказал один человек, имя которого я, к сожалению, уже не помню, "Программисты бывают двух типов: те, кто знают, что статическая типизация иногда бывает нужна, и те, кому ещё нет 20."

При каждом кадре или апдейте игровой логики нужно обработать большой массив данных, и поэтому важна производительность? В Pawn с этим меньше всего проблем, т.к. всё статическое и архитектура интерпретатора очень простая. В свою очередь, в Lua и JavaScript могут быть проблемы, т.к. из-за динамичности языка интерпретатору нужно совершить кучу доп. проверок на каждый чих. Справедливости ради следует отметить, что в LuaJIT проблема частично решена путём отслеживания наиболее частого пути выполнения JIT-компилируемого кода и рекомпиляции с оптимизацией под этот путь.



Также по своему опыту могу сказать, что Lua - ни что иное, как ловушка для разработчика: язык простой для освоения, но очень сложный в плане отладки и диагностики кода - года 3-4 назад мне немало часов пришлось потратить на поиск скрытых ошибок и костылизацию своего кода (например, блокировка модификации записей в таблицах, используемых в качестве классов), когда я пытался писать простые игры с помощью фреймворка LOVE (http://love2d.org).
В JavaScript основные принципы практически те же самые, потому опыт может быть примерно тот же.
При использовании в одном из своих приложений Pawn многого не хватало, пришлось самостоятельно сделать менеджер по загрузке и выполнению скриптов, нативные функции для работы с динамической памятью, аналоги CallLocalFunction, CallRemoteFunction и SetTimerEx из SA-MP, а также обработчик ошибок времени выполнения с трассировкой стека и отображением пути выполнения кода, как в crashdetect (сейчас как раз пытаюсь их выделить из приложения в отдельную библиотеку, в скором времени опубликую на GitHub).

KrutoyKrosch
08.11.2017, 03:29
Не знаю где может пригодится динамическая память для скриптинга... Например нужно узнать координаты какого-то объекта в игре (объекты динамические), но при этом мне не известны все их координаты потому что нету динамической памяти для их хранения. Но в движке то они есть, просто функцию сделать GetCountObjectInGame(); и GetObjectPos(); и все

Насчет передать строку вместо числа... я писал сайт и там JS - передавал иногда число как строку и ничего не случалось, выводило нормально число. Тот же console.log(str);. Можно создать var str = 5; и потом спокойно в консоль 5 выведет. Но в других языках не знаю насчет этого.

Все таки Pawn выберу, более как-то привычней. А как кстати он подключается?)0)) Просто по другим языкам много туториалов, а тут гугл ничего не выдал......


только это нашел, далее просто не мог искать
https://i.imgur.com/qspWtxi.png