В Метавселенную
Еще в 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”