Можно добавить еще VHS фильтр, например вот
И эффект “рыбьего глаза”, гайд
еще раз привет, этот гайд должен получится достаточно большим, рекомендую взять закусок и напитков
в этой части мы изучим:
мы уже рассмотрели таблицы, а теперь перейдем к библиотеке для работы с ними. require прописывать не надо, так как библиотека стандартная
local tbl = {["saber"]="сабер"} -- создаем таблицу
table.insert(tbl, "карасик")
-- вставляем в таблицу строку "карасик" без ключа
-- через table.insert() значение с ключом не вставить!
print(tbl[1]) -- к значению "карасик" придется обратиться,
-- по его индексу, как у массива
print(tbl["saber"]) -- а к значению "сабер" которому мы дали ключик,
-- обращаться только по ключу!
print(tbl.saber) -- выпечатает сабера,
-- так тоже можно обращаться по ключу (через точку)
print(tbl[0])
-- напишет nil, так как к первому ( с нулевым индексом)
-- которому мы задали ключ, обращаться можно только по ключу
table.remove(tbl, 1)
-- в table.remove() указать таблицу и индекс,
-- обьекта который мы хотим удалить
print(tbl[1])
-- выведет nil, карасика больше нет!
table.remove(tbl, 0) -- попробуем удалить обьект с ключом..
print(tbl["saber"])
-- выведет сабера,
-- так как к обьекту с ключом по индексу не обратиться!
table.remove(tbl, ["saber"])
-- table.remove() выведет ошибку,
-- так как функция принимает только числа как второй аргумент!
print(tbl["saber"]) -- мы никогда не узнаем..
table.insert(таблица, индекс, обьект)
таблица - table
индекс - number
обьект - any буквально любой тип, так как таблица может принимать все типы
но… я уже указывал только таблицу и обьект?
да, второй аргумент необязателен, поэтому если третего аргумента (обьекта который мы вставляем) нет, то вместо него становится второй аргумент
table.remove(таблица, индекс)
таблица - table
индекс - number
значения, которые создавались в паре с ключом, по индексу тронуть нельзя
односвязный список - переменная которая помимо своего значения содержит следующий элемент списка
грубо говоря, это матрешка, которая в себе содержит свой следующий элемент
local lst = { -- создаем список, это называется КОРНЕМ списка, первый обьект
value = nil, -- список содержит две переменные - его "значение"
next = nil -- и следующий элемент списка
}
lst.value = 10 -- задаем "значение" первого элемента списка десяти
local new_lst = { -- создаем второй элемент списка
value = nil, -- изначально переменные списка nil
next = nil
}
new_lst.value = 20 -- задаем значение второго элемента двадцати
lst.next = new_lst -- а теперь задаем в первом элементе списка, как следующий элемент второй
local newnew_lst = { -- создаем третий элемент списка
value = nil,
next = nil
}
newnew_lst.value = 30 -- значение третего элемента списка - 30
new_lst.next = newnew_lst -- следующий список у второго - третий
print(lst.value) -- первый обьект, 10
print(lst.next.value) -- второй обьект, 20
print(lst.next.next.value) -- третий обьект, 30
используя только первый элемент, мы дошли до последнего!
все это можно сделать удобнее, через циклы, но мне надо просто показать как это дело работаетё
сейчас изучим деревья. представь большое дерево, и от каждой его ветки идут еще две ветки
теперь представим это в коде, у нас есть ветка, которая содержит свое значение, правую ветку, и левую ветку:
root - корень по английски, это будет самый первый элемент дерева.
local tree_root = {
value = 10
left = nil
right = nil
}
value - значение
left - левая ветка
right - правая ветка
local tree_root = { -- создаем первую ветку дерева
value = 10, -- на первой ветке лежит десятка
left = nil, -- левой ветки пока что нет
right = nil -- правой ветки пока что нет
}
local first_right = { -- создаем первую ПРАВУЮ ветку дерева
value = 20, -- на первой ПРАВОЙ ветке дерева лежит двадцатка
left = nil, -- левой ветки ОТ ЭТОЙ ветки пока что нет
right = nil -- правой ветки ОТ ЭТОЙ ветки пока что нет
}
tree_root.right = first_right -- задаем правую ветку самой первой ветки, только что созданной веткой
local first_left = { -- создаем первую ЛЕВУЮ ветку
value = 30, -- на первой ЛЕВОЙ ветке лежит тридцатка
left = nil, -- от первой ЛЕВОЙ ветки нет еще одной левой ветки
right = nil -- от первой ЛЕВОЙ ветки нет еще одной правой ветки
}
tree_root.left = first_left -- задаем самой первой ветке левую ветку нашей только что созданной левой веткой
print("первая ветка: ", tree_root.value)
-- выведется 10, это значение самой первой ветки
print("первая левая ветка: ", tree_root.left.value)
-- выведется 20, это значение первой-левой ветки
print("первая правая ветка: ", tree_root.right.value)
-- выведется 30, это значение первой-правой ветки
это достаточно сложная тема и мне самому понадобилось время чтобы ее понять
на 99% собеседований на работу программистом спрашивают про деревья!
сериализация - процесс преобразования объекта в форму, пригодную для сохранения или передачи
сериализация - это когда ты сохраняешь свою таблицу в текстовый файл, чтобы отправить ее другу!
рассмотрим пример сериализации с помощью библиотеки IO (input/output):
local workers = {"Дмитрий Антонов", "Дезроу Дезроев", "Тимофей Коробка"}
-- создаем массив строк "работников"
save_file = io.open("workers.txt", "w")
-- через библиотеку io открываем файл workers.txt
io.output(save_file)
-- говорим программе "дальше выводи все в save_file"
for i = 1, #workers do -- запускаем цикл по всем элементам массива
io.write(workers[i], "\n")
-- через io печатаем каждого работника, после ставим \n (знак новой строки)
end
io.close(save_file)
-- обязательно закрываем файл, иначе компьютер будет ждать новых инструкций с файлом
рассмотрим каждую функцию по порядку:
io.open(название_файла, режим_файла)
название_файла - string, просто название файла
режим файла - string, режим открытия файла:
r - read, только читать; w - write, переписывает весь файл; a - append (добавить), открывает или создает файл для добавления чего-то к нему; r+ - read и write; w+ - read и write, полностью переписывает файл или создает его; a+ - append и read, открывает уже созданный файл или создает новый.
io.output(файл)
файл - файл, который был создан с помощью io.open()
примечание - по умолчанию io.output() - консоль
for i = 1, #массив do …
массив - название массива, “#” перед ним позволяет итерироваться столько раз, сколько элементов в массиве
io.write(содержимое)
содержимое - строка
печатает содержимое в io.output(), по умолчанию это консоль
io.close(файл)
файл - файл, который был создан через io.open()
перестает ожидать инструкций о работе с ранее открытым в io.open(). обязателен если был io.open()!!
вот и закончилась базовая часть Lua, теперь мы будем переходить к более сложным вопросам, но сначала я хотел бы рассказать необходимые инструменты настоящего погромиста
да, навыки гуглить тебе очень пригодятся и я хотел бы дать небольшую базу как их использовать:
представим что я хочу найти рецепт торта медовика:

А ГДЕ МЕДОВИК?! ПОЧЕМУ ТУТ ВООБЩЕ НЕТ МЕДОВИКА!
**можно сделать мой запрос таким: **
рецепт торт "медовик" - я указал медовик в кавычках, это означает что это слово ОБЯЗАТЕЛЬНО должно быть в предложенном результате

результаты лучше!!
представим что я хочу найти как подключится к базе данных через glua:

на русском - результатов нет!
попробуем на английском:

на английском - результаты есть!!
делаешь цикл через pairs, но тебе не нужно одно из значений? так просто поставь плейсхолдер! забей хуй
local tbl = {"chelog", "dima"} -- делаем массив
for _,v in pairs(tbl) do -- ставим вместо k плейсхолдер (_)
print(v)
end
да-да плейсхолдер - нижнее подчеркивание
он указывает на то, что тебе не нужно получать эту переменную
а почему просто ничего не ставить на месте k?
так как k - первый аргумент, v будет иметь значение, подготовленное для k просто с другим названием!
универсальная и ОЧЕНЬ мощная функция, превращает ЛЮБУЮ строку которую вы ей дадите в функцию:
local code = "local s = 'привет, мир!'; return s"
f = load(code)
print(f())
для обозначения новой инструкции компьютеру в одну строку ставят “;”
глобальная таблица которая позволяет нам вписывать туда новые значения с ключами:
_G["chelog"] = "dima"
print(_G["chelog"])
также можно создать глобальную функцию:
function _G.print_chelog()
print("chelog")
end
_G.print_chelog()
мы присвоили к переменной (таблице) _G функцию print_chelog() и теперь можем обращаться к ней через точку!
теперь ты готов переходить к изучению glua
у тебя есть два варианта:
слева есть панель, там есть категории и уже в этих категориях есть статьи, также в верхнем правом углу ты можешь название функции или нужной тебе статьи и она там появится. также в среде разработки VSC тебе будут вылезать базовые библиотеки glua по типу weapons (если начать писать название)