Pada zaman dahulu, dalam blog ini, jauh ... dengan baik, ia telah lama tetapi mungkin tidak begitu lama. Atau mungkin ia telah lama. Posting ini telah duduk di dalam barisan untuk minggu sekarang dan saya yakin Ener bosan melihatnya :).
Berterusan pada awal tema "Perkongsian Bytecode Mono" , diikuti oleh "Adakah skrip anda perlu stokin" , dan kemudian oleh "Letakkan description objek kepada penggunaan yang baik" , dalam pos ini, kami akan melihat menggunakan notecards untuk pilihan mengkonfigurasi untuk skrip.
Untuk meringkaskan tema sekali lagi, mampu untuk mengkonfigurasi skrip untuk pelbagai tujuan mempunyai sekurang-kurangnya dua kelebihan.
Notecard pemprosesan di SL adalah benar-benar adil mudah. Sifat acara berorientasikan LSL skrip digabungkan dengan pelaksanaan tak segerak talian notecard membaca boleh mengelirukan pada mulanya. Tetapi setelah memahami apa yang sedang berlaku, kebanyakan orang berurusan dengan agak baik. Dan selepas anda membina satu model, hanya salin ia lebih dan lebih lagi.
Jadi mengapa kita lakukan ini?
Saya fikir menggunakan stokin atau kaedah perihal objek adalah lebih mudah tetapi mempunyai had jika anda mahu untuk menyokong pelbagai pilihan konfigurasi. Menggunakan notecards menyediakan peluang yang hampir tidak terhad untuk konfigurasi.
Jangan semasa satu keperluan mutlak, secara amnya anda mungkin mahu melihat jika notecard anda wujud sebelum cuba untuk membaca. Anda boleh memilih untuk membuat notecard yang diperlukan atau pilihan tetapi masih ia baik untuk mengetahui sama ada ia berada di situ atau tidak.
llGetInventoryType (NOTECARD)
Yang llGetInventoryType dengan pembolehubah tali menamakan notecard adalah bagaimana anda boleh memberitahu jika terdapat notecard dengan nama yang dijangka dalam inventori objek. Pembolehubah yang digunakan untuk menentukan nama notecard mungkin akan perlu untuk menjadi pembolehubah global (ditakrifkan di bahagian atas skrip di luar mana-mana subrutin atau negeri). Ia perlu menjadi global supaya nilai boleh didapati di dalam acara. Lebih lanjut mengenai itu kemudian. Fungsi sebenarnya kembali sama ada jenis item tersebut dengan nama yang diminta atau INVENTORY_NONE bendera jika tiada objek dengan nama itu.
A sidenote pada konvensyen menamakan pembolehubah saya. Saya mendapat ini daripada beberapa cadangan gaya LSL tempat. Untuk satu pemboleh ubah yang saya boleh merawat sebagai sesuatu yang tetap, saya memanfaatkan semua huruf seperti dalam NOTECARD. Untuk satu pemboleh ubah yang saya telah ditakrifkan bahawa ia adalah global tetapi tidak adalah pemalar, saya memulakan pembolehubah dengan kecil "g" diikuti dengan huruf besar yang bermula nama deskriptif. Untuk satu pemboleh ubah yang tidak global tetapi hanya hidup di dalam satu subrutin atau peristiwa, saya meninggalkan sebagai huruf kecil semua.
jika (llGetInventoryType (NOTECARD) == INVENTORY_NOTECARD dari)
Anggapan yang NOTECARD rentetan mengandungi notecard yang nama yang dikehendaki, ini jika kenyataan akan benar jika notecard wujud.
LlGetNotecardLine fungsi fungsi penting yang seterusnya.
gQuery = llGetNotecardLine (NOTECARD, gLine);
Dalam contoh ini, NOTECARD masih rentetan yang mengandungi nama notecard itu. Pembolehubah gLine adalah garis notecard yang sebenar untuk membaca dan mungkin akan perlu menjadi pembolehubah global. Ini perlu sentiasa bermula sebagai sifar dan incremented dengan baca setiap. Jika anda tidak kenaikan itu, anda akan terus membaca baris yang sama berulang kali. Pembolehubah gQuery mengembalikan kunci unik yang boleh digunakan untuk mengenal pasti bahawa data sedang pulang dari majlis itu. Dan ya, ini mungkin akan perlu untuk menjadi pembolehubah global.
Ini adalah di mana LSL berbeza dari bahasa tahap yang paling tinggi kamu dapat mengetahui. Anda biasanya harapkan data boleh didapati kepada penyata berurutan berikutan llGetNotecardLine. Ingat saya sebutkan acara yang dipacu dan tak segerak sebelum? Di LSL, data dikembalikan melalui dataserver acara. LSL mengembalikan banyak barang melalui acara dataserver dan itulah sebabnya kami perlu untuk menyelamatkan kunci dari llGetNotecardLine seperti dalam contoh yang menggunakan pembolehubah gQuery yang tahan kekunci yang dipulangkan, atas.
Titik utama di sini ialah tidak menulis skrip anda menjangkakan bahawa bacaan yang telah berlaku selepas fungsi llGetNotecardLine dipanggil. Bagi kebanyakan bahagian, yang lain tindakan itu akan mengambil tempat dalam acara dataserver sehingga anda benar-benar dilakukan dengan membaca notecard. Contoh yang dibekalkan boleh berkhidmat sebagai model dan menunjukkan teknik untuk digunakan untuk membantu anda secara logik memisahkan pemprosesan data notecard dari fungsi utama skrip anda.
Sekarang untuk acara dataserver. Perkara pertama yang anda perlu lakukan adalah pastikan bahawa peristiwa yang dicetuskan adalah satu yang memberikan anda garis notecard. Anda boleh melakukan ini dengan memeriksa bahawa kunci yang dibekalkan kepada anda sekiranya sepadan dengan kunci anda simpan dari llGetNotecardLine terakhir.
dataserver (query_id utama, data rentetan)
Pada kemasukan ke dataserver, pembolehubah diluluskan sebagai parameter pertama adalah kunci yang pergi dengan acara dan pembolehubah kedua adalah data. Dalam kes peristiwa dataserver untuk llGetNotecardLine, data akan menjadi tali yang mengandungi garis notecard yang atau petunjuk bahawa terdapat tiada lebih talian.
jika (query_id == gQuery)
Berterusan dengan contoh kita, ini jika kenyataan akan menjadi benar jika acara ini dataserver pergi dengan llGetNotecardLine terakhir
jika (data == EOF)
Kita perlu mempunyai cara untuk tahu bahawa tidak ada data yang lebih notecard. Jika pembolehubah rentetan mengandungi penunjuk EOF (Akhir File), tiada lagi data. Maka dalam contoh ini, kenyataan jika benar jika terdapat tiada lagi data. Jadi kod yang juga dengan kenyataan ini adalah benar keperluan untuk melakukan apa sahaja yang anda mahu berlaku selepas anda membaca semua notecard itu. Kadang-kadang, ini boleh menjadi rumit sedikit untuk berfikir tentang anda berada di dalam acara dataserver dan apakah anda Kau melakukan? Jika anda hanya mempunyai sesuatu yang mudah untuk dilakukan, mungkin anda hanya boleh memanggil subrutin atau bahkan hanya termasuk sebaris kod berikutan kenyataan jika. Saya nyatakan sebelum ini bahawa contoh itu akan menggambarkan satu cara untuk secara logik mencabut pemprosesan notecard daripada semua aktiviti berikutnya. Saya sering melakukan ini dengan menukar negeri ke negeri yang baru.
menyatakan bermula;
Dalam contoh ini, saya menghidupkan keadaan saya imaginasi memanggil mula. Mulakan dalam "sekarang saya akan mula menggunakan data saya". Tapi kami mendapat sedikit ke hadapan dan kami tidak dipecah data lagi. Jadi, jika cek EOF tidak benar, kami melakukan sebahagian yang lain jika dan di bahagian lain, kita menghurai data.
Jika anda mempunyai beberapa penghuraian rumit untuk dilakukan, ia mungkin bersih untuk meletakkan ia ke dalam satu subrutin. Dalam banyak kes, yang akan membuat skrip lebih mudah untuk membaca dan memahami. Dalam kes ini, kita hanya akan melakukan sedikit sebanyak menghuraikan supaya kami tidak memanggil subrutin untuk melakukannya.
Menghuraikan satu set arahan adalah agak rumit. Dalam dunia sebenar, terdapat dua program yang sangat lama yang berasal pada Unix yang boleh digunakan untuk mewujudkan parsers untuk input arahan rumit. Lex dan Yacc . Nama Lex datang dari "penganalisis leksikal" dan Yacc bermaksud "Yet Another Pengkompil Pengkompil". Lex dan Yacc adalah alat yang baik dan mereka atau derivatif mereka masih digunakan hari ini. Tetapi selain daripada kenyataan yang Lex dan Yacc menjana kod C dan tidak LSL, mereka mungkin akan menjadi cara untuk berat untuk majoriti menghuraikan keperluan yang diperlukan untuk LSL. Jadi, kita akan mendekati menghuraikan dengan cara yang sedikit mudah.
Grammer kita akan menjadi agak mudah.
kata kunci = keyvalue;
Ini akan membolehkan banyak fleksibiliti tetapi memerlukan penghuraian yang sangat mudah.
Sebelum mendapat serius dengan menghuraikan, kami mahu lakukan beberapa perkara. Periksa untuk melihat jika garis dari notecard sebenarnya mengandungi apa-apa data dan semak untuk melihat jika ia adalah komen. Dalam contoh ini kita menggunakan "#" dalam kedudukan yang pertama untuk menunjukkan baris komen. Saya sentiasa termasuk keupayaan untuk mempunyai komen di notecard kerana ia adalah cara yang baik untuk diri-dokumen sintaks pilihan-pilihan yang anda mahu menyokong.
Periksa baris kosong.
jika (llStringTrim (data, STRING_TRIM)! = "")
Jika kenyataan ini benar, talian tidak kosong dan kita terus memproses. Kita telah digunakan llStringTrim untuk membuang mana-mana ruang kosong yang hadapan dan belakang dari garisan dalam kes ia hanya mempunyai ruang kosong, sebaliknya bandingkan dengan rentetan batal tidak akan berfungsi. Sejak kita menggunakan fungsi llStringTrim yang di dalam bersyarat tanpa melakukan sesuatu tugasan, tali akan dibiarkan tidak berubah untuk pemprosesan selanjutnya.
Semak talian komen.
jika (llGetSubString (data, 0, 0)! = "#")
Jika kenyataan ini benar, maka garisan tidak mengandungi ciri-ciri komen yang dipilih dalam kedudukan yang pertama dan kami terus. Yang llGetSubString mengambil masa tiga parameter. Tali untuk bekerja, kedudukan bermula di mana untuk memulakan mengekstrak aksara dan kedudukan berakhir. Kedudukan relatif kepada sifar dan "0, 0" ertinya mengambil watak 1 daripada rentetan.
Untuk membantu dalam mengambil selain garis notecard dengan data di atasnya, kami akan menggunakan llSubStringIndex untuk mencari "=" dan ";". dalam grammer kami llParseString2List adalah satu lagi fungsi yang boleh digunakan dengan mudah menghurai satu barisan data ke dalam satu senarai perkataan atau rentetan. Tetapi dalam contoh ini, kami akan melekat dengan llSubStringIndex.
i = llSubStringIndex (data, "=");
j = llSubStringIndex (data, ";");
Kedua-dua fungsi ini akan mencari dua pemisah dan menetapkan pembolehubah indeks masing-masing, i dan j, lokasi relatif dalam string. Fungsi mengembalikan -1 jika tiada apa-apa yang ditemui di tali.
jika (i == -1 | | j == -1)
Ini kenyataan jika akan mengesahkan bahawa kami mendapati kedua-dua pemisah kami. Jika salah satu pembolehubah ditetapkan untuk -1, maka kita menulis mesej ralat dan meneruskan untuk mendapatkan kad data seterusnya. Jika kami mendapati kedua-dua pemisah kami, maka kami terus menghuraikan baris ini.
kata kunci = llGetSubString (data, 0, i - 1);
Ini akan menetapkan pembolehubah kata kunci kepada rentetan mendapati melihat dari awal baris pertama "=", tidak termasuk "=". Ingat i lokasi dalam rentetan "=". Di sini kami hanya melakukan parsing mudah dan tidak langsung memeriksa setiap kesilapan seseorang mungkin mungkin membuat. Sebagai contoh, cek ini tidak langsung memeriksa untuk melihat bahawa "=" datang sebelum ";". Kami hanya melihat untuk melihat jika mereka kedua-duanya dalam string dan mendapatkan substrings berdasarkan lokasi mereka. Ini mungkin bermakna bahawa kita akan mendapat sampah untuk pembolehubah kami. Tetapi jika ya, cek berikut akan gagal pula.
Anda mungkin mahu melakukan beberapa perkara untuk membuat grammer sedikit kurang ketat. Sebagai contoh, kita andaikan tiada ruang pada awal baris dan sebelum "=". Bagi membolehkan kemungkinan bahawa terdapat beberapa ruang dan perkara-perkara permit untuk bekerja pula, anda boleh memasukkan fungsi untuk menggugurkan ruang tambahan sebelum dan selepas perkataan utama. Juga, jika kes itu tidak penting, anda boleh menterjemahkan perkara-perkara kepada huruf kecil dan kemudian semua kod andaian dalam kes yang lebih rendah.
kata kunci = llStringTrim (llToLower (kata kunci), STRING_TRIM);
Ini akan menggugurkan hadapan dan belakang ruang dari kata kunci dan menterjemah rentetan kepada huruf kecil.
keyvalue = llGetSubString (data, i + 1, j - 1);
Seterusnya kita menetapkan keyvalue ubah, subrentetan yang bermula pada kedudukan pertama selepas "=" dan berakhir pada kedudukan sebelum ";".
keyvalue = llStringTrim (keyvalue, STRING_TRIM);
Dalam kes ini, kita hanya membuang memimpin dan belakang ruang. Anda juga boleh diterjemahkan kepada kes yang lebih rendah tetapi mungkin ada kalanya menyimpan nilai-nilai yang anda hendak simpan kes itu sebagaimana yang dinyatakan. Sebagai contoh, jika anda membekalkan teks mesej untuk menulis, anda mungkin mahu untuk membekalkan nilai kes campuran.
Jadi pada masa ini, kami telah mengumpul satu kata kunci dalam pembolehubah kata kunci dan nilai dalam pembolehubah keyvalue. Jadi, kita sudah bersedia untuk mula memeriksa dan menetapkan pilihan.
Kami mempunyai permulaan jika kenyataan diikuti oleh lain sebagai banyak jika kenyataan kerana kami perlu untuk membandingkan semua kata kunci yang dikehendaki. Bagi mana-mana perkataan utama yang dipadankan, fungsi yang diperlukan dilakukan dengan nilai yang sama.
gSeconds = (apungan) keyvalue;
Kami tidak akan melalui setiap membandingkan tetapi saya akan menunjukkan satu perkara. Contoh di atas adalah di mana kita mengambil sesuatu yang dibaca sebagai rentetan dan menukarkannya kepada nilai titik terapung.
Terdapat satu perkara yang penting untuk perhatian mengenai rentetan menukar jenis lain. Jika anda melakukan cast jenis jelas seperti (mengapung) dan tali tidak benar-benar rentetan angka, LSL hanya diam-diam memberikan anda sifar. Dan, ada fungsi untuk memeriksa jenis data tali tersebut terdiri daripada. Jadi, jika anda mahu untuk mengesahkan bahawa seseorang telah memasuki rentetan digit dan tidak rentetan aksara alfa, anda mungkin ditinggalkan dengan membina sebuah fungsi yang kelam kabut untuk memeriksa bahawa kandungan tali semua digit atau angka dan tempoh. Sejak saya kebanyakannya mencipta barangan untuk diri sendiri atau rakan-rakan, saya hanya membiarkan yang satu ini pergi dan menganggap ia tidak berbaloi. Jika anda mencipta sesuatu untuk menjual, anda akan perlu menimbangkan berapa banyak anda fikir anda perlu untuk melindungi pelanggan anda daripada membuat kesilapan.
Jika kita jatuh melalui jika kenyataan dan semua lain yang jika kenyataan kepada kenyataan yang lain, maka kita temui kata kunci / pasangan nilai utama yang kita tidak tahu bagaimana untuk memproses.
llOwnerSay ("notecard Konfigurasi mengandungi kata kunci tidak diketahui di garisan + (rentetan) gLine +" \ n ditemui Kata-kata. "+ kata kunci +" \ nCorrect kesilapan dan menetapkan semula. ");
Untuk membantu seseorang menentukan kesilapan mereka, ia adalah idea yang baik untuk memberi seberapa banyak maklumat yang mungkin. Contoh ini akan mencetak kata kunci dan nilai bersama-sama dengan garis relatif dalam notecard. Ingat bahawa garis notecard berbanding dengan sifar. Jika ini akan mengelirukan seseorang, anda boleh menambah satu untuk pembolehubah selaras notecard untuk membantu seseorang keluar.
Selepas sepenuhnya memproses selaras notecard ini, kita perlu yang baru.
+ + GLine;
gQuery = llGetNotecardLine (NOTECARD, gLine);
Fungsi llGetNotecard membaca nombor talian anda beritahu kepada semua. Jadi kita perlu kepada peningkatan bilangan selaras dengan + + gLine dan kemudian memanggil fungsi llGetNotecardLine. Dalam contoh kami, kami pada akhir acara dataserver dan mempunyai apa-apa lagi untuk berbuat. Jadi, skrip akan menunggu untuk acara seterusnya berlaku yang berkemungkinan akan menjadi satu lagi garis notecard. Seperti yang disebutkan tadi, proses ini akan berulang sehingga penunjuk EOF dikembalikan dan kita beralih ke negeri bermula.
Seperti yang disebutkan tadi, saya menggunakan ini suis negeri pada siap pemprosesan notecard, sebagai satu cara untuk bersih membahagikan logik antara berurusan dengan notecard dan segala-galanya yang berlaku yang bergantung pada notecard. Ia tidak diperlukan untuk menggunakan negeri-negeri yang berbeza.
Tiga kata kunci diproses dalam contoh ini. Mereka adalah saat, debug dan teks. Perkataan utama saat ini hanya digunakan untuk menunjukkan penukaran data bernombor. Perkataan utama debug tidak melakukan lebih sama ada kecuali mencetak beberapa mesej tambahan jika set kepada ya. Kekunci perkataan teks digunakan untuk menetapkan teks terapung bagi objek itu.
Contoh script juga mengandungi dua peristiwa yang saya amnya termasuk dalam mana-mana skrip yang memproses notecards. Yang pertama adalah acara yang on_rez yang digunakan untuk mengesan objek yang rezzed daripada inventori dan untuk menetapkan semula skrip apabila itu berlaku. Acara lain adalah perubahan peristiwa yang digunakan untuk mengesan perubahan inventori. Acara yang berubah ini dikodkan untuk menyebabkan reset skrip dan pemprosesan semula notecard itu. Ini adalah untuk menyokong rereading notecard jika anda telah membuat perubahan kepadanya.
Dan kerana terdapat dua negeri di contoh ini, kedua-dua on_rez dan peristiwa perubahan dikodkan di setiap negeri. Ini adalah satu kekurangan yang mempunyai negeri berganda. Pengendali acara hanya berkesan di negeri mereka dikodkan. Jadi mana-mana acara yang anda mahu untuk mengendalikan mana-mana di negeri dikodkan di semua negeri.
Sekarang kod Contohnya. Seperti biasa, ini contoh kod akan bekerja untuk kedua-dua Hayat Kedua dan OpenSim . Notecard contoh berikut kod.
// Config Demo - Notecard // // Sample code to demonstrate using a notecard to set configuration // parameters. // // Micheil Merlin - 05/18/2010 string NOTECARD = "Config"; // Configuration notecard. key gQuery; // Notecard read key. integer gLine = 0; // Notecard line to read. integer gError = FALSE; // Error status. float gSeconds = 0.0; // Seconds value from notecard. integer gDebug = FALSE; // Debug flag from notecard. string gText = ""; // Hover text from notecard. default { state_entry() { llOwnerSay("Initializing..."); // Check to see if a notecard with teh specified name is in the // object inventory. if (llGetInventoryType(NOTECARD) == INVENTORY_NOTECARD) { // If the notecard exists, get the first line. Save the key // so we can use it in the dataserver event to identify that // the event is for this notecard read. gQuery = llGetNotecardLine(NOTECARD, gLine); } else { // If no notecard exists, just switch to the begin state. // There are no configuration parameters to change. state begin; } } // When object is rezzed, reset the script. on_rez(integer num) { llResetScript(); // Reset the script. } // Use the changed event to see if the inventory has changed. We can use // this to detect that the notecard has been changed and reset the script // so the notecard can be reprocessed. There is no way to determine what // in the inventory has changed without doing some sort of processing on the // inventory. So, the script will be reset regardless of what changed in the // inventory. changed(integer change) { // If inventory has changed, assume script reset is needed. Many other // things can trigger the change event but in this case, we are only // looking for changed inventory. if (change == CHANGED_INVENTORY) { llResetScript(); // Reset the script. } } // Dataserver event to process notecard data. dataserver(key query_id, string data) { integer i; // Temp index. integer j; // Temp index. string keyword; // Configuration keyword. string keyvalue; // Configuration value. // The dataserver event is used for many things. To make sure we process // the correct data, check that the key is from the last notecard read // request. In this sample code, the dataserver event should not be // triggered for any other purpose than to present the notecard data. // But it is still a good coding practice to check to make sure // the event is what you think it is. if (query_id == gQuery) { // If 'End of File' is returned, then there is no more data. Switch // to the begin state. if (data == EOF) { state begin; } // Process the notecard data. else { // Compress out blanks and make sure the notecard line is not empty. if ( llStringTrim(data, STRING_TRIM) != "" ) { // A notecard line with a '#' in the first position is taken to be a // comment and will not be further processed. if (llGetSubString(data, 0, 0) != "#") { // If line is not a comment, get keyword and value. // The format of the data we are looking for is... // keyward=keyvalue; i = llSubStringIndex(data, "="); // Look for keyword/keyvalue separator. j = llSubStringIndex(data, ";"); // Look for end of line marker. if (i == -1 || j == -1) { // Check for 'keyword=value;' syntax. llOwnerSay("Configuration notecard contains invalid syntax at list " + (string)gLine + ". Data line follows.\n" + data + "\nCorrect the error and reset."); gError = TRUE; // Set error condition. } else { // Extract the keyword and keyvalue strings. keyword = llGetSubString(data, 0, i - 1); // Translate keyword to lower case to reduce problems from typos and // also remove leading and trailing blanks. keyword = llStringTrim(llToLower(keyword), STRING_TRIM); keyvalue = llGetSubString(data, i + 1, j - 1); // Only remove leading and trailing blanks from keyvalue. Assume // the existing case is what is intended. There may be specific // uses of keyvalue where it still may be desireable to force // everything to one case. keyvalue = llStringTrim(keyvalue, STRING_TRIM); // Process keywords in config notecard. if (keyword == "seconds") // seconds keyword. { // We don't really have anything to do with the seconds value. // We are just demonstrating translating a string from // notecard to a float. gSeconds = (float)keyvalue; // Translate value to float and save. } else if (keyword == "debug") // debug keyword. { // Here is a case where we want to force a compare to lower case // as we are using keyvalue as on on/off switch. // Also, we assume that any other reply than yes means no. If you // really want to make sure someone doesn't just typo the yes and // it is taken as no, you'd want to check for yes or no and then // indicate an error if something else was encountered. if (llToLower(keyvalue) == "yes") { gDebug = TRUE; // Set debug flag. } } else if (keyword == "text") // text keyword. { gText = keyvalue; // Set text value. } else { llOwnerSay( "Configuration notecard contains unknown keyword at line " + (string)gLine + ".\n Keyword found is " + keyword + "\nCorrect the error and reset."); gError = TRUE; // Set error condition. } } } } // Request the next notecard line. ++gLine; gQuery = llGetNotecardLine(NOTECARD, gLine); } } } } state begin { // Initialization completed. state_entry() { // Make some use of the debug flag. Normally, you'd sprinkle this through your // script printing values where ever you wanted to check that things were as // expected. if (gDebug) { llOwnerSay("Debug mode is on."); llOwnerSay("Seconds=" + (string)gSeconds + "."); llOwnerSay("Value of text is " + gText + "."); } // Check to see if the error condidition was set during configuration. We // may not want to do anything else if a configuration error occurred. if (gError == FALSE) { llOwnerSay("Ready to run."); llSetText(gText, <1.0, 1.0, 1.0>, 1.0); // Set text as requested. } else { llOwnerSay("Not ready to run."); } } // Since events are specfiic to a state, we need to duplicate the on_rez event in this // state also. on_rez(integer num) { llResetScript(); // Reset script. } // Since events are specific to a state, we need to duplicate the changed event in this // state also. changed(integer change) { // If inventory has changed, assume script reset is needed. if (change == CHANGED_INVENTORY) { llResetScript(); // Reset script. } } // Use the touch event to report what is in the settings. touch_start(integer num) { string debugstr; // Text string for debug flag. if (gDebug) // Translate debug flag to yes or no. { debugstr="yes"; } else { debugstr="no"; } llOwnerSay("Debug=" + debugstr + "."); llOwnerSay("Seconds=" + (string)gSeconds + "."); llOwnerSay("Text=" + gText + "."); } }
Berikut adalah teks untuk notecard untuk pergi bersama-sama dengan contoh ini pengekodan. Menampal teks ini ke notecard bernama Config untuk bekerja dengan contoh ini.
# Config notecard for Config Demo script. # debug may be set to yes or no. debug=yes; # This text will be used to set the floating text of the object. text=Config Demo; # Supply a numeric value for seconds. seconds=5; 













pos yang menggerunkan! dan i sebenarnya memahami apa yang anda mengajar! terima kasih! =)
skrip sejagat atau pemilihan beberapa "pergi kepada" universal skrip adalah cara yang cepat untuk melakukan pembangunan profesional dalam dunia
dan ia adalah luar biasa yang anda diuji dan bekerja ini supaya fungsi dalam kedua-dua Hayat Kedua dan OpenSim - yang adalah tanda penulis skrip pakar yang benar! baik dilakukan!
Adakah anda masih ingat membawa saya melalui langkah pembaca notecard oleh langkah kira-kira dua tahun yang lalu? Yang masih berada di tempat dengan saya sebagai penjelasan yang terbaik peranti teknikal yang pernah saya terpaksa.
Tugas dengan baik. :-)
Terima kasih Ener.
Dan ya, Nikki, Saya masih ingat. :) Saya cenderung untuk melakukannya dengan cara itu kerana saya telah membaca terlalu banyak teknikal "bagaimana untuk" yang mempunyai jurang besar-besaran besar maklumat yang saya terpaksa menemui saya sendiri. Anda sebenarnya belajar dengan baik apabila itu berlaku, tetapi ia mengambil masa yang begitu banyak.
Saya dapati notecard membaca menjadi horrifyingly perlahan, yang adalah mengapa saya biasanya meletakkan configs saya dalam skrip super kecil yang lulus config untuk tulisan utama melalui mesej pautan. Beban config serta-merta secara mengerikan bagus, walaupun penyuntingan sedikit lebih rumit.
Mengulas cemerlang dalam kod anda! Jenis ini bagi mengulas membuat realistik boleh untuk memecahkan buka kod setahun ke bawah jalan dan masih tahu apa yang dilakukannya!
Baik dilakukan.
Daud
Terima kasih. Yang mengulas ada adil terperinci untuk membantu dalam pembelajaran. Saya tidak cukup bahawa verbose dengan skrip biasa. Tetapi saya mungkin komen lebih daripada kebanyakan bagi tepat sebab negeri anda. Bila saya mula hidup lama dahulu ... lol ... saya mendapati bahawa ia adalah sukar untuk ingat mengapa saya lakukan beberapa perkara tertentu itu setahun kemudian apabila saya mengambilnya lagi dan komen membantu dengan itu. Juga, saya ingin seseorang untuk memahami jika mereka terpaksa datang di belakang saya dan membuat perubahan.
Jadi, Winter Seale, adakah anda menggunakan skrip notecard itu bahawa ia tidak biasanya mendapat diset semula dan telah semua konfigurasi penuh? Sedia menyerahkan ketika ditanya tanpa membaca notecard sekali lagi? Saya boleh lihat bagaimana ia akan menjadi lebih cepat.
Ping balik: Scary Costume Idea-Halloween Treats - Beli Pembelian Halloween Online
Ping balik: Scripting Tips: objek kemas kini jauh di i tinggal di tanah sains