24 ноября 2010

Скриптовой модуль, Демо-2

Чтобы отвлечься от багов в релизной версии игры, решил описать вторую демонстрационную программу связки Lua + Delphi. В общем, запоздавшее описание вроде почти закончено и я лучше выложу его сейчас, чем буду кормить всех новыми обещаниями о доработке текста. Как говорится "меньше слов - больше дела", поэтому приступим! Начнем с основного вопроса: "Что же делает Демо-2"? Ответ прост - строит график зависимости скриптовой функции от времени. Опять же, если вы не понимаете о чем идет речь, то, вероятно, стоит прочесть сообщение, в котором я как-то раз обещал описать демки, что выложил на всеобщее обозрение.


Начнем с того, что исходный код находится в папке Demo-2. Думаю, все уже скачано, открыто в Delphi и готово к "употреблению". На самом деле эта программа призвана только закрепить материал первой демо. Итак, сама программа строит график на экране. Все её достоинство в том, что зависимость f(t) задана с помощью скрипта.
Что вообще мы видим на форме? Вот такие элементы:
  • TChart + TLineSeries
  • Таймер
  • Две кнопки: "Reload script" и "Clear"
  • TMemo
Для чего все это? 1ый пункт - для отображения самого графика. Таймер - для  того, чтобы график функции строился постепенно, у нас на глазах. Кнопка "Reload script" служит для перекомпиляции файла-скрипта. "Clear" - для очистки графика. Memo - для отображения различных лог-сообщений.При запуске программы происходит создание объекта fScriptManager класса TScriptManager. Затем выполняется инициализация скриптового менеджера, а также регистрируются три функции:
  • Get_Time() - вызывается из скрипта для нахождения текущего времени
  • Set_Result() - вызывается из скрипта, добавляя новую точку на график
  • Add_ToLog() - вызывается из скрипта, добавляет строчку в Memo
 В итоге вся суть программы заключается в загрузке скрипта с помощью вызова
 fScriptManager.LoadScriptFile('demo_2.lua');
а далее по таймеру происходят вызовы скриптовой функции main:
fScriptManager.DoScript('main', [], false);

Вот и все, предельно просто. Конечно, чтобы окончательно понять, как все привязано друг к другу - стоит посмотреть !!!исходные коды!!! Demo-2, сделав двойные клики по основным кнопкам, рассматривая строчки основных вызовов.

Исходя из всего вышесказанного, ясно, что псевдо-код скриптовой функции "main" выглядит совсем просто:
Set_Result( F(Get_Time()) )

А полный текст скриптового файла demo2.lua выглядит так:

function main()
    local nowtime = Get_Time();
    Set_Result(math.sin(nowtime));
end;

то есть в качестве функции F здесь реализован обычный синус... В чем бонус? В любой момент можно изменить файл demo2.lua, к примеру на:

function main()
    local nowtime = Get_Time();
    Set_Result(nowtime*nowtime);
end;

нажать в программе кнопку "Reload Script" и моментально увидеть изменения графика функции на параболическую зависимость.
или что-то вроде:

function main()
    local nowtime = Get_Time();
    if (nowtime > 5) then 
        Set_Result(nowtime*nowtime);
    else
        Set_Result(math.sin(nowtime));
    end;
end;

да много чего еще можно придумать, таким образом достоинства на лицо! :)

Кстати! Недавно наткнулся на эту тему. Парень выложил свой модуль связки lua + Delphi, похожий на luabind, умеющий очень многое; начиная от бинда структур и массивов, и заканчивая определением классов, регистрацией колбэков и много чего еще, о чем я и сам не знаю. Сам модуль занимает порядка 10 тыс. строк, так что я только мельком пробежался - хорошая структура, замечательное форматирование, обильные комментарии. Даже прилагается doc-справка в 50ти страницах! На первый взгляд - замечательная вещь! Нужно будет опробовать!

Вот и всё... всем удачи!


Ссылка на вступление к демонстрационным программам о lua.
Ссылка на описание первой демо.

Сообщения, схожие по тематике:

0 коммент.:

Отправить комментарий