Добро пожаловать на форумы Боевого Народа (бывший форум Live.CNews.ru)!

ВАЖНЫЕ ТЕМЫ: FAQ по переезду и восстановлению учеток | Ошибки и глюки форума.
О проблемах с учетными записями писать СЮДА.
Expression 2 - Форумы Боевого Народа
IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
Expression 2, Garry's Mod
сообщение 3.12.2013, 11:47
Сообщение #1





Группа:
Сообщений: 0
Регистрация: --
Пользователь №:



Введение: Wire Expression 2 – дополнение Garry’s mod, позволяющее использовать сразу несколько чипов в одном. С помощью него можно создавать различные устройства, и он поможет вам воплотить все ваши мечты в игре. В Expression 2 используется язык, похожий на многие другие языки программирования, поэтому тем, кто хорошо знает Английский язык и какой-нибудь из языков программирования, будет легче изучить этот. Здесь показаны самые основные и важные приемы обращения с чипами, но, хорошо изучив эту справку, вам в будущем будет намного легче работать с ними и изучать новое.

Часть I Ознакомление

Сначала ознакомимся с первыми пятью строками:

@name - Имя чипа, которое будет отображаться, когда вы наведёте на него курсор. Параметр необязателен. Но если его оставить пустым, то при
наведении на него курсора будет написано "generic".
@inputs – Строка, в которой перечислены входы. Здесь могут быть подключены различные кнопки, значения и т.д. Объяснение: Здесь будет информация, поступающая в чип.
@outputs - Строка, в которой перечислены выходы. Здесь могут быть подключены все устройства, требующие управление. Например, если создаёте машину, могут быть подключены те же турбины, парящие шары, турели и т.д.
@persist – Строка, в которой перечислены переменные, которые будут храниться внутри чипа и меняться. Сложный и важный параметр.

Первый пример:
Код:
@name Add Expression
@inputs A B
@outputs Out
@persist
@trigger All
Out = A + B

Такой чип складывает значения A и B и выводит результат на выход Out. Пример: К A подключено значения константы 5, а к B значение константы 2. К выходу Out подключен экран, и он показывает результат «7». @trigger All обозначает «Включить всё».
Внимание! Чипы очень чувствительны к регистру. Поэтому читайте всё внимательно. Например, если вы напишете IF или If вместо if, то это будет ошибкой.

Чипы могут выполнять и другие математические действия:
Out = A – B (вычитание)
Out = A / B (деление)
Out = A * B (умножение)
Out = A ^ B (возведение A в степень В)

Часть II If – Then - Else конструкция

Функция if — самая элементарная и часто используемая. Она работает на принципе клапана и читается так: Если (if) условие, верно, то (then) сделать действие первое, иначе (else) сделать действие второе.

Пишется так:
Код:
if (A == 1) {Out = B} else {Out = C}

То есть если A равно единице, то значение Out будет равно В, иначе будет равно С. Внимание! В условии «равно» пишется не =, а == (два знака равно).

Вот и пример:
Код:
@name Control
@inputs Button
@outputs Out
@persist
@trigger All
if (Button == 1) {Out = 30} else {Out = 5}



Я думаю, что тут всё понятно. Button – это кнопка, подключенная к чипу. Если её значение равно 1 (это стандартное значение нажатой кнопки), то выполнить условие.
Внимание! В некоторых случаях можно писать без Else (без второго действия).
if (Button) {Out = 30}
В этом случае значение не сбрасывается и после нажатия на нашу кнопку, значение Out продолжит быть 30, пока мы не сделаем другое условие которое будет принимать нужное нам значение.
Вот еще один пример.

Пример спидометра

@name Speed
@inputs Speedometer Button
@outputs Out
@persist
@trigger All
if(Button == 1) {Out = Speedometer} else {Out = 0}

У нас есть значение A и к выходу подключен звук. Работает так: Если значение A больше, либо равно десяти, то включаем звук, иначе «молчим». С помощью этого примера можно сделать будильник, думаю чуть позже вы сможете его сделать.
Так же можно вставлять несколько условий.

Вот пример:
Код:
@name Test
@inputs Button1 Button2
@outputs Out
@persist
@trigger All
if (Button1 ==1 | Button2 == 1) {Out = 5} else {Out = 0}

Код:
@name Test
@inputs Button1 Button2
@outputs Out
@persist
@trigger All
if (Button1 >= 0 & Button2 == 54) {Out = 5} else {Out = 0}



Если значение первой кнопки больше, либо равно нулю и значение второй кнопки равно «54», то подать на выход значение «5», иначе «0».

Часть IV Функция «Интервал»

Теперь ознакомимся с функцией interval(), которая показывает, через какое время код будет заново перезапускаться. Выражается она в миллисекундах. Сделаем простой таймер:
Код:
@name Timer
@inputs
@outputs Explode
@persist Time
@trigger All
interval(1000)
Time = Time + 1
if(Time == 10) {Explode = 1, Timer = 0} else {Explode = 0}



Разберём по строкам.
К выходу у нас подключен динамит «Explode».
Time - Переменная для времени, она используется в конструкции if.
«interval(1000)» - Делаем так, чтобы код перезапускался каждые 1000 мс или каждую секунду.
«Time = Time + 1» - при запуске кода прибавляем к времени 1 единицу, поскольку у нас код перезапускается каждую секунду, получается, что каждую секунду мы прибавляем к времени единицу. Так же может записываться как «Time += 1» или «Time++» (последняя команда означает поднятие на единицу). Если бы мы поднимали значение не на единицу то использовать её нельзя было бы.
Как работает: Если время будет равно «10», то на выход будет подано значение «1», и динамит взорвётся, а таймер сбросится. А если время меньше «10», то на выход подаём значение «0».

Вот ещё более сложный код:
Код:
@name Timer
@inputs Button
@outputs Explode
@persist Time
@trigger All
interval(1000)
if(Button) {
Time = Time + 1
if(Time == 10) {Explode = 1} else {Explode = 0}
} else {Time = 0}



Если кнопка включена, то прибавляется время.
Если время больше «10», то подать на Explode значение «1», иначе значение «0».
А если кнопка выключена, то время сбрасывается на «0». Данный пример называется «Условие в условии».



Если нажата одна или другая кнопка, то подать на выход значение «5».
Новые знаки: Знак | обозначает «или», а знак & обозначает «и». Можно делать и более сложные комбинации:

Часть V Векторы

Векторы - одно из нововведений в Еxpression 2 в отличии от первого. Является небольшим массивом вида X,Y,Z. Зачем же он вообще нужен? В основном для определения местоположения чего-либо и передвижения (см. ниже), так же вектором удобнее задавать какую-то определённую точку. Вектор и простые числа - это разные типы входов, выходов и переменных.
Внимание! Пример неправильной операции:
Код:
vec(300,200,300) + 8



В данном случае чип скажет, что это недопустимая операция, т.к. мы попытались сложить 2 разных типа переменных. А правильный код должен выглядеть так:
Код:
vec(300,200,300) + vec(8,8,8) = vec(308,208,308)



Естественно, что не обязательно чтобы у второго слагаемого были одинаковые X, Y и Z.
Чтобы чип различал типы переменных к векторным входам\выходам надо добавлять постфикс :vector
Код:
@name GPS
@inputs GPS:vector Button
@outputs Out:vector
@persist
@trigger All
if(Button == 1) {Out = GPS} else {Out = vec()}



Где vec() - нулевой вектор, можно также записать как vec(0,0,0).
Векторам можно отдельно задавать каждый параметр:
Код:
V:setX(#)
V:setY(#)
V:setZ(#)



Где # - необходимое значение.
А если вам надо получить какое-то значение с вектора, то можно использовать это.
Код:
V:x()
V:y()
V:z()



Для примера узнаем высоту, на которой мы находимся:
Код:
@name Height
@inputs GPS:vector
@outputs Height
@persist
@trigger All
Height = GPS:z()



Так же к векторам можно отнести applyForce(), но о нём я расскажу после entity...

Часть VI Entity

Entity - объекты, то есть тип переменной, хранящей в себе информацию о каком-нибудь предмете, боте или игроке. Отсюда можно узнать его местоположение, имя, модель и т.д. В Wire есть альтернатива - Beacon Sensor, но всё-таки у Еxpression 2 намного больше возможностей.
Предположим, что мы хотим знать точно где расположен наш чип. У чипа есть собственная Entity - entity(), из которой можно узнать вектор. Ну а из вектора можно "извлечь" координаты.

Вот пример:
Код:
@name GPS
@outputs X Y Z
@persist Ent:entity Vec:vector
@trigger All
interval(10)
Ent = entity()
Vec = entity():pos()
X = entity():pos():x()
Y = entity():pos():y()
Z = entity():pos():z()



Здесь мы сначала нашли Entity чипа, затем из него выразили все координаты. Заметьте, совсем не обязательно делать столько переменных, я их сделал для пущей наглядности. Как вы поняли Entity тоже имеют свой постфикс - :entity. Посколько координаты чипа могут меняться, поставим интервал – 10 мс.
applyForce(V)
Теперь можно ознакомится с одной из самых интересных функций чипа - применением силы. Вектором задаётся тяга.
Код:
@name Force Test
@persist
@trigger All
entity():applyForce( vec(0,0,1000) )



Как видите, тут тоже появляются Entity, именно они тянут. В данном случае на сам чип прилагается сила в 1000 единиц, то есть он летит вверх (если вы конечно его не заморозили). Если бы мы подали не 1000 а -1000, то чип бы стремился вниз, и так по всем осям.

Как же сделать простой предмет-убийцу? Давайте попробуем.
Код:
@name MingeProp
@inputs Player:entity
@persist
interval(10)
LocalPos = Player:pos() - entity():pos()
entity():applyForce(LocalPos*10000000)



Для того чтобы приложить силу в направлении какого либо игрока, нужно знать локальные координаты относительно чипа, они узнаются (координата назначения минус координата положения чипа). Но поскольку вектор получается не очень большим, мы его умножаем на очень большое число (чем больше, тем больнее ). Поскольку мы ещё не умеем находить игроков самим чипом, предусмотрен вход Entity, который можно получить с помощью Target Finder. Интервал здесь нужен для обновления информации о местоположении. Когда вы запустите вашего убийцу, то он сразу полетит в направлении игрока.

Часть VII Strings

В Еxpression 2 появился новый тип данных – strings или "тексты". Они нужны для чат-ботов, Console Screen и Entity Discover (всё это будет ниже). Сами тексты записываются в виде "test" и отображаются серым цветом, в первых четырёх строках у них постфикс S:string.
Тексты можно складывать ("Te" + "st" = "Test"), сравнивать (if (S == "string") {...} ) и использовать команду += ( if (Button) {Text += "a"} )

Разберём простой пример:
Код:
@name String Test
@inputs Button
@persist
@trigger All
if (Button) {
print("Hello world!")
}



Когда мы нажимаем на кнопку, у нас в чате появляется Hello world!
Теперь напишем код, чтобы отслеживать статистику сервера.
Код:
@name Server Info
@persist
@trigger All
interval(50) #интервал нужен для обновления последнего сообщения чата
if ( lastSaid() == "getinfo") {
print( hostname() )
print( "Map: " + map() )
print( "Players: " + toString(numPlayers()) + "/" + toString(maxPlayers()) )
}



Когда мы в чат пишем getinfo, то получаем информацию: Имя сервера, карту и количество игроков.
Здесь я собрал несколько наиболее часто используемых команд, связанных с текстами.
lastSaid() - команда означает последнее сообщение чата
toString(#) - команда которая переводит цифры в текстовый формат ( toString(5) + " test" = "5 test")
print( "Map: " + map() ) – показать имя карты.
print( "Players: " + toString(numPlayers()) + "/" + toString(maxPlayers()) ) – показать количество игроков.

Часть VIII Array и Table

Я решил совместить массивы и таблицы, потому что по сути это почти одно и то же. Массив - это группа нескольких значений (цифры, тексты, Entity), причём каждое значение имеет свой номер, а таблица - это несколько значений (те же типы), но каждое имеет своё название в форме текста (string). На первых четырёх строках постфиксы переменных R:array и T:table соответственно.
Разберёмся сначала с массивом.
Изменяется информация в ячейках массива командами:

R:setNumber(<номер ячейки>,<число>)
R:setString(<номер ячейки>,<текст>)
R:setEntity(<номер ячейки>,<объект>)
Получать же значения из ячеек мы будем с помощью команд:
R:<тип>(<номер ячейки>)
Где тип - number, string или entity.

Пример для демонстрации:
Код:
@name Array Test
@persist R:array
@trigger All
R:setString(1,"lolwut?")
R:setString(2,"omg")
R:setString(3,"NOOO")
Мы создали небольшой массив, его можно представить так:
1 lolwut?
2 omg
3 NOOO



Теперь выведем это к нам в чат:
Код:
@name Array Test
@persist R:array
@trigger All
R:setString(1,"lolwut?")
R:setString(2,"omg")
R:setString(3,"NOOO")
print( R:string(1) )
print( R:string(2) )
print( R:stirng(3) )



Таблицы - это те же самые массивы только вместо ячеек - названия, то есть код будет выглядеть весьма знакомо:
Код:
@name Array Test
@persist R:array
@trigger All
R:setString("ololo1","lolwut?")
R:setString("ololo2","omg")
R:setString("ololo3","NOOO")
print( R:string("ololo1") )
print( R:string("ololo2") )
print( R:stirng("ololo3") ).
Перейти в начало страницы
Вставить ник
+Цитировать сообщение

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 27.4.2024, 16:30
Консультации адвоката по уголовным делам. Бесплатно. По всей России