1

Тема: [Tutorial's][Lua][RuTeam]

[align=center[size=18][b]Сериа Lua Туториалов[/b][/size][/align] 
Совсем недавно я решил делать туториалы.Досихпор у меня только 1 готовый(1 готовый на время создания оригинальной темы).И меня интересует что вы об этом думаете и что можете сказать чтобы я его улучшил.Он Направлен на начинающих.
Начинающие:
Toribash Lua Tutorial 1 - Основы <закончен>
Toribash Lua Tutorial 2 - Условия и функции  <закончен>
Toribash Lua Tutorial 3 - Хуки и откладки <закончен>
Toribash Lua Tutorial 4 - Рисование<закончен>
Toribash Lua Tutorial 5 - Больше функций! <Не начато>
Toribash Lua Tutorial 6 - Сделай свою мини-игру! (Управление мышкой и клавиатурой) <wip>
Продвинутый:
Toribash Lua Adv Tutorial 1 - Метатаблицы <Не начато>
Я не слишком уверен в том сколько времени я буду делать эти туториалы это все зависит от того как заинтересованы в этом люди.
Постепенно когда обновляеться офф темя я буду  добовлять новые туториалы
[align=center[img]http://i45.tinypic.com/315bjvp.png[/img][/align]

Оригинал by Blam.
Перевод сделан ApozZMaN.



2

Re: [Tutorial's][Lua][RuTeam]

[b][align=centerToribash Lua Tutorial 1 – Основы[/align][/b]
Этот туториал я написал про то как делать скрипты в торибашэ используя lua.В этом первом туториале я пройду через то как начать делать скрипты , строки , номера , таблицы , и "циклы"
Приступим к работе :
Тебе нужно:
Toribash (Очевидно).
Notepad++ (или другой тукстовый редактор но в этом тутореале я буду использовать Notepad++)
Привет мир:
Твоя основа будет "привет мир":

echo("hello world!")

Сохраните это в lua файле (и поместите этот файл в toribash/data/scripts/)
Теперь откройте торибаш и идете в Setup -> Scripts => выберите “helloworld.lua” и нажмите “load”.
Ты увидиш “hello world!” темно-красным цветом в чат-боксе. Это и есть функция echo. Используй “echo” Функцию если хочеш вывести темно-красный цвет в чат-боксе, это очень полезно для отладки и с помощью этого можно информировать человека об этом скрипте(также можно втулить туда свой копирайт).
Теперь об этом более продвинутей:
Вернись в свой helloworld.lua скрипт в notepad++. Теперь я хочу чтобы ты вставил туда это:

Message1 = "Hello"
Message2 = "world"
Message3 = "!"
echo(Message1 .. " " .. Message2 .. Message3)

Так что же это такое?

Message1 = "Hello"

Вот так вы объявляете переменную в Lua.Переменные хранят информацию такую как числа или текст.

Message2 = "world"
Message3 = "!"

Message1, Message2 и Messge3 сейчас содержат текст который нужен для echo "Hello world!" Но как мы сойденим это?

echo(Message1 .. " " .. Message2 .. Message3)

Знак ".." в lua означает обьединение. Конкатенация это когда ты ложиш несколько строк рядом поэтому мы положили рядом Message1 (“Hello”) с пробелом , Message2 (“world”) и Message3 (“!”) в конце мы получили “Hello world!”.
Попробуйте это!
Номера!
Цифры в Lua объявляються в точности так же, как строки. Давайте мы поменяем в предыдущем скрипте слова на номера и получим примерно вот такое

[Message1 = 45.23
Message2 = 2312.3
echo(Message1 .. "+" .. Message2 .. "=" .. (Message2 + Message1))

В игре это будет выглядеть вот так

45.23+2312.3=2357.53

Все видят что это сложно?Позвольте мне рассказать об этом поподробней
"45.23" контактирует с "+" , Message2 и скрипт выводит сумму Message2 и Message1.
Таблицы и циклы!

Message = { }
Message[1] = "Word"
Message[2] = 23.232
Message[3] = "This is a sentance."
Message[4] = ":D 2323424" .. 23.232 .. "!"
Echo = "Message: "
for i = 1,#Message do
Echo = Echo .. Message[i]
end
echo(Echo)

Давайте я обьсню вам это.

Message = { }

Это обьявляет новую таблицу.Таблицы (или Массивы) это группы из переменных.Они могут содержать какой либо тип переменных , даже функции!

Message[1] = "Word"

Это делает первую переменную в сообщении : "Word"

for i = 1,#Message do

Этот цикл будет идти от 1 (первая переменная в сообщении) до итоговой цифры переменных в Сообщении(#Таблицы получают итоговую сумму цифр переменных)
Этот цикл будет повторяться четыре раза(так как в данном случае здесь четыре переменных в сообщении) и каждый раз цифра "i" будет увиличиваться на 1.

Echo = Echo .. " " .. Message[i]

Это обьеденяет соответвствующие сообщения на конец строки "echo"
При запуске этого скрипта в игре в чат-боксе появиться следующее сообщение

Word 23.232 This is a sentance.232342423.232!


3

Re: [Tutorial's][Lua][RuTeam]

[b][align=centerToribash Lua Tutorial 2 - Условные операторы и функции[/align][/b]
В данной статье я расскажу вам про условных операторов , некоторые связанные с toribash'om функции и то как сделать свою функцию.
После прочитения этого туториала ты будеш уметь : Писать скрипт который выводит имя победителя в текущщем бою.
Условные операторы:
Условные операторы это одна из самых важных аспектов любого скрипта.Они позволяют вызывать функции когда ты хочеш этого , например :

a = 1
b = 2
if(a+b == 3) then
   echo("a + b == 3 :O")
else
   echo("a + b ~= 3")
end

Есть три основных части условного оператора это (If, then, else).В этом примере условное выражение это "a+b == 3".Если вы используете только один знак равенства, то появится ошибка, которая подумает что вы пытаетесь установить переменную поэтому нужно использовать два.
Вот операторы которые ты можеш использовать:

== Равно
~= Не равно
> Больше
< Меньше
>= Больше или равно
<= Меньше или равно

Так что если вы хотели бы видеть что было бы если была бы использована функция >= (Больше или равно) то вот пример:

a = 2
b = 2
if(a >= b) then
   echo("a is greater than or equal to b")
else
   echo("a is less than b")
end

Вот как все просто!
Функции связанные с Toribash:
Есть много функций связанных с toribash'om которые мы можем вызвать в lua.
Пример , если мы хотим увидеть у какого игрока больше очков в конце боя.Мы сравним счета двух игроков и узнаем у кого больше очков с помощью следующего скрипта:

Player1_Score = get_player_info(1).injury
Player2_Score = get_player_info(0).injury
if(Player1_Score > Player2_Score) then
   echo("Player 1 is winning!")
elseif(Player2_Score > Player1_Score) then
   echo("Player 2 is winning!")
else
   echo("Draw!")
end

Когда ты запустиш этот скрипт он будет показывать в конце каждого боя у кого больше очков . Довольно прикольно , да?
Вы можете увидеть список некоторых встроенных функций в Toribash в папке /data/scripts/SDK/
Создание своих функций :
Создание своих собственных функций это жизненно необходимая часть lua она позволяет повторно использовать код быстро и эффективно.
Например, если мы хотим создать функцию, которая будет показывать кто побеждает :

function winning()
   Player1_Score = get_player_info(1).injury
   Player2_Score = get_player_info(0).injury
   if(Player1_Score > Player2_Score) then
      return "Player 1"
   elseif(Player2_Score > Player1_Score) then
      return "Player 2"
   else
      return "Draw!"
   end
end

echo("Winning: ^06" .. winning())

Теперь каждый раз когда ты запускаеш этот скрипт он пишет "Winning : ***" и вместо *** имя победителя или "Draw!" в ^06 цвете (Lua может испольовать цветовые коды такой как ^06)
И вот это конец этого туториала!



4

Re: [Tutorial's][Lua][RuTeam]

[b][align=centerToribash Lua Tutorial 3 – Хуки и откладки[/align][/b]
В данной статье я буду рассказывать про хуки и отладки скриптов.
После прочтения этого туториала ты будеш уметь :
1)Делать скрипт который показывает кто из игроков лидирует по очкам и замораживает каждого игрока
2)Устранять неполадки в ваших скриптах.
Хуки :
Хук является еще одним важным аспектом lua.Он позволяют выполнять определенные функции в определенное время.
Хук выглядит примерно вот так :

add_hook("hook name","hook description", functiontocall)

Так что они могут сделать?Хуки могут позволить тебе нарисовать текст на экране или писать кто выигрывает каждые например 50 фреймов.
Ты можеш найти лист хуков в файле startup.lua (который находиться в папке data/script/) в таблице events , но сейчас мы будем использовать “enter_freeze” хук.
Давайте используем скрипт который остался с предыдущего туториала из него мы можем сделать скрипт, который будет повторять текущего лидера довольно легко.

function winning()
Player1_Score = get_player_info(1).injury
Player2_Score = get_player_info(0).injury
if(Player1_Score > Player2_Score) then
return "Player 1"
elseif(Player2_Score > Player1_Score) then
return "Player 2"
else
return "Draw!"
end
end

echo("Winning: ^06" .. winning())

Так, это наш код.Для того чтобы называть лидера каждый раз мы должны немного изменить этот код.Прежде всего мы создадим функцию которая называет его(лидера) , проще говоря echo(“Winning…  и посмотрим что получилось :

function winning()
   Player1_Score = get_player_info(1).injury
   Player2_Score = get_player_info(0).injury
   if(Player1_Score > Player2_Score) then
      return "Player 1"
   elseif(Player2_Score > Player1_Score) then
      return "Player 2"
   else
      return "Draw!"
   end
end

function enter_frame()
    echo("Winning: ^06" .. winning())
end

Далее нам нужно добавить хук чтобы наши функции работали.Сделать это можно добавив следующую строку в нижнию часть скрипта:

add_hook("enter_freeze","echowinner",enter_frame)

Это просто!
Я расскажу больше про хуки в следущих туториалах.
Отладка:
Если ты экспереметировал с скриптами и если у тебя чтото пошло неправильно и ты не мог все починить значит это все изза того что toribash думает что ты допустил ошибку в коде.Чаще всего toribash не говорит где и на какой строке все пошло не так.И здесь приходит “stderr.txt”.
Если ваш скрипт выдаёт ошибку, или работает не должным образом вам необходимо проверить файл stderr.txt, чтобы увидеть, какие ошибки есть в скрипте. Вот пример распространенной ошибки:

Lua script error in file errorscript.lua: data/script/errorscript.lua:2: attempt to index global ‘a’ (a nil value)

Давайте рассмотрим это.Прежде всего этот текст говорит нам что в lua скрипте допущена ошибка , это не важно сейчас но будет важно когда мы будем запускать несколько скриптов сразу.Далее нам говорят где находиться скрипт и ошибочная строка (в данном случае 2) допущена ошибка и говорят описание ошибки.В данном случае ошибка расшифровувоетса так- она говорит что таблица создана не должным образом,то есть нужно чтобы было "a = { }" а у тебя видимо не так (в данном случае "a=" это переменная а "{}" таблица).
Другие ошибки :

Lua script error in file errorscript.lua: data/script/errorscript.lua:3: ‘}’ expected (to close ‘(‘ at line 2) near ‘echo’

Ты закрыл не все скобки правильно.

Lua script error in file errorscript.lua: data/script/errorscript.lua:2: attempt to perform arithmetic on global ‘b’ (a nil value)

Значение 'b' было не определено. (тебе нужно a b=x)
На этом мой туториал кончился.
Если у вас возникли вопросы задавайте их в оффициальной теме.



5

Re: [Tutorial's][Lua][RuTeam]

[b][align=centerToribash Lua Tutorial 4 – Рисование[/align][/b]
В этом туториале я расскажу вам как рисовать в 2D и 3D
В конце этого туториала ты сможеш :
1.Рисовать текст я динамическим размером и задним фоном
2.Рисовать шарики.
Рисование в 2D
Все рисование в lua происходит благодоря хукам.Чтобы рисовать в 2d тебе нужно использовать draw2d хук и для рисования в 3d тебе нужно использовать хук draw3d .Так давайте рассматривать рисование в двух измерениях.

add_hook("draw2d","draw", draw2dfunc)

Это draw2d хук , давайте рассмотрим основные функции.

set_color(r,g,b,a)

Для рисования чего либо ты долженг выбрать цвет r=красный g=зеленый b=синий и a=альфа(прозраный).Номера должны находиться в диапазоне от 0-1. (0,0,0,1) для черного и (1,1,1,0.5) для белого цвета.

draw_quad(x,y,w,h,texture)

Теперь попробуем нарисовать прямоугольник в Lua. х = х координат, у = у-координата, W = ширина, Н = высота и опция текстуры, которую я возможно рассмотрю позже.

draw_disk(x, y, inner, outer, slices, loops, start, sweep, blend)

Это код многоугольника x-x кооддината, inner-расстояние с внутреннего радиуса, y-у координата,outer-расстояние с внешнего радиуса.slices-кол-во углов(3-треугольник 4-четырехугольник).

draw_text(text,x,y,font)

Это код рисования текста.text=текст который будет нарисован , x= координата x , y=y координата.Шрифт выбирается цифрой 0-5 пример шрифтов вы увидите ниже
[img]http://i300.photobucket.com/albums/nn24/blambear93/fontsizes.png[/img]
Важныя заметка:
Координаты (0,0) обозначают что текст находится в верхнем левом углу, тем выше значение "х", правее вы рисуете, тем больше "у" значение, тем более в нижней части экрана вы рисуете. Пример: 100, 300 будет 100px справа от верхнего левого угла и 300px вниз.
Так давайте начнем рисовать наш первый прямоугольник!

function draw2dfunc()
    set_color(0,0,0,1)
    draw_quad(10,300,100,200)
end
add_hook("draw2d","draw", draw2dfunc)

Этот скрипт рисует прямоугольник с (10,300) до (110,500).
Давайте нарисуем немного более продвинутей и попродуем добавить какой-либо текст и динамическую форму прямоугольника.

text = { } -- Blank table
text[1] = "This is some text"
text[2] = "This is more text"
text[3] = "MOOOOOOOOOO"
text[4] = "Just a basic test really"
text[5] = "weeeeeeeeeeeeeeeeeee"
text[6] = "1231923823982938"
text[7] = 123.23
text[8] = "Blam is the best  "
placey = 200
function draw2dfunc()
    ScreenWidth, ScreenHeight = get_window_size()
    set_color(0,0,0,1)
    draw_quad(10,placey,ScreenWidth-20,#text*17.5)
    set_color(1,1,1,1)
    for i = 1,#text do
        draw_text(text[i],12,(i*17)-17+placey,1)
    end
end
add_hook("draw2d","draw", draw2dfunc)

Так чтот я написал много вам непонятного так что давайте все рассмотрим.

text = { }
text[1] = "This is some text"
text[2] = "This is more text"
text[3] = "MOOOOOOOOOO"
text[4] = "Just a basic test really"
text[5] = "weeeeeeeeeeeeeeeeeee"
text[6] = "1231923823982938"
text[7] = 123.23
text[8] = "Blam is the best  "

Это текст который мы выводим на дисплей.

placey = 200

Это определяет где текст будет отображаться по оси x, в данном случае 200px сверху вниз .

ScreenWidth, ScreenHeight = get_window_size()

ScreenWidth-ширина окна в котором будет отображаться текст ScreenHeight-высота окна в котором будет отображаться текст.

#text*17.5

Размер шрифта (я предпочитаю именно этот размер потомучто это самый оптимальный вариант на мой взгляд)

(i*17)-17+placey

Расположение по оси y.
Рисование в 3D
Как я уже говорил рисование в 3d нужнается в draw3d хуке

add_hook("draw3d","draw", draw3dfunc)

Для рисования сферы в 3D нужно использовать :

draw_sphere(x,y,z,radius)

Сейчас если мы хотим нарисовать сферу над головой у тори мы должны узнать позицию нашей головы , для этого мы можем использовать :

x, y, z = get_joint_pos(0, 0)

Здесь x,y, и z являються x,y, и z координатами джоинта шеи нашего тори также можно сделать так :

get_joint_pos(player, joint)

список джоинтов здесь
А теперь можно и нарисовать что-то
Я нарисовал вот так

function draw3dfunc()
x, y, z = get_joint_pos(0, 0)
    set_color(0,0,0,1)
    draw_sphere(x,y,z,0.4)
end
add_hook("draw3d","draw", draw3dfunc)

На этом туториал  кончаеться.Спасибо за прочтение.Я расскажу вам более про 3D в следущих туториалах.



6

Re: [Tutorial's][Lua][RuTeam]

несомненно + и респект,жду продолжения,кстати отлично придумал набить посты ;D



7

Re: [Tutorial's][Lua][RuTeam]

:О не осилил прочитать , но всё же +
думаю пригодиться мне когда нибудь

http://streambadge.com/twitch/dark/vulexx.png
Ruteam old member. Toribash teacher


8

Re: [Tutorial's][Lua][RuTeam]

[s]Мультипост детектед[/s] Круто, все прочитал но нихера не понял. Седня сяду, изучу подробнее. Лови плюху.