Команда rutori приветствует тебя на данном ресурсе - русском новостном блоге игры Toribash.
Для более удобного использования блога ты можешь войти, чтобы иметь возможность создавать новые темы и даже постить свои новости.
Если же ты впервые на рутори - ты можешь зарегистрироваться или же продолжить просмотр блога в режиме гостя, в котором ты также сможешь оставлять комментарии к новостям.

Блог развивается при
поддержке организации

[Tutorial]Lua

 :: rutori :: FaQ

Предыдущая тема Следующая тема Перейти вниз

[Tutorial]Lua

Сообщение автор apozzman в Ср 16 Фев 2011, 01:09

Toribash Lua Tutorial 1 – Основы

Этот туториал я написал про то как делать скрипты в торибашэ используя 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!




Toribash Lua Tutorial 2 - Условные операторы и функции
В данной статье я расскажу вам про условных операторов , некоторые связанные с 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)

И вот это конец этого туториала!




Toribash Lua Tutorial 3 – Хуки и откладки

В данной статье я буду рассказывать про хуки и отладки скриптов.
После прочтения этого туториала ты будеш уметь :
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)

На этом мой туториал кончился.

Если у вас возникли вопросы задавайте их в оффициальной теме.




Toribash Lua Tutorial 4 – Рисование
В этом туториале я расскажу вам как рисовать в 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 пример шрифтов вы увидите ниже

Важныя заметка:

Координаты (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 в следущих туториалах.



Возможен неправильный перевод ибо половина насколько я помню была переведена гуглом Very Happy

apozzman
Продвинутый

Сообщения : 105
Дата регистрации : 2010-03-12
Настроение : хорошее :]

Вернуться к началу Перейти вниз

Re: [Tutorial]Lua

Сообщение автор Денис в Ср 16 Фев 2011, 07:24

Ниасилил. Да и lua я тоже врядле осилю
avatar
Денис
Уподобившийся Богам

Сообщения : 783
Дата регистрации : 2009-04-26
Возраст : 22
Откуда : Из Находки
Настроение : Спартанское!

Вернуться к началу Перейти вниз

Re: [Tutorial]Lua

Сообщение автор Sylar95 в Ср 16 Фев 2011, 21:10

написано понятным языком.
хорошо
avatar
Sylar95
Админ

Сообщения : 581
Дата регистрации : 2009-09-12
Возраст : 22
Откуда : Омск

Вернуться к началу Перейти вниз

Re: [Tutorial]Lua

Сообщение автор BaTHblU в Чт 17 Фев 2011, 01:27



написано может и понятно, но



Денис пишет:Ниасилил.
avatar
BaTHblU
Профи

Сообщения : 348
Дата регистрации : 2010-10-30

Вернуться к началу Перейти вниз

Re: [Tutorial]Lua

Сообщение автор Mariacho в Пт 18 Фев 2011, 04:33

оу.. ночью уже не буду вникать, но как время будет может соберусь себе сделать уникальные опены в скрипте =D
avatar
Mariacho
Профи

Сообщения : 274
Дата регистрации : 2010-03-13
Возраст : 24
Откуда : Ижевск

http://uoy.2bb.ru/

Вернуться к началу Перейти вниз

Re: [Tutorial]Lua

Сообщение автор Sylar95 в Сб 26 Фев 2011, 18:05

можешь не мучиться, возьми скрипт слко movie saver
или как там
avatar
Sylar95
Админ

Сообщения : 581
Дата регистрации : 2009-09-12
Возраст : 22
Откуда : Омск

Вернуться к началу Перейти вниз

Re: [Tutorial]Lua

Сообщение автор BaTHblU в Пн 28 Фев 2011, 23:40

да лучше вообше просто не мучаться и забить.
avatar
BaTHblU
Профи

Сообщения : 348
Дата регистрации : 2010-10-30

Вернуться к началу Перейти вниз

Re: [Tutorial]Lua

Сообщение автор Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 :: rutori :: FaQ

 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения