| Автор |
Сообщение |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 02/05/2008 15:01:44
|
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;
Такое было бы наверное самым оптимальным решением.
Кто как делает?
|
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 02/05/2008 15:12:37
|
smz
ГУРУ
Зарегистрирован: 14/03/2008 13:23:00
Сообщений: 245
Оффлайн
|
А зачем связывать эти переменные (и заниматься их синхронизацией)? Может быть лучше иметь одну переменную (либо в Lua, либо в C++) и обеспечить к ней доступ с "противоположной" стороны? Нельзя ли привести конкретный пример, для чего это нужно?
|
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 02/05/2008 15:56:43
|
Jumangee
Новичок
Зарегистрирован: 02/05/2008 14:34:49
Сообщений: 5
Оффлайн
|
Вообще, мысль интересная Но это вариант с выгрузкой данных в луа (установкой значений на старте, и получением при завершении)
Опять же, тогда вопрос встает - как лучше обеспечить доступ к таким переменным из c++?
Смысл такой, есть некий набор "переменных", к которым будут иметь доступ скрипты, а эти переменные потом будут обрабатываться c++ кодом, например - для "визуализации" этих параметров (как пример, - параметры персонажа игры - отображаются где-то в каком-то виде )
Опять же, надо ведь продумать как из луа "указать" что именно этот параметр - отображать, причем отображать так-то, что этот - текст, а этот - число ну или наподобии
Пришло в голову такое решение:
луа:
x = value("x", 5);
где value это с-функция, которая создает переменную x в списке параметров (которые потом и инициализирует её 5ой. Но потом и работать с этими параметрами придется функциями типа set_as_visible("x", "int")
В общем, просто не уверен что всё это будет гибко и удобно
|
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 02/05/2008 19:45:05
|
smz
ГУРУ
Зарегистрирован: 14/03/2008 13:23:00
Сообщений: 245
Оффлайн
|
Ну допустим, есть переменные Speed и Name, первая - число, а вторая - стринг. Lua-скрипт изменил значения переменных и вызвал из C++ ф-цию, например update. C++ легко получает эти и другие значения, например из заранее известной таблицы.
Так в чём проблема, можно ли её кратко сформулировать?
|
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 02/05/2008 20:16:47
|
Strijar
ГУРУ
Зарегистрирован: 08/02/2008 21:28:09
Сообщений: 223
От: СПб
Оффлайн
|
Еще проще - хранить такие значание в таблице с определеным методами __index и __newindex (через метатаблицу). Тогда при записи и чтении этих "переменых" будут автоматически вызываться функции Си
|
Лучше быть белым волком, чем серым человеком. |
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 02/05/2008 20:34:51
|
smz
ГУРУ
Зарегистрирован: 14/03/2008 13:23:00
Сообщений: 245
Оффлайн
|
Strijar wrote:Еще проще - хранить такие значание в таблице с определеным методами __index и __newindex (через метатаблицу). Тогда при записи и чтении этих "переменых" будут автоматически вызываться функции Си
Да, это удобно, если предполагается немедленная реакция на изменение. Но иногда нужно изменить целый ряд переменных, и лишь затем сделать обновление.
|
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 02/05/2008 21:04:00
|
Strijar
ГУРУ
Зарегистрирован: 08/02/2008 21:28:09
Сообщений: 223
От: СПб
Оффлайн
|
Тогда вообще не вижу проблем. Переменые глобальны и вызов функции для обновления.
|
Лучше быть белым волком, чем серым человеком. |
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 02/05/2008 23:30:32
|
Jumangee
Новичок
Зарегистрирован: 02/05/2008 14:34:49
Сообщений: 5
Оффлайн
|
Переменые глобальны и вызов функции для обновления
Это как я описал в первом посте, так? Но разве это можно назвать "удобным" и "гибким" решением?
Я не говорил что это проблема, мне просто интересно как это делают другие?
Вот с метатаблицей это интересное решение, но опять же создает некие дополнительные условия для луа-программиста, а это нежелательно.
|
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 03/05/2008 11:12:38
|
Strijar
ГУРУ
Зарегистрирован: 08/02/2008 21:28:09
Сообщений: 223
От: СПб
Оффлайн
|
Jumangee wrote:Вот с метатаблицей это интересное решение, но опять же создает некие дополнительные условия для луа-программиста, а это нежелательно.
Никаких новых условий не создается. Идет обычно присвоение, что то типа:
Вся работа с мета-таблицами сделана в Си:
Потомки от CAstro реализуют свои LuaSet и LuaGet:
Это сообщение было редактировано 1 раз. Последнее обновление произошло в 03/05/2008 11:17:56
|
Лучше быть белым волком, чем серым человеком. |
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 03/05/2008 12:25:28
|
Jumangee
Новичок
Зарегистрирован: 02/05/2008 14:34:49
Сообщений: 5
Оффлайн
|
Спасибо! Очень наглядно, но можно ли увидеть побольше, например хочется увидеть описание класса CAstro?
Не совсем понятно как будет выполнено присваивание типов на этапе выполнения, если например есть CDate и CInt и CString (так?), как это всё потом вместе уживется?
Вы простите за глупые вопросы, просто пытаюсь понять как можно больше прежде чем нагородить в программе непонятно что
|
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 03/05/2008 13:35:11
|
Strijar
ГУРУ
Зарегистрирован: 08/02/2008 21:28:09
Сообщений: 223
От: СПб
Оффлайн
|
В данном случае CDate это объект "таблица" к которому идет обращение, точней к его полям - zone и jd. Типы приводите как вам хочется - ничего не мешает в методе LuaSet определять какого типа идет присвоение и действовать дальше по ситуации.
Потомков от CAstro у меня много разных - я думаю моя конкретика вам не поможет, только запутаетесь Но если будут конкретные вопросы - поясню.
Это сообщение было редактировано 1 раз. Последнее обновление произошло в 03/05/2008 13:36:46
|
Лучше быть белым волком, чем серым человеком. |
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 03/05/2008 13:46:28
|
Jumangee
Новичок
Зарегистрирован: 02/05/2008 14:34:49
Сообщений: 5
Оффлайн
|
Ок, спасибо, вроде стало понятнее, буду ковырять
|
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 03/05/2008 23:16:01
|
DarkKnight
Новичок
Зарегистрирован: 25/04/2008 19:38:41
Сообщений: 26
Оффлайн
|
зато мне не понятно))тема схожая,поэтому решил написать тут,а не заводить новую.
вот тут сказали что мгновенное изменение данных можно сделать через __index.как именно это сделать?вот для наглядности скрипт:
этот скрипт создает кубик,и потом его трансформирует.было бы еще неплохо узнавать cube == NULL ?и тогда создавать объект,иначе не создавать,потмоучто этот скрипт в цикле работает.но кроме как отдельными функциями,которые после выполнения скрипта работают:
..это сделать можно?т.е. в теле функции создания куба.буду оч признателен за помощь)
|
Нет документации на русском?Напиши сам! (с)Сайт "Lua в России" (lua.ru) |
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 04/05/2008 00:18:45
|
smz
ГУРУ
Зарегистрирован: 14/03/2008 13:23:00
Сообщений: 245
Оффлайн
|
Может я чего не понял, но если функция CreateBox не смогла создать куб, то она могла бы, например, просто вернуть nil:
Это сообщение было редактировано 1 раз. Последнее обновление произошло в 04/05/2008 00:23:00
|
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 04/05/2008 09:04:41
|
DarkKnight
Новичок
Зарегистрирован: 25/04/2008 19:38:41
Сообщений: 26
Оффлайн
|
дело в том,что,на сколкьо я знаю TV3D,создается бокс,если даже переменная не пустая,т.е. идет утечка памяти(указатель теряется).да и проверка на созданость не главное,главное-немедленно обновлять переменную cube,потомучто щас MеshTurn и MeshMove не работают,из-за того что "nil в аргументе функции".это потмоучто переменная cube обновляется только после выполнения скрипта.как сделать обновление переменной немедленно?
если надо могу выложить весь тестовый проект=)
|
Нет документации на русском?Напиши сам! (с)Сайт "Lua в России" (lua.ru) |
|
|
 |
|
|