|
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
|
||||||||||||||||||||||||||||||||||||||
Как подключить и использовать LUA-скрипты в своих приложениях написанных на C++Builder (6)27.11.2009, 21:38. Показов 38225. Ответов 7
Метки нет (Все метки)
По просьбе KTYJIX пишу небольшую инструкцию, как подключить и использовать этот замечательный язык Lua в своих приложениях написанных на C++Builder(6). Надеюсь, кому-нибудь пригодится.
Небольшое вступление: Когда-то я искал для себя какую-нибудь библиотеку которая могла бы выполнять скрипты в приложении. Мне хотелось, чтобы пользователь мог извне(скриптом) управлять внутренним состоянием приложения. Я нашел такую интересную штуку, как VBScript ActiveX. Если все сделать как следует, то у нас получится типа как VBA в Word. Статейку как проинициализировать VBScript в своем приложении любой желающий может прочесть тут: http://www.rsdn.ru/article/com/wscript/vstr_WS.xml. Какое-то время я пытался пользоваться этим бейсиком, но как-то оно у меня не очень хорошо работало, и поэтому я продолжал поиски. Как-то я установил себе игру Сталкер. Я в нее играл, играл, потом начал копаться в игровых файлах, и увидел, что скрипты написаны на Lua. Начав гуглить я обнаружил, что в нете есть полно статей о том, как программировать на этом языке. Искать место где можно скачать луа долго не прийдется. Официальный сайт находится вот тут: http://www.lua.org. На этом сайте можно скачать исходники, скомпилированные библиотеки, почитать документацию. С этого сайта нас перенаправляют вот сюда: http://luabinaries.luaforge.net/download.html, где и лежат сами архивы с файлами. Для начала зайдите на http://luabinaries.luaforge.net/download.html и скачайте lua5_1_4_Win32_dll8_lib.zip(вы можете скачать архив в аттаче, там все уже готово для использования в билдере). Конечно, если хотите смотреть в исходники, качайте их себе на здоровье. Компилируются они очень хорошо на VS2008(лично пробовал). Так вот, после того, как вы скачали себе архив зайдите в него, и сделайте следующее: 1. lua5.1.dll lua51.dll в Windows/system32(Вы конечно же можете копировать эти библиотеки в каждый новый проект, но мне лень). 2. Создайте папочку lua в <CBuilder>/lib, и скопируйте в неё lib файлы из архива. Так как файлы lib от Visual Studio не совсем совместимы с билдеровскими, нужно преобразовать их с помощью утилиты COFF2OMF которую можно найти в bin папке Билдера(В приаттаченом архиве эти библиотеки уже сконвертированы). 3. Создайте папку lua в <CBuilder>/include и забросьте в неё файлы из include папки архива. Теперь можно начинать делать простейшую программу с применением Луа. Создайте новый проект, и с помощью «Project/Add to Project» добавьте в него из папки lib/lua файлы lua5.1.lib и lua51.lib. Теперь, когда проект подготовлен к написанию кода, нужно задуматься о том, что Луа – это Сишная библиотека, поэтому ни какими классами там и не пахнет. В Интернете вы можете найти С++ врапперы типа luabind, но мне, например, вся их функциональность не нужна, поэтому воспользуемся примитивнейшим враппером. Вот его код:
Напишем простое приложенице, которое будет выводить Hello World в Label на форме. Добавьте с помощью include файл lua.hpp в ваш проект. Теперь создаем глобальную переменную
Теперь нужно создать функцию, которую можно будет вызвать из Луа. Функции должны иметь такой вот формат: int Имя_функции(lua_State*st) Cоздаем функцию int Lua_Message(lua_State*st).
В Луа все параметры передаются через стек, но только не через стандартный стек приложения, а через собственный, луовский. Луа не ведет контроля за количеством параметров которое было передано функции, аргументы просто пихаются в стек, сколько бы их не было(но стек не безразмерен, есть ограничение). Нужно помнить, что аргументы помещаются в стек слева направо, то есть самый левый аргумент будет в самом низу стека. В этой функции мы берем Луовский контекст, смотрим количество параметров(GetTop, правда, не учтет вложенность функций) переданных ей. Если параметров больше одного, то функция ToString снимет значение по заданному индексу. !!!В Луа переменные не параметризованы, поэтому в одну и ту же переменную можно помещать и строки и целые числа и дробные числа, конвертирование происходит автоматически. Возвращаемое значение, вроде бы, как говорит о том, сколько переменных возвращает наша функция. Так как в данном примере возвращаемого значения нет, то и return 0. После этого нужно зарегистрировать эту функцию в Луа контексте. В событии FormCreate запишем следующее:
Теперь нужно на форму кинуть один Memo и кнопку. В Memo впишите строки
Заметьте, в Луа конкатенация строк не +, а две точки (..) Как видите, вызывать из Луа функции и передавать нашей программе параметры проще простого. Теперь рассмотрим, как же Луа может узнать о состоянии нашей программы. В принципе, так как можно регистрировать функции, можно регистрировать в Луа и переменные. Одно ограничение – переменные регистрируются только для чтения, поэтому их значение нельзя изменять непосредственно, а только через вызов функций. В моем же случае скрипт будет получать информацию из хостового приложения через те же функции. Пример: Дописываем новую функцию, которая возвращает скрипту строку с приветствием на случайном языке:
Теперь в FormCreate нужно не забыть зарегистрировать эту новую функцию:
Исходник: lua5_1_4_Win32_bin.zip Дополнение: Пример кода для взаимодействия функций Си и функций Lua Полезные ссылки по данной теме: Непонятки с LUA (файл не сохраняется) Вторую неделю пытаюсь подружить Lua и BCB6, и наблюдаю их несовместимость Остановка скриптов, luabind и потоки https://www.cyberforum.ru/cpp-... 00321.html Как передать из кода луа в программу на с++ массив чисел https://www.cyberforum.ru/cpp-... 00324.html Как можно использовать функции написанные на луа Возможно ли сделать самому качественный экспорт с++ классов, пространств имен и прочего в луа?
17
|
||||||||||||||||||||||||||||||||||||||
| 27.11.2009, 21:38 | |
|
Ответы с готовыми решениями:
7
Lua-скрипты: как использовать в играх
Кто как проверяет наличие интернета в своих приложениях |
|
Задающий вопросы (%
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
|
|
| 27.11.2009, 22:34 | |
|
Думаю тему можно закрепить в шапке раздела.
Отака, как всегда, низкий поклон и гигантское спасибо.
0
|
|
|
18 / 18 / 1
Регистрация: 24.09.2009
Сообщений: 98
|
|||||||||||
| 22.02.2010, 23:58 | |||||||||||
|
Итак ,KTYJIX, поясняем луа)))
test.h
0
|
|||||||||||
|
2 / 3 / 0
Регистрация: 20.09.2009
Сообщений: 101
|
||||||||||||
| 16.07.2010, 23:59 | ||||||||||||
|
удалено Спасибо!!!! я очень долго искал такую статью YAHOO!
![]()
Добавлено через 2 часа 51 минуту А я хотел бы знать откуда ты взял эти:
Добавлено через 46 секунд как мне хделать много функциональней ?
0
|
||||||||||||
|
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
|
|
| 14.05.2011, 11:06 | |
|
Если кому-нибудь удалось LuaBind прикрутить к CBuilder, отпишитесь пожалуйста.
Очень нужно.
0
|
|
|
|
||||||
| 15.05.2011, 12:03 | ||||||
|
Итак, пример на взаимодействие Lua и C.
В программе из кода на Си вызывается функция на Lua, а из неё - функция на Си. Программу писал максимально примитивно, лишь для демонстрации того, как это вообще делается. В процессе исполнения программы должно вылезти вот такое
7
|
||||||
| 15.05.2011, 12:03 | |
|
Помогаю со студенческими работами здесь
8
Скрипты lua Макросы и скрипты (Lua) Не компилируются скрипты LUA! Как использовать русские символы в приложениях Qt? Как использовать в приложениях браузерный движок WebKit Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|