[Logo]
LUA Форум
  [Search] Поиск   [Recent Topics] Последние темы   [Hottest Topics] Горячие темы   [Members]  Список участников   [Groups] На главную страницу 
[Register] Регистрация / 
[Login] Вход 
Как лучше связать C++ переменную и Lua-переменную?  XML
Индекс форума » LUA: Общие вопросы
Автор Сообщение
Jumangee
Новичок

Зарегистрирован: 02/05/2008 14:34:49
Сообщений: 5
Оффлайн

Вгрызаясь в доки про луа, не смог понять как же сделать сабж

Можно конечно перед запуском скрипта обновлять значения в луа, а после луа обновлять их оттуда, но решение какое-то кривоватое... или так тоже кто-то использует? Хочется получить "раасширяемое" решение.

Например, как я понял, c-closure - делается для того, чтобы, например после изменения переменной(ых) в скрипте, вызвать одну c-функцию и она будет иметь доступ к свои переменным, типа этого (lua):
x = 1
y = 2
update_xy() // c-функция читает x и y и обновляет состояние программы

но это не совсем то что мне нужно

Насколько я понимаю, для того чтобы мне сделать что мне нужно, необходимо в луа запихнуть свой класс, у которого как-то перегрузить оператор присваивания (=), тогда возможно получится что-то навроде этого:

x = cppValue("x"); // здесь c-конструктор сопоствляет Lua-Cpp значения
x = 10; // если возможно, вызывается "set"-метод класса
y = cppValue("y");
y = 15;

Такое было бы наверное самым оптимальным решением.
Кто как делает?
smz
ГУРУ

Зарегистрирован: 14/03/2008 13:23:00
Сообщений: 245
Оффлайн

А зачем связывать эти переменные (и заниматься их синхронизацией)? Может быть лучше иметь одну переменную (либо в Lua, либо в C++) и обеспечить к ней доступ с "противоположной" стороны? Нельзя ли привести конкретный пример, для чего это нужно?
Jumangee
Новичок

Зарегистрирован: 02/05/2008 14:34:49
Сообщений: 5
Оффлайн

Вообще, мысль интересная Но это вариант с выгрузкой данных в луа (установкой значений на старте, и получением при завершении)
Опять же, тогда вопрос встает - как лучше обеспечить доступ к таким переменным из c++?

Смысл такой, есть некий набор "переменных", к которым будут иметь доступ скрипты, а эти переменные потом будут обрабатываться c++ кодом, например - для "визуализации" этих параметров (как пример, - параметры персонажа игры - отображаются где-то в каком-то виде )

Опять же, надо ведь продумать как из луа "указать" что именно этот параметр - отображать, причем отображать так-то, что этот - текст, а этот - число ну или наподобии

Пришло в голову такое решение:
луа:

x = value("x", 5);

