Как стать автором
Обновить

Комментарии 33

Нехорошо-то как! Редактирую пост несколько раз, выпускаю его на публичное осмотрение, а там автозавершение — вот такое было
	script.DoFile("script.lua");
	script.Close();

	// Пауза после скрипта
	_getch();
}
</lua_cfunction></lua_cfunction></lua_cfunction></lua_cfunction></lua_cfunction></int></int></char></char></time.h></windows.h></conio.h>

Хорош Lua, но не по душе мне паскалеподобный синтаксис, в свое время я выбрал язык Squirrel для своих скриптов.
Тогда, когда дело касается скорости и потребления памяти — люди выбирают LuaJIT. На самом деле он еще быстрее чем V8. Может синтаксис и не очень, но когда дело касается производительности, то выбирать только из LuaJIT или V8
Пруф 1(и замечу что там не LuaJIT, а Lua)
Пруф 2(не связанный с Squirrel, для сравнения Lua и LuaJIT но все равно информативный)
Часто использую Luajit в веб проектах, скорость работы впечатляет. А к синтаксису можно привыкнуть.
Если сильно хочется, можно просто переписать лексер. Благо что там исходники очень аккуратные и весьма понятные.
А как вам мой вариант? habrahabr.ru/post/165765/
Я писал библиотеку, пытаясь облегчить написание биндингов, и, обходясь только C++11, не используя кодогенераторы.

А вообще, попробуйте swig, в нем с поддержкой lua, конечно, не всё гладко, но возможности впечатляют.
Есть либы для биндинга с boost::bind, там все давно работает.
Есть проекты, в которые, в силу определенных причин, не хочется/нельзя тащить мега_клевый_фреймворк_для_всего, чтобы под ним не подразумевалось, поэтому, по моему, хорошо, что есть много различных решений одной и той же задачи.
Кажется, автозавершение кода забаговано.
Иначе куда делись template<>, раз вместо них стоит template? :)
Дельный совет
Да, какие-то странные артефакты наблюдаются. C++666?

// Тут мы считываем количество аргументов и каждый аргумент выводим
for(int i = 1; i (i);
cout > str;
Высшим разумом Хабра некоторый код был страшно покоцан. Завтра займусь исправлением этого мракобесия со смещением циклов, строк и даже пары функций (сейчас сижу с телефона)
Ну и тогда вот в этих (и подобных) объявлениях приведите регистр (t/T) к общему знаменателю:

template<class t> void Return(T value);
Если кроссплаторменность в проекте не требуется (работаем только на Windows), то лучше использовать Windows Scripting Host для таких вещей. VBScript и JScript сразу идут из коробки + много других языков можно подключить, хоть даже Perl.
Видимо требуется кроссплатформенность :)
Судя по #include <conio.h>, таки не требуется.
НЛО прилетело и опубликовало эту надпись здесь
1. Возможно, windows.h не стоил одного MessageBox, но мне показалось, что так будет эффективней результат. P.S. никогда не делал кроссплатформ в Visual Studio
2. Луа сам по себе безопасен, если в скрипте внезапно есть ошибка, он не выполнится в 100% случаев. Разве что стоит добавить проверку на существование скрипта в папке с программой
3. Эта функция возвращает значение в луа функцию. А обычный return n; в функции для регистрации всего-то показывает через n количество возвращаемых значений
4. Новичку это поможет, а вы потратили 10 секунд на пропуск таких объяснений :)
5. Ну да, ну да, я в курсе про мощь таблицы, реализацию ООП в луа и проч. Впрочем, спасибо за замечание, я об этом упомяну
6. Думаю, 95% сидящих тут, правильно меня поняли.

Без проблем, придирайтесь :)
А стиль кода это просто глупо, у всех свои вкусы, и я не собираюсь доказывать, что пишу правильный труЪ код
НЛО прилетело и опубликовало эту надпись здесь
Понимаете, тут дело не в субъективном стиле, а во вполне объективных граблях. Вещи вроде using namespace в заголовочном файле, Create/Close вместо конструктора и деструктора (и ладно бы еще они коды ошибок возвращали — так они у вас void), использование идентификаторов вида _SCRIPT_H_ (FYI, идентификаторы, начинающиеся с подчеркивания, за которым следует заглавная буква — зарезервированы для компилятора и стандартной библиотеки, причем последняя в VC++ этим активно пользуется) и т.д. Это реально просто плохой C++, и когда такое подается в качестве туториала, пусть и не по плюсам — это плохо, потому что это будут читать новички, и учиться делать так же.
Скриптовый язык это классно, но необходимость общения через виртуальную машину съедает все профиты для среднесложного проекта. Проще написать какой-нибудь редактор XML и свой рудиментарный псевдоязык, который будет уметь десяток простых комманд, чем биндить в VM скриптового языка весь набор нужных классов, функций и объектов.
Отчасти поэтому многие не сильно сложные игры пишутся целиком на Lua.
НЛО прилетело и опубликовало эту надпись здесь
1. XML не поддерживает и десятой части возможности Lua. Да и вообще их сравнивать нельзя. XML — язык разметки, а Lua — скриптовый язык.

