Рубрики
Без рубрики

Скриптовый язык Linden

В Метавселенную еще в 2006 году, когда я смотрел TechTV, я впервые взглянул на Second… С тегами secondlife, java, c, игры.

В Метавселенную

Еще в 2006 году, во время просмотра TechTV, я впервые увидел Second Life, социальную онлайн-игру, которая с тех пор занимала огромные куски моей жизни. В то время, и во многих отношениях даже сейчас, это была самая крутая вещь, которую я когда-либо видел. Этот огромный 3D-мир, где все было сделано пользователями. Одежда, которую вы носите, места, которые вы посещаете, и, самое главное, сценарии, которые заставляют все работать, были созданы людьми, играющими в игру.

Часть сценариев, в частности, заинтересовала меня, и это одна из главных причин, по которой я начал изучать программирование. Создавать интерактивные творения, какими бы простыми или глупыми они ни были, и наблюдать за их работой было похоже на волшебство. Сейчас я просто делаю это с помощью мобильных телефонов и браузеров, но искра, которая создала все это, началась в Second Life.

Именно по этой причине я собираюсь дать вам всем краткое представление о коде, который запускает этот язык сценариев digital world, LSL или Linden.

Что такое LSL?

LSL – это язык, на котором выполняются все скрипты в Second Life. Эти наборы инструкций могут быть помещены в любой объект, который вы создаете внутри игры. Его можно использовать для создания всевозможных сумасшедших вещей, начиная с автомобилей, оружия, огней, дверей и даже игр внутри игры (мета, верно?).

Эти скрипты могут быть написаны и скомпилированы во внутриигровом редакторе, где они выполняются серверами игры. Его структура в значительной степени основана на Java и C, но с акцентом на состояния и события. Но помимо этого в нем есть множество функций, которые вы привыкли ожидать от языка программирования: функции, управление потоком с помощью операторов if и while и операторов.

Если вы хотите написать сценарий двери, у нее может быть такое состояние, как “открыто” или “закрыто”, лампа будет иметь состояния “включено” и “выключено”, цифровое огнестрельное оружие может быть “заряжено” или “пусто” и т. Д. и т. Д.

События – это триггеры в Second Life, которые запускают функции и изменяют состояние объекта. Эти события могут быть самыми разными: произнесение определенной строки в окне чата, щелчок или столкновение с объектом и т.д.

Привет, Мир Аватар

Вот самый простой скрипт в LSL, простой “Привет, мир”, который запускается, когда объект “перезагружается” или загружается в мир, и сообщение в чате “прикосновение”, когда пользователь нажимает на объект.

default
{
    state_entry()
    {
        llSay(0, "Hello, Avatar!");
    }

    touch_start(integer total_number)
    {
        llSay(0, "Touched.");
    }
}

И вот разбивка того, что происходит в каждой строке:

default // All Scripts need a Default State

{ // this open curly bracket denotes the start of the state
    state_entry() // an event
    {
        llSay(0, "Hello, Avatar!"); // a function inside the event's curly brackets
    } // closed curly bracket closes the state_entry event

    touch_start(integer total_number)  // another event inside default state
    {
        llSay(0, "Touched."); // a function between the brackets of the touch_start body
    } // end of touch start
} // Code end

И вот пример скрипта, который превращает объект из белой текстуры в черную по щелчку, что может быть полезно, скажем, для лампы или светильника:

default //default state is mandatory
{
    state_entry() // runs each time the state is entered
    {
        llSay(0, "turning on!"); //object speaks!
        llSetColor(<1.0, 1.0, 1.0>, ALL_SIDES); // sets no tint (white)
        // note the semicolons at the end of each instruction
        // (do not put them at the end of "if" statements)
    }

    touch_end(integer total_number) // another event with only one function inside
    {
        state off; // sets the script to a new "state" and starts running "state off"
    }
} // this curly bracket ends the body of the default state.

state off // a second state besides "default"
{
    state_entry() // this is run as soon as the state is entered
    {
        llSay(0, "turning off!");
        llSetColor(<0.0, 0.0, 0.0>, ALL_SIDES); // sets black tint
    }

    touch_end(integer total_number)
    {
        state default;
    }
}

Наконец, вот кое-что, что я создал. Этот скрипт берет изображение, состоящее из каждого неподвижного кадра анимированного gif, и изменяет его расположение на каждом тике, чтобы создать анимированную текстуру в игре, которую я затем вставил в пару солнцезащитных очков, которые кто-то сделал, чтобы создать этот классный статический эффект на линзах.

 integer animOn = TRUE; //Set to FALSE and call initAnim() again to stop the animation.
  5 //Effect parameters: (can be put in list together, to make animation have all of said effects)
  6 //LOOP - loops the animation
  7 //SMOOTH - plays animation smoothly
  8 //REVERSE - plays animation in reverse
  9 //PING_PONG - plays animation in one direction, then cycles in the opposite direction
 10 list effects = [LOOP];
 11 //Movement parameters (choose one):
 12 //ROTATE - Rotates the texture
 13 //SCALE - Scales the texture
 14 //Set movement to 0 to slide animation in the X direction, without any special movement.
 15 integer movement = 0;
 16 integer face = ALL_SIDES; //Number representing the side to activate the animation on.
 17 integer sideX = 1; //Represents how many horizontal images (frames) are contained in your texture.
 18 integer sideY = 1; //Same as sideX, except represents vertical images (frames).
 19 float start = 0.0; //Frame to start animation on. (0 to start at the first frame of the texture)
 20 float length = 0.0; //Number of frames to animate, set to 0 to animate all frames.
 21 float speed = 10.0; //Frames per second to play.
 22 initAnim() //Call this when you want to change something in the texture animation.
 23 {
 24     if(animOn)
 25     {
 26         integer effectBits;
 27         integer i;
 28         for(i = 0; i < llGetListLength(effects); i++)
 29         {
 30             effectBits = (effectBits | llList2Integer(effects,i));
 31         }
 32         integer params = (effectBits|movement);
 33         llSetTextureAnim(ANIM_ON|params,face,sideX,sideY,     start,length,speed);
 34     }
 35     else
 36     {
 37         llSetTextureAnim(0,face,sideX,sideY, start,length,speed);
 38     }
 39 }
 40 
 41 fetch()
 42 {
 43      string texture = llGetInventoryName(INVENTORY_TEXTURE,0);
 44             llSetTexture(texture,face);
 45             list data  = llParseString2List(texture,[";"],[]);
 46             llOwnerSay( llDumpList2String(data ,","));
 47             string X = llList2String(data,1);
 48             string Y = llList2String(data,2);
 49             string Z = llList2String(data,3);
 50             
 51             // llOwnerSay("X=" + X + " Y=" + Y + " Z = " + (string) Z);
 52             
 53             sideX = (integer) X;
 54             sideY = (integer) Y;
 55             speed = (float) Z;
 56             if(speed) 
 57                 initAnim();
 58 }
 59 
 60 default
 61 {
 62     state_entry()
 63     {
 64         llSetTextureAnim(FALSE, face, 0, 0, 0.0, 0.0, 1.0); // V2 - remove all anims
 65         fetch();
 66     }
 67     changed(integer what)
 68     {
 69         if(what & CHANGED_INVENTORY)
 70         {
 71             fetch();
 72         }
 73     }
 74 }

И это, очевидно, только верхушка айсберга того, что вы можете сделать с помощью LSL. Лучшие программисты, чем я, создали в игре несколько поистине удивительных вещей. Если вы хотите узнать больше о LSL, ознакомьтесь с SL wiki и, возможно, даже скачайте игру и попробуйте (просто, э-э, избегайте взрослых симов).

Оригинал: “https://dev.to/tehbakey/linden-scripting-language-3aea”