Lua не является интерпретированным языком и генерирует байт-код из другой программы, например, Java. Эта программа работает на виртуальной машине Lua VM. Большинство таких устройств называются стеками, но Lua отличается тем, что она основана на регистрах и является одной из первых широко используемых VM в игровой сфере.
Преимущество регисторной архитектуры заключается в том, что она позволяет избежать большого количества копированных данных и уменьшает объем инструкций для функции. Lua VM обладает автоматическим управлением памяти и сбросом ненужной информации, что обеспечивает идеальную конфигурацию для создания сценариев быстрого прототипирования.
Коротко про Луа
Lua — это простой в освоении и быстрый скриптовый язык с синтаксисом типа pascal. Это позволяет начинающим программистам писать свои собственные программы. Он используется во многих играх и приложениях для расширения существующей функциональности и программирования пользовательских последовательностей. В интернете есть много обучающих программ, которые помогают работать на этом языке, в том числе много информации можно найти на домашней странице Lua.
Этот язык программирования был создан в Бразилии в 1993 году программистами Роберто Иерусальшимом, Луисом Энрике де Фигеиредо и Вальдемаром Целесом в университете Рио-де-Жанейро, где по-прежнему находится офис «LabLua». Название происходит от португальского, что в переводе значит — луна. Одним из предшественников был язык SOL (Simple Object Language). Поскольку имя Lua является существительным, а не аббревиатурой, оно не должно писаться, как LUA, а именно как Lua.
Это гибкий язык, он используется на нескольких направлениях:
Функционал этой программы можно использовать в LÖVE, Defold и, конечно же, в Pico-8.
Основы синтаксиса
Lua использует очень упрощенный синтаксис. Пользователю не нужно применять точки с запятыми или большие пробелы, потому что эти знаки сами интерпретируются программой. Все переменные в скриптах Lua для quik по умолчанию глобальны. Поэтому всегда нужно указывать, когда локальные значения нужны для текущей области и предварительно объявлять их. Фактически на практике существует очень мало случаев, когда в действительности нужны глобальные значения.
Можно определить локальную переменную с ключевым словом local. При этом значение ее объявлять не нужно. Глобальные переменные означают контекст текущего сценария и поэтому не являются такими для каждого отдельного скрипта в игре, которые каждый работают самостоятельно и автономно.
Переменные могут содержать любую последовательность цифр, букв и подчеркиваний, но они не должны начинаться с числа. Null представляет ключевое слово, когда переменные не определены. Необъявленные неотличимы от объявленных переменных, которые не имеют значения. Примеры скриптов Lua:
Блоки кода и операторы if
Блоки определяются определенными ключевыми словами, после чего следует «end». Условия в if операторах должны сопровождаться ключевиками «then». If заявления используют «elseif», а не «else if». Можно создать новую пустую область с «do…end» блоком.
Lua использует особый тип данных, называемый таблицей, предназначенный для целей создания массивов, словарей, хеш-карт, объектов других языков.Таблицы — это просто список пар «ключ-значение», которыми может быть любой тип данных, даже другие таблицы. Можно использовать логическое значение в качестве ключа. Поскольку Lua динамически типизируется, можно иметь любую смесь типов данных в обоих ключах и значениях по выбору пользователя, с которые нужно определиться перед тем, как устанавливать Lua скрипты.
Значения таблиц могут быть определены как внутри, так и отдельно. Обычно есть два способа получить и установить их значения, синтаксис «точка», например, «myTable.a», и синтаксис скобки, например, «myTable[«a»]». При использовании строковых ключей можно использовать только синтаксис точек и нельзя применять его, если строка начинается с числа.
Каждое значение в таблице учитывается, nil — если оно не установлено. Это означает, что невозможно определить, объявлено ли значение в таблице или это просто нуль, если оно никогда не было определено раньше. Это означает, что если ключи в таблице указаны и установлены на нуль, это не будет иметь никакого эффекта, вернее, оно будет таким, каким было бы в случае, если бы их и не определяли вовсе. В Lua таблицы с числовыми ключами начинаются с индекса 1, а не 0. Это то, что вызывает большую головную боль для программистов. Можно разделить встроенные элементы таблицы запятой или точкой с запятой.
Сложный тип данных
Таблицы считаются сложным типом данных в Lua — это означает, что переменные в них просто ссылаются на один и тот же объект в памяти, поэтому нельзя напрямую сравнивать два значения и ожидать, что они проведут что-либо. Тем не менее строки, числа, буквы и другие примитивные типы данных можно сравнивать напрямую.
Цифры в Lua используют только в одном виде — своего собственного числа. Нет таких типов, как int, float, long, double и других, как в прочих языках и это надо учитывать перед тем, как устанавливать Lua-скрипты. Технически все значения в Lua представляют собой числа с плавающей запятой.
Lua имеет только «=» оператор для определения и увеличения. В нем нет «+=», «-=», «++» или чего-нибудь еще. Оператором конкатенации является «…». Можно применять эту операцию на строках и номерах без проблем. Однако нельзя объединять другие типы данных — логические или табличные. Можно получить длину таблицы или строки с «#» оператором и это работает только для массивов с числовыми индексами. Например, код не будет работать с таблицами, которые имеют строковые индексы.
Циклические типы Loops
Существует четыре типа циклов Loop, что в переводе означает петля или виток.
While (промежуточный) — это самый простой вид цикла и функций, как и следовало ожидать на других языках, и означает, что проверка проводится перед запуском внутреннего блока.
Numeric for loop (цифровой). Цикл применяет переменную local для своей области и увеличивает или уменьшает ее. Пользователь объявляет и определяет переменную, которую нужно использовать и за которой следует значение цели.
Generic for loop (генерируемый) — использует функцию итератора. Она вызывается повторением каждого цикла и возвращает значения, которые будут применены в ней.
Pairs (пары) является функцией итератора в глобальном масштабе. Она принимает таблицу в качестве аргумента, возвращает индекс и значение каждой переменной в таблице. Код будет перебирать даже ненулевые индексы. У нее есть «брат» — «ipairs», который делает точно то же самое, за исключением того, что работает только с числовыми индексами и останавливается, когда достигается значения nil.
Repeat loop (повторение) похож на while, за исключением того, что проверка условий проводится в конце блока, а не в начале. Перед тем как открыть lua скрипт нужно учитывать, что код внутри будет запускаться не менее одного раза. Цикл повторения обычно избегают в разработке этого языка, поскольку его прецедент ограничен и трудно читаем из-за того, что не использует стандартный do..end синтаксис.
Метод функций
Функции — это еще один сложный тип данных, можно передавать как переменные, и также можно вызвать их, чтобы выполнить код внутри. Они похожи на методы на других языках.
Существует два способа определения функции в Lua. Первое объявление является глобальным, так как не существует локального ключевого слова. Как правило, глобальные функции считаются приемлемыми. Тем не менее пользователь все равно может сделать их локальными, если нужно, поставив «local» фронт. Можно также объявить переменные до того, как определить функции, которые все равно похожи на любой другой тип данных. Можно передать их, назначить переменными или принять столько аргументов, сколько нужно, с помощью синтаксиса «…». Фактическим объектом «…» является «tuple» (кортеж), поэтому нужно окружить его фигурными скобками, чтобы превратить данные в таблицу.
Кортеж — это просто список имен, таких как параметры в функциях, которые могут возвращать несколько значений, а им, в свою очередь, можно присвоить переменные. Если поместить функцию в таблицу, то ее можно вызвать двумя разными способами. Стандартный синтаксис точек или двоеточия отправит массив в качестве первого аргумента.
Глобальное пространство имен
«Луа» предоставляет несколько таблиц в глобальном пространстве имен, которые содержат вспомогательные функции, такие как «string», «table» и «math». Таким образом, пользователь никогда не должен указывать какую-либо переменную из названных, поскольку они будут перераспределять массивы, содержащие полезные функции.
Существуют две таблицы, которые совместно используются всеми сценариями на сервере или клиенте (но не для обоих) — это «_G» и «shared». Первая — поистине глобальная, реализуемая через отдельные скрипты, поэтому, если нужно получить или установить значения из нее, используют «_G.something».
«Strings» (Струны) — этой функцией Lua может несколькими способами определить строковый литерал и многострочные данные, используя двойные квадратные скобки. И также можно поместить любое количество знаков равенства (=) между квадратными скобками ([===[ … ]===]). Они сбалансированы, могут включать в себя последовательности внутри, как ]]. Lua также имеет собственный набор встроенных функций манипуляции строками и собственную, вытесненную версию регулярных выражений, называемых строковыми шаблонами.
Игровой лунный сценарий
Это очень простые первые шаги по написанию программы, но они являются хорошими отправными точками для взлома скриптов Garry Mod 10 Lua. Первый шаг — создают фактический файл сценария Lua. Открывают текст или редактор — блокнот будет отлично работать для этой цели. Далее сохраняют этот файл, прописывая, как на рисунке.
Где:
- <Steamname> — имя пользователя паролей.
- <Garry’s Mod Install location> — каталог Steam для Garry’s Mod.
Место установки по умолчанию для Lua-скриптов для garry s mod обычно «C:Program FilesSteamsteamapps\garrysmod», но может отличаться на компьютере — «autorunclient». Любые файлы сценариев, помещенные в этот каталог, будут запускаться при запуске Lua на клиенте, например, когда начнется новая игра или пользователь присоединяется к серверу. Далее создают файл типа Hello World, добавляя к нему сценарий lua mod скриптов. Это самый простой вариант.
Это может казаться немного запутанным сразу. Скрипт выдает содержимое таблицы (какие массивы или списки вызываются) и перехватывает данные до команды консоли, чтобы подтвердить, что требуется определить функцию, которая которая не принимает никаких параметров и не возвращает значения, но обязательно устанавливает «конец» в конце своих команд.
Функции — это модульные фрагменты кода, которые можно использовать несколько раз. В этом примере показано, как запустить скрипт Lua. Здесь создан список строк, но пользователь также может вставлять и другие объекты. Таблицы являются ассоциативными или хешированными. Это означает, что каждый элемент в списке может ссылаться на ключ.
Эти команды распечатывают все элементы в таблице, а структура называется циклом. Обращают внимание на команду пары «myTable», которая запускается один раз для каждого элемента и возвращает пары ключ/значение для значений в списке.
Значение — это элемент в таблице, а ключ — это просто способ ссылки на него. Этот пример показывает, как выводить текстовые и значения переменных с той же командой печати. Переменные «ключ» и «значение» устанавливаются в цикле выше. Обращают внимание на «…» между строками и переменными. Символ «…» — оператор конкатенации Lua. Это говорит языку, что нужно склеить два элемента вместе и рассматривать их как одну текстовую строку «.concommand.Add»:
- my_test_function;
- myTestFunction.
Запись создает консольную команду, которая запускает только что инициированную функцию. Первым ее параметром является имя команды управления, в этом случае: «my_test_function». Это то, что пользователь вводит в консоль мод Garry для запуска скрипта.
Второй параметр — это функция для запуска, в этом случае: myTestFunction. Этот файл впоследствии потребуется сохранить. Далее тестируют скрипт, запускают Garry’s Mod и новую игру. После этого открывают консоль, используя тильду (~). Если она не появляется, тогда нужно ее включить, вводя «my_test_function» в строку в нижней части панели. После запуска начнется автоматическое заполнение экрана с именем команды, нажимают Enter, чтобы ее запустить.
Возможности Lua-Quick-Try-Out
Эта консоль предназначена для прямого ввода кода Lua (например, команда команды Lua (8 + 9) сразу выводит результат 17).
Ее функции:
Точки консоли останова могут быть установлены щелчком рядом с номером строки. Если режим отладки включен, вид переменной будет виден в правой части главного окна. Ее размер можно изменить, перетаскивая левую границу. Различные параметры режима отладки «вкл.» или «выкл.» сохраняются и восстанавливаются, когда он включен или отключен. Можно применять колесико мыши для изменения видимого размера диаграмм и графики. Правую кнопку мыши можно использовать, чтобы открыть контекстное меню для диаграмм с функциями их масштабирования.
SAMP Lua-скрипты — это библиотека lua для MoonLoader, которая добавляет некоторые команды, чтобы упростить модификацию SA: MP,SAMP. Events дает возможность обрабатывать SA: MP входящие и исходящие низкоуровневые сетевые пакеты очень простым способом. Можно переписать данные, установив все аргументы в таблице в правильном порядке или можно прервать обработку любых пакетов, вернув false, которая предотвращает изменение пользователем позиции игрока.Перед тем как установить Lua-скрипт samp, можно добавить собственный обработчик пакетов.
Дистрибутив Lua-WoW
Так называется дистрибутив исходного кода Lua, модифицированный для соответствия среде аддонов World of Warcraft.
Его данные:
Эта версия языка настроена на соответствие среде Lua World of Warcraft. Все параметры совместимости 5.0-5.1 отключены, кроме openlib. Библиотека битлиба работает. Некоторые wow Lua скрипты — специфичные, Lua-библиотечные функции реализованы.
Программой предоставляются глобальные псевдонимы для функций «Lua.string.format», они могут использовать выбор аргументов из Lua 4.0. Двоичные файлы Windows, включенные в эту загрузку, статически связаны для производительности. Они могут работать не так, как ожидалось пользователем, при использовании с некоторыми сторонними пакетами.
История версий:
Игровой движок Pico-8
Pico-8 — это фантастическая программа, которая эмулирует полную игровую консоль с ограниченными 8-битными спецификациями. Она имеет все необходимые инструменты для программирования на языке Lua. Причина, по которой пользователи выбирают Pico-8, заключается в том, что ее можно использовать прямо из коробки, без необходимости настройки или внешних редакторов, все инструменты включены в пакет Lua-скриптов для самп, а обучение довольно простое.
Порядок работы:
Pico-8 предназначена только для отображения символов верхнего регистра, поэтому можно просто набирать шрифт, нет необходимости использовать Shift или Caps-lock. Редактор также имеет синтаксическую раскраску для кода. Если посмотреть в верхнем правом углу редактора, можно увидеть несколько значков. Это встроенные инструменты для создания спрайтов, карт, звуков и музыки. Этот пример довольно простой, но дает представление о редакторе и языке.
Чтобы исследовать более интересные примеры, можно перейти в каталог DEMOS. Для этого вводят: INSTALL_DEMOS. После открывается каталог DEMOS с несколькими примерами программ для изучения. Одним из главных преимуществ Lua является его простота. Некоторые компании используют этот язык исключительно из-за этого, поскольку думают, что их сотрудники смогут работать лучше.
Некоторые очень простые языки, такие как Bash или Batch, не будут достаточно сильными, чтобы выполнять требуемые задачи, но Lua является одновременно мощной и простой программой. Другим важным преимуществом Lua скриптов для css v34 является их способность внедряться, что признается одной из важнейших характеристик этого продукта на протяжении всего этапа его развития. Такие игры, как World of Warcraft или ROBLOX, имеют возможность встраивать Lua в свое приложение.