Поэтому я и написал — XML и свой рудиментарный псевдоязык. Первый для загрузки данных и всего того что описал автор:
В игре создается больше оружия, больше диалогов, больше меню, больше etc.
Одна из самых главных проблем, возникающих в связи с нововведениями — поддерживать бессчетное множество оружия и бейджиков довольно сложное занятие.


Второй — для собственных минискриптов типа простых реакций на триггеры.

Когда у вас есть огромный проект, который компилируется несколько часов,

Когда у вас есть огромный проект, действуют совсем другие законы. Я говорил о своей собственной колокольне, о проектах которые пишутся силами 1-2 программиста.
Из собственного опыта, после поддержки подобного велосипеда год-два, он постепенно обрастает свистелками и прочим до такой степени, что все равно получается полноценная VM. Только не в пример более забагованная, чем Lua.
Не особо то и съедает, когда есть предварительная компиляция в машинный код на этапе загрузки.
Каким образом компиляция в байткод спасает от необходимости писать 100500 биндеров для игровых классов и функций?
Как можно в 21м веке использовать методы Create и Close вместо конструктора с деструктором?
В конструкторе лучше не делать всякие вещи в которых возможны ошибки. А методы create ( init и т.п. ) один из методов борьбы с ними.
А зачем тогда умные указатели придумали? Без конструкторов и деструкторов нет RAII никакого и в случае исключения Close уже никогда и не вызовется.
В конструкторе можно смело делать всякие вещи, в которых возможны ошибки. Просто при этом надо кидать исключения.
Первая мысль — написать свой интерпретатор своего скриптового языка, выкидывается из мозга через несколько секунд. Логика игрока определенно не стоит таких жутких затрат.


Тут есть подвох. Ядро языка писать несложно, никаких больших затрат там не случается. А вот «вывести концы» собсвтенно объектной модели так, чтобы ей мог с удовольствием пользоваться скриптер, — вот это задача намного более сложная и интеллектоемкая. И она не решается простой прикруткой Луа, Питона или чего угодно еще.

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

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

А вот в третий раз от меня ненадолго отвернулось начальство, и, пока никто не видит, я внезапно написал собственный язык с блекджеком и шлюхами. Точнее, писал его не я, я только программировал. Сам язык создавал по-сути Женя Гомельский, геймдизайнер, который просто знал, чего хочет и умел это сформулировать. Язык получился местами очень даже ничего. Там были предлоги, похожие на именнованные параметры в Обджектив-Си, местоимение «it», как в Хаскелевском ghci, метапрограммирование в стиле миксинов Ди, и даже некоторые уникальные вещи, как, например, переменная по умолчанию. Ну, можно было, например, написать цикл так: [for {i=0} {i++; i<10}], а можно так: [10x]. Во втором случае счетчиком цикла считалась переменная по умолчанию "?".

Мы выпустили с ним пару проектов, вполне между прочим успешных, а потом перешли на новую платформу и забросили скрипты вообще в пользу машины состояний и визуального программирования. И, честно сказать, это было определенное облегчение. Писать языки надо уметь, я не умею. Кроме красивых фичей, он закономерно оброс костылями и велосипедами. Если код на языке был вполне даже читаем, то код самого интерпретатора заболотило по самые осины. Его стало очень сложно поддерживать. Причем, не само ядро, конечно, там-то как раз ничего сложного изначально не было, а вот все эти «концы». Например, в одном проекте меню выезжает справа, в другом — снизу, и в язык попадают, условно говоря, две взаимоисключающие функции для красивого выезда меню. И вот так вот все.

То есть, какой вывод я хочу сделать. Программировать сложно. Без опыта и усердия любой выбор скриптового решения приведет к говну и костылям.

А туториал годный, кстати.
Плохая статья! Автор, для кого была написана эта статья? Если для тех к то не знаком с Lua, то она вообще ничего не объясняет и только запутает. Если для тех кто знаком с Lua, то тут вообще ничего полезного кроме как боле менее удобный способ получение аргументов функции (удобнее чем просто из стека руками вытаскивать), который приводится в любой статье про Lua + C++.

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

В общем еще раз задумайтесь для кого эта статья и что вы хотели в ней описать.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации