Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #64, МАРТ 2006 г.

рецепты lua

АЛЕКСАНДР ГЛАДЫШ

Спецвыпуск: Хакер, номер #064, стр. 064-042-3


print = function(...)

for i = 0, arg.n -1 do

__console_print(tostring(arg[i]) .. "\t")

end

__console_print(arg[arg.n] .. "\n")

end

Если нужна высокая гибкость или производительность, ты можешь написать свою функцию __console_print на C/С++, которая работает непосредственно с виртуальным стеком интерпретатора, по образцу print из базовой библиотеки функций (luaB_print() в файле lbaselib.c исходников Lua). Фактически ты только продублируешь ее исходный код, заменив в нем вызов fputs() на вызов нужной функции. Соответственно, для замены стандартного print в Lua достаточно одной строчки:

print = __console_print

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

подключение игры к движку

Вместе с языком для подключения языка к твоей программе поставляется библиотека на C (Lua C API). Для взаимодействия с языком C интерпретатор Lua использует виртуальный стек. Когда из скрипта вызывается функция на C, она получает чистый экземпляр стека, который независим от стеков других функций, вызванных на данный момент, и содержит аргументы, переданные в данную функцию. Значения, возвращаемые функцией, тоже передаются через стек. Большинство функций Lua C API работают и с виртуальным стеком. Для удобства эти функции не следуют строгой стековой дисциплине, когда можно использовать только операции push и pop, но позволяют обращаться к значениям, содержащимся в стеке, по их абсолютной или относительной позиции. Подробности о работе с виртуальным стеком интерпретатора Lua расписаны в Lua Reference Manual.

Чаще всего больше удобств дает работа на более высоком уровне, который предоставляют различные библиотеки-обертки. Тем не менее полезно уметь работать с интерпретатором непосредственно на уровне Lua C API, хотя бы чтобы понять, что происходит на самом деле. К тому же для некоторых специфических задач бывает просто недостаточно функциональности, предоставляемой библиотеками-обертками.

Язык Lua специально создавался как язык расширения функциональности (extension programming language), поэтому достаточно легко организовать взаимодействие кода на Lua с кодом на C (и, следовательно, C++).

Помимо Lua C API, существует некоторое количество оберток для этой библиотеки, призванных повысить удобство работы с Lua из C и C++. Такие обертки делятся на две основные группы: 1) генерируют прослойку межъязыкового взаимодействия автоматически на основе данных, подготовленных специальным образом; 2) служат для облегчения ручного создания такой прослойки.

Несмотря на обилие оберток для подключения Lua, стоит изучить Lua C API — получишь самое полное представление о том, что происходит в программе. К тому же при всей своей мощи сам API достаточно небольшой. Необходимую информацию ищи в Lua Programming Manual и Programming With Lua.

На сегодня из библиотек для обеспечения межъязыкового взаимодействия C++ с Lua наиболее развиты:

? toLua, toLua++ (www.tecgraf.puc-rio.br/~celes/tolua, www.codenix.com/~tolua);

Назад на стр. 064-042-2  Содержание  Вперед на стр. 064-042-4