где value это с-функция, которая создает переменную x в списке параметров (которые потом и инициализирует её 5ой. Но потом и работать с этими параметрами придется функциями типа set_as_visible("x", "int")

В общем, просто не уверен что всё это будет гибко и удобно
smz
ГУРУ

Зарегистрирован: 14/03/2008 13:23:00
Сообщений: 245
Оффлайн

Ну допустим, есть переменные Speed и Name, первая - число, а вторая - стринг. Lua-скрипт изменил значения переменных и вызвал из C++ ф-цию, например update. C++ легко получает эти и другие значения, например из заранее известной таблицы.
Так в чём проблема, можно ли её кратко сформулировать?
Strijar
ГУРУ

Зарегистрирован: 08/02/2008 21:28:09
Сообщений: 223
От: СПб
Оффлайн

Еще проще - хранить такие значание в таблице с определеным методами __index и __newindex (через метатаблицу). Тогда при записи и чтении этих "переменых" будут автоматически вызываться функции Си

Лучше быть белым волком, чем серым человеком.
[WWW]
smz
ГУРУ

Зарегистрирован: 14/03/2008 13:23:00
Сообщений: 245
Оффлайн

Strijar wrote:Еще проще - хранить такие значание в таблице с определеным методами __index и __newindex (через метатаблицу). Тогда при записи и чтении этих "переменых" будут автоматически вызываться функции Си
Да, это удобно, если предполагается немедленная реакция на изменение. Но иногда нужно изменить целый ряд переменных, и лишь затем сделать обновление.
Strijar
ГУРУ

Зарегистрирован: 08/02/2008 21:28:09
Сообщений: 223
От: СПб
Оффлайн

Тогда вообще не вижу проблем. Переменые глобальны и вызов функции для обновления.

Лучше быть белым волком, чем серым человеком.
[WWW]
Jumangee
Новичок

Зарегистрирован: 02/05/2008 14:34:49
Сообщений: 5
Оффлайн

Переменые глобальны и вызов функции для обновления

Это как я описал в первом посте, так? Но разве это можно назвать "удобным" и "гибким" решением?
Я не говорил что это проблема, мне просто интересно как это делают другие?

Вот с метатаблицей это интересное решение, но опять же создает некие дополнительные условия для луа-программиста, а это нежелательно.
Strijar
ГУРУ

Зарегистрирован: 08/02/2008 21:28:09
Сообщений: 223
От: СПб
Оффлайн

Jumangee wrote:Вот с метатаблицей это интересное решение, но опять же создает некие дополнительные условия для луа-программиста, а это нежелательно.


Никаких новых условий не создается. Идет обычно присвоение, что то типа:



Вся работа с мета-таблицами сделана в Си:



Потомки от CAstro реализуют свои LuaSet и LuaGet:


Это сообщение было редактировано 1 раз. Последнее обновление произошло в 03/05/2008 11:17:56


Лучше быть белым волком, чем серым человеком.
[WWW]
Jumangee
Новичок

Зарегистрирован: 02/05/2008 14:34:49
Сообщений: 5
Оффлайн

Спасибо! Очень наглядно, но можно ли увидеть побольше, например хочется увидеть описание класса CAstro?
Не совсем понятно как будет выполнено присваивание типов на этапе выполнения, если например есть CDate и CInt и CString (так?), как это всё потом вместе уживется?

Вы простите за глупые вопросы, просто пытаюсь понять как можно больше прежде чем нагородить в программе непонятно что
Strijar
ГУРУ

Зарегистрирован: 08/02/2008 21:28:09
Сообщений: 223
От: СПб
Оффлайн

В данном случае CDate это объект "таблица" к которому идет обращение, точней к его полям - zone и jd. Типы приводите как вам хочется - ничего не мешает в методе LuaSet определять какого типа идет присвоение и действовать дальше по ситуации.

Потомков от CAstro у меня много разных - я думаю моя конкретика вам не поможет, только запутаетесь Но если будут конкретные вопросы - поясню.

Это сообщение было редактировано 1 раз. Последнее обновление произошло в 03/05/2008 13:36:46


Лучше быть белым волком, чем серым человеком.
[WWW]
Jumangee
Новичок

Зарегистрирован: 02/05/2008 14:34:49
Сообщений: 5
Оффлайн

Ок, спасибо, вроде стало понятнее, буду ковырять
DarkKnight
Новичок

Зарегистрирован: 25/04/2008 19:38:41
Сообщений: 26
Оффлайн

зато мне не понятно))тема схожая,поэтому решил написать тут,а не заводить новую.
вот тут сказали что мгновенное изменение данных можно сделать через __index.как именно это сделать?вот для наглядности скрипт:

этот скрипт создает кубик,и потом его трансформирует.было бы еще неплохо узнавать cube == NULL ?и тогда создавать объект,иначе не создавать,потмоучто этот скрипт в цикле работает.но кроме как отдельными функциями,которые после выполнения скрипта работают:

..это сделать можно?т.е. в теле функции создания куба.буду оч признателен за помощь)

Нет документации на русском?Напиши сам! (с)Сайт "Lua в России" (lua.ru)
smz
ГУРУ

Зарегистрирован: 14/03/2008 13:23:00
Сообщений: 245
Оффлайн

Может я чего не понял, но если функция CreateBox не смогла создать куб, то она могла бы, например, просто вернуть nil:

Это сообщение было редактировано 1 раз. Последнее обновление произошло в 04/05/2008 00:23:00

DarkKnight
Новичок

Зарегистрирован: 25/04/2008 19:38:41
Сообщений: 26
Оффлайн

дело в том,что,на сколкьо я знаю TV3D,создается бокс,если даже переменная не пустая,т.е. идет утечка памяти(указатель теряется).да и проверка на созданость не главное,главное-немедленно обновлять переменную cube,потомучто щас MеshTurn и MeshMove не работают,из-за того что "nil в аргументе функции".это потмоучто переменная cube обновляется только после выполнения скрипта.как сделать обновление переменной немедленно?
если надо могу выложить весь тестовый проект=)

Нет документации на русском?Напиши сам! (с)Сайт "Lua в России" (lua.ru)
 
Индекс форума » LUA: Общие вопросы
Перейти:   
Powered by JForum 2.1.8 © JForum Team