Войти
ПрограммированиеСтатьиОбщее

Введение в Lua. (4 стр)

Интеграция в Наш Код

Сейчас Вы можете заметить, что у нас не произошло сильного внедрения lua в наше приложение. Но какой прок в использование всего этого, если Вы не можете заставить скрипт делать что-нибудь с вашим приложением. Подумайте об этом. Сейчас мы имеем скрипт-систему, но не имеем никакой реальной интеграции с вашим кодом. Я не могу использовать то, что я пока создал, чтобы фактически сделать что-нибудь, типа AI врагов ищущих игрока в игре. Что нам сейчас необходимо - это поддержка функций, так же как методов lua. Так что это наш следующий шаг.
Чтобы сделать это, мы создадим несколько простых функций, к которым обратимся через lua.

Создаём простую модель Менеджера для персонажей NPC. Нам достаточно только одного такого объекта, чтобы создавать, управлять и удалять персонажей NPC имеющихся в игре. Я хочу предупредить, менеджер, который я создал - только для образовательных целей. Это никоим образом не отражает реально используемые мной NPC менеджеры.

Так или иначе, вернемся к проекту. Я создал Binding01 как пример того, что Вы можете сделать, когда интегрируете lua в ваш существующий код. Вот краткий обзор того, что происходит.

Я создал единственный объект с именем  NPCManager. Он, по существу, создает и управляет NPCObjects. Использует список STL, чтобы следить за ними (и снова, это всего лишь пример). Сейчас NPCObjects содержит только 'имена' объектов. Этот объект никогда напрямую не используется lua. Когда нам нужен доступ к одному из этих объектов, мы делаем это через его имя. Это грубо и не должно быть использовано в реальном приложении, но это утрированный пример.

Итак, наш  NPCManager создает и управляет NPCObjects. NPCManager создается один раз перед использованием и существует в пределах области видимости. Следующий вопрос, как мы предоставляем функциональные возможности NPCManager lua? Мы делаем это через склеивающую [glue] функцию. И что же из себя представляет эта функция? По существу, это функция связи между lua и нашим кодом. Итак, почему мы нуждаемся в этой связи? Это все нужно, потому что lua не имеет тех же типов переменных как C/C++.

Особенности Lua

Жизнь была бы действительно хороша, если бы типы данных lua и C/C++ совпадали. Но если бы это было так, то мы закончили бы теми же проблемами, которые мы имеем с C/C++ (Распределение памяти, вопросы контроля соответствия типов и т.д. и Вам пришлось бы это всё использовать). Чтобы упростить жизнь, lua разработана как язык с динамическим контролем типов. Если точнее, lua вообще не имеет никаких типов переменных. Нет никакого int, float, char или подобного объявления переменной. Сверхъестественная вещь, даже при том, что мы только что сказали, что нет никаких типов в lua, все значения таких переменных могут быть использованы.

Что Вы сказали?

По порядку. Говоря 'динамический тип' мы подразумеваем то, что переменная не имеет никакого определенного типа, но имеет значение.

ЧЕГО, ЧЕГО?

Это может показаться немного сложным, если Вы не занимались COM программированием или не заглядывали под капот Visual Basic. Если Вы всё-таки имели такой опыт, то это всего лишь обзор для Вас; иначе, мы погружаемся в сказочную страну универсальных [variant] типов данных.
Variant по существу 'содержит все' типы данных. По определению, любая переменная, созданная как вариантная, имеет любой тип данных … пауза … не поверите, но у этого есть смысл … наверное. Попробуем. Скажем, есть новое определение типа (в символическом виде):

typedef struct _variant
{
   int type;
   union
   {
      int   Integer;
      double Float;
      char  String[255];     
   }
} Variant;

Что мы здесь имеем - новый тип названный variant. Основываясь на значении поля type, мы могли бы использовать Integer, Float или String поля для взятия данных. Каждая переменная, которую мы создаем основана на Variant и может содержать любые данные, но какие именно зависит от ее значения. Это очень просто. И это эффективно, Вы вскоре сами увидите. Пожалуйста обратите внимание, что lua не использует такой вид структуры, поскольку это внутренний тип данных и намного сложнее чем представлено здесь. Это была просто иллюстрация.

Так, все, что понимает lua - это вариантный тип данных. Данные, которые он может содержать в этом вариантном типе: nil, число, строка, функция, userdata и table. Так из этого видно, что переменная в lua может быть числовой, символьной или функцией. Остальные два, userdata и table, я объясню позднее.

Итак, если мы можем поместить данные в этот вариантный тип в числовом или символьном виде, то надеемся, что есть и какой-то способ извлечь их на стороне C++. Есть несколько функций, для конвертирования и управления этими данными. Некоторые из них:

double            lua_tonumber (lua_State *L, int index);
const char*       lua_tostring (lua_State *L, int index);
size_t            lua_strlen (lua_State *L, int index);
lua_CFunction     lua_tocfunction (lua_State *L, int index);
void*             lua_touserdata (lua_State *L, int index);

Функций для обращения к параметрам переданным через lua гораздо больше. Так, что они делают? Ну, поскольку они читают данные им приходится преобразовывать их из одного формата lua к чему-либо в C++. На кой нужен нам индексный [index] элемент? Что, если мы хотим передать несколько параметров? Само собой, это возможно. Так, как мы обработаем это? Ответ: lua стек.

Страницы: 1 2 3 4 5 Следующая »

#Lua, #скрипты

17 августа 2003 (Обновление: 15 фев. 2012)

Комментарии [74]