second life linden dollars Thai Second Life Community second life linden dollars second life linden dollars second life virtual money
second life linden dollars
SL Virtual World
OpenSims Thailand
second life top search
Custom Search
linden dollars transfer
linden dollars transfer
linden dollars transfer
SL Virtual World
Pages: [1]   เลื่อนลง
 
แบ่งปันให้เพื่อนๆ Topic: ภาษา linden วันละำคำตอน: Basic scripting concepts  (Read 7521 times)
kidnaplism
มือใหม่หัดวาป
*
Posts: 125



WWW
« on: May 22, 2008, 07:19:48 PM »


  ไม่ได้โพสต์ซะนานเลย กลายเป็นเดือนละคำแล้ว Embarrassed พอดีเดือนหน้าจะไปอยู่ญี่ปุ่นแล้ว ช่วงนี้จะวุ่นๆ้เรื่องเตรียมภาษาอยู่  ยังงัยโพสต์ถามในนี้ก้อได้นะครับ จะพยายามเข้ามาตอบให้
   ตอนก่อนๆที่ลงไป  อาจจะมีคนใช้เป็นอยู่ไม่กี่คน หรืออาจจะเอาไปใช้เลยแต่ยัง apply ไม่เป็น  วันนี้เราจะมาสอนกันตั้งแต่เริ่มแรกกันเพื่อให้คนที่จะสนใจเริ่มการทำ scripting สามารถเข้าใจ concept แล้วนำไปประยุกต์ใช้ได้กัน
script ที่เราจะดูกันวันนี้คือ ใช่แล้วครับ "Hello, Avatar!" script นี่เอง
ลองกดปุ่ม  new script จาก content ของ prim ดูนะครับ จะได้อย่างนี้เมื่อเปิด script ดู


default
{
   state_entry()
   {

      llSay(0, "Hello, Avatar!");
   }
   touch_start
(integer total_number)
   {
      llSay(0, "Touched: "+(string)total_number);
   }
}


ผลของ script นี้คือ มันจะพูดออกมาทาง chat channel 0 ว่า Hello, avatar!"
แล้วเมื่อทำการ touch หรือแตะ มันจะพูดคำว่า "Touched: " ขึ้นมา

ที่นี้เราจะมาแกะดูว่า  แต่ละส่วนมันหมายความว่าอย่างไรกันโดยเริ่มจากโครงสร้างของ script ก่อน 
script จะประกอบด้วย 

state
{
       event handler
       {
              statement;
       }
}

นี่คือโครงสร้างหลักของ script โดย
State คือ กลุ่มของ even handler ที่อยู่ภายใน(ให้มองเหมือน directory เวลาเปิด my computer นะครับ จะมี sub folder ไปเรื่อยๆ) state จะแสดงรูปแบบต่างๆของพฤติกรรมที่จะกระทำ
Event handler เป็นตัวบอกว่า script จะทำงานอย่างไรกับ sl  โดยภายใต้ event handler จะมีกลุ่มของ statement อีกที ซึ่งต้องใช้ชื่อตามที่ทาง linden lab กำหนดมาถึงจะใช้งานมันได้ โดยจะมีมากกว่า 30 อันเลยทีเดียว โดยบาง event handler จะมีตัวหนังสือหรือตัวเลขต่อจากชื่อภายในวงเล็บ เราเรียกกันว่า parameter ซึ่งจะใช้เจาะจงรายละเอียดของ event ขึ้นไปอีก
Statement จะเป็นกลุ่มของคำสั่งที่เราเขียนขึ้นเพื่อทำอะไรซักอย่าง อาจจะเป็น function หรือ flow-control statements(เป็นพวกตรรกศาสตร์ที่เราเรียนกันสมัย ม.ปลายต่างๆ ถ้า...แล้ว เป็นต้น)
ดูจาก script ด้านบนถ้าคอมเมนต์ไว้จะได้ว่า

default  // script เริ่มทำงานที่ state default
{
   state_entry()
       // event hanlder ชื่อ state_entry ใช้สั่งให้ทำงานทันทีเมื่อการทำงานเข้าสุ่ state นี้
   {
      llSay(0, "Hello, Avatar!");   //สิ่งที่ต้องการให้ script ทำงานคือ การใช้ function llSay ด้วยการพูดคำว่า "Hello,Avatar!" โดยการพูดผ่าน public channel (Channel 0) คือทุกคนได้ยินหมด
   }
   touch_start
(integer total_number)  //เมื่อมีการแตะวัตถุนี้
   {
      llSay(0, "Touched: "+(string)total_number);  //ให้พูดว่า "Touched" ทาง channel 0 เช่นเดียวกันกับด้านบน
   }
}


พฤติกรรมที่ script ทำคือ เข้าไปทำงานใน event state_entry() ทันทีโดยอัตโนมัติ โดยจะทำงานตามกลุ่ม Function ภายในที่เราเขียนขึ้นเมื่อทำเสร็จก็จะรอคำสั่งต่อไป  สังเกตได้ว่า event touch_start ยังไม่ทำงานเนื่องจาก ยังไม่มีการ touch สั่งมา  ดังนั้นพฤติกรรมของ script คือการรอรับคำสั่ง ทำงาน แล้วกลับมารอรับคำสั่ง
    ถึงตรงนี้หลายคนคงปิดหน้านี้ไปแล้ว  Shocked ถ้ายังอ่านกันต่อจะพยายามอธิบายให้เห็นภาพขึ้นนะครับ
    ถ้ามองง่ายๆ script เหมือนบทหนังที่คุณเป็นผู้ำกำกับ มองอย่างง่ายๆจะได้ดังนี้

ฉากที่ 1
{
       เมื่อผู้ร้ายต่อยพระเอก
       {
             -พระเอกพูดว่า "Ouch"`;
             -ต่อยกลับไป
             -ถ้า ต่อยชนะ
                {
                   -ให้พานางเอกหนี
                }
             -ถ้าแพ้
               {
                  -กราบขอโทษผู้ร้ายซะ
               }
       }
}

นี่คือจบหนึ่งฉาก  อาจจะดูตลกๆหน่อย  :)แต่ถ้ามองอย่างนี้จะง่ายขึ้นครับ
   state คือ ฉากที่...  โดยทั่วไปการจะใช้หลาย state ก็ต่อเมื่อมีการเปลี่ยนสถานะของพฤติกรรม อย่างที่ผมเคยใช้ เมื่อมีการกดปุ่ม HUD ที่มืดอยู่แล้วเปลี่ยน texture เป็นเรืองแสงเหมือนเป็นการเปิด  จะต้องมีการกำหนด state ขึ้นมาใหม่ เช่นตั้งชื่อเป็น state button_ON เป็นต้น
บางคนจะถามว่าแล้วทำไมไม่ใช้แค่ state เดียวไปเลย  คำตอบคือไม่ได้ครับ เนื่องจากว่า เราไม่สามารถใช้  event handler ตัวเดียวกันซ้ำสองครั้งได้ภายใน 1 state เช่น

// www.lsleditor.org  by Alphons van der Heijden (SL: Alphons Jano)
default
{
   state_entry()
   {
      llSay(0, "Hello, Avatar!");
   }
   touch_start(integer total_number)
   {
      llSay(0, "Touched: "+(string)total_number);
   }
   touch_start(integer total_number)
   {
      llSay(0, "Again???: "+(string)total_number);
   }
}

อันนี้ถ้าใช้ lsl editor compile จะฟ้องว่า 1   Type 'default' already defines a member called 'touch_start' with the same parameter types   new.lsl   12   23   
หมายความว่าในการใช้ event นี้ไปแล้วใน state ชื่อ default คือมีการใช้ซ้ำว่างั้นเถอะ
   ทีนี้มาดูที่ event handler บ้าง
   Event handler เหมือนการระบุคิวของตัวเอกที่จะแสดง เช่น เมื่อ ผู้ร้ายต่อยมา  เราจะต่อยกลับ โดยใช้ข้อความบอกสิ่งที่ต้องแสดง หรือ function ที่ผู้ำกำกับ นั่นคือเราเป็นผู้เขียนเป็นกลุ่มคำสั่งให้ทำภายใต้คิวการแสดงหรือ event handler อีกที
    ตัว event handler เองมีมากมาย ซึ่งถูกกำหนดมาแล้วโดยทาง linden lab ตัวอย่างเช่น
    listen(integer channel, string name, key id, string message)  ใช้สำหรับฟังคำพูดของ agent ซึ่ง agent ในที่นี้ไม่ได้หมายถึง avatar เพียงอย่างเดียว แต่รวมถึง object creator/owner รวมถึง group  ด้วย  ดังนั้นจึงสามารถฟังได้หมดไม่ว่าข้อความที่ได้ิยินจะเป็นจากวัตถุพูด หรือ ผุ้เล่นพูดก้อตาม
   on_rez(integer start_param) ใช้สำหรับให้ statement ภายใต้ event ทำงานเมื่อมีการ rez วัตถุที่มี script นี้อยู่ภายใน การ rezz นี้ไม่ได้แค่หมายถึงการสร้างของหรือลากจาก inventory ออกมา แต่รวมถึงการ attach วัตถุเข้ากับ avatar อีกด้วย
    สังเกตได้ว่าหลังจากชื่อ event ภายในวงเล็บคุณจะพบกลุ่มข้อความภายใน นั่นคือ parameter ใช้ทำหน้าที่ให้การใช้ event มีประสิทธิภาพยิ่งขึ้น เช่น จาก listen  ภายในวงเล็บจะมี integer channel เป็นการให้คุณกำหนดว่า จะให้ script ฟังคำพูดทาง channel ไหน เป็นการกรองแบบหนึ่ง ซึ่งถ้าไม่มีหมายความว่า ใครจะสั่งให้มันทำงานก็ได้  ความวุ่นวายจะตามมาเมื่อ ของที่คุณสร้างมาแทนที่จะฟังคุณคนเดียว กลับไปฟังใครสั่งก็ได้  Tongue
ตัวอย่างการใช้ parameter

// www.lsleditor.org  by Alphons van der Heijden (SL: Alphons Jano)
default
{
   state_entry()
   {
      llSay(0, "Hello, Avatar!");
   }
   listen(integer channel, string name, key id, string message)
   {
      if (channel == 20)   // ถ้า channel ที่ฟังมีค่าเท่ากับ 20
      {
         llSetAlpha(0,ALL_SIDES);  // ให้ปรับค่าความโปร่งใสของวัตถุเป็น 0 ทุกด้านของวัตถุ
      }
   }
}   
นี่เป็นการใช้ parameter อย่างคร่าวๆ

   Function อย่างที่เกริ่นไป คุณสามารถกำหนดการกระทำต่างๆผ่าน buit-in function  ซึ่งมีหลากหลายมาก เหมือนการเขียนบทแสดงการกระทำของตัวเอก  โดยในตัว Function จะประกอบด้วยชื่่อและ argument ซึ่งคล้ายกับ parameter ของ event  โดยคุณจะต้องใส่ค่าใน argument ให้ครบ Function จึงจะทำงานได้  ตัวอย่างเช่น

llCollisionSound("damage01",1.0);  ใช้สำหรับสั่งให้เสียงที่เราลากไปไว้ใน content ทำงานเมื่อมีการกระทบกันระหว่างวัตถุที่มี script นี้อยู่  สังเกตได้ว่าจะมี agument อยู่ 2 ตัวคือ "damage01" คือ ชื่อของไฟล์เสียง ส่วนตัวที่สอง 1.0 นั่นคือ ความดังของเสียงที่จะเล่น  ในขณะที่บาง Function อาจจะไม่มี argument เลยก้อได้เช่น

llResetScript();  ไม่ต้องใส่ค่าใดๆลงไปในวงเล็บ ทำหน้าที่คือทำการ reset script  ทันที

อธิบายมาถึงตรงนี้ หลายคนคงเห็นภาพมากขึ้น  ซึ่งเวลาการเขียนจริงนั้นเราจะต้องเริ่มด้วย state default เสมอ เพราะว่า lsl script นั้นจะเริ่มทำงานจากตรงนี้  หลังจากนั้นเราจะแยกส่วนของ state,event handler และ function ด้วย {} หรือปีกกา  คล้ายกับการที่เราใช้ \ เป็นตัวบอกตำแหน่ง file ที่อยู่ภายในเครื่องคอมเรา เช่น E:\my_doc\personal_doc
       ปีกกานั้น คุณต้องใส่ให้ครบคู่ของมัน เมื่อมีการทำงานเข้าสู่ส่วนต่างๆเช่น
       state_entry()
   {
      llSay(0, "Hello, Avatar!");
   }
สังเกตได้ว่าจะต้องมี } ปิดเสมอ มิฉะนั้นจะ compile ไม่ผ่าน เกิด error ขึ้น ใช้สำหรับปิดการทำงานภายในส่วนนั้นๆเช่น จะออกจากการทำงานจากในส่วน statement ทั้งหมดเพื่อเข้าสู่ event ใหม่ หรือจะออกจาก event เพื่อเข้าสู่ state ใหม่เป็นต้น
       อีกตัวที่ลืมไม่ได้คือ ; หรือ semi-colon มีหน้าที่คือจบ functionโดยสมบูรณ์ พร้อมทำงาน ต้องใส่ทุกครั้งหลังจากเขียน function เสร็จทุกตัว
      ส่วนการเว้นบรรทัดหรือการย่อหน้านี่ ไม่จำเป็นเสมอไปครับ เป็นการทำให้ผู้อ่านอ่านได้ง่ายขึ้น ซึ่งจะเขียนอย่างนี้ก้อได้

// www.lsleditor.org  by Alphons van der Heijden (SL: Alphons Jano)
default{state_entry(){llSay(0, "Hello, Avatar!");}listen(integer channel, string name, key id, string message){if (channel == 20){llSetAlpha(0,ALL_SIDES);}}}

       อย่างนี้ก้อใช้ได้เหมือนกัน ไม่มีปัญหา (ถ้าถนัดอ่านแบบนี้จะเขียนอย่างนี้ก้อได้ ไม่ว่ากันครับ :Smiley)
       ถ้าคุณใช้ lsl editor เมื่อเลือก script ทุกบรรทัด กด ctrl + d โปรแกรมจะจัดการทำย่อหน้าใ้ห้คุณเอง จะดูง่ายขึ้นทันตาเห็น
       ทั้งหมดนี้เป็น key concept คร่าวของการทำงานกับ lsl script ซึ่งถ้าคุณทำตามเงื่อนไขที่กล่าวมาได้ รับรองว่าไม่มี error compile ผ่านฉลุยแน่ครับ  Cool

ปล.รายละเอียดในส่วน function,event handler ต่างๆนั้นหาได้จาก www.wiki.secondlife.com แล้วไปดูในส่วน lsl portal หรือหาโหลด lsl editor จาก  www.lsleditor.org จะช่วยให้การเขียนนั้นง่ายขึ้นเยอะครับ แถมมี reference ให้ด้วย     

     
Logged

รอวันที่ SL จะกลายเป็น RL  一緒に頑張ろうぜ~~~~

Robot Academy
http://slurl.com/secondlife/Mino%20Volcan/200/59/500
Aiko
มือใหม่หัดวาป
*
Posts: 95



« เขียนตอบ #1 on: May 22, 2008, 07:32:59 PM »

โอ้โห ขอบคุณสำหรับข้อมูลที่แบ่งปันให้กันนะคะ ありがとう ございます。

เดี๋ยวต้องหาเวลามาศึกษาสคริปบ้างแล้ว

日本語を勉強するのは 頑張ってくだざい!

เรื่องภาษาญี่ปุ่น สู้ๆนะคะ !!!  Wink
Logged
sirea
นักแคมป์ปิ้งตัวยง
**
Posts: 494



« เขียนตอบ #2 on: May 22, 2008, 07:51:45 PM »

ขอบคุณค่ะ  Wink
แฮะๆมึน นิดโหน่ย Tongue

 Shocked จะไปอยู่ญี่ปุ่ง โอ้ว้าว พระเจ้าจ๊อด ขอเกาะล้อเครื่องบินตามไปด้วยได้ป่ะ  :Smiley


ありがとう ございます。

日本語を勉強するのは 頑張ってくだざい!


อ่านว่า ฮอนด้า ยามาฮ่า โออิชิ ซาเซมิ ฟูจิ โนบิตะ ฮิโรชิ อุสเบกิส บินลาเดน  Smiley
Logged

artong007
มือใหม่หัดวาป
*
Posts: 49


« เขียนตอบ #3 on: May 22, 2008, 07:52:00 PM »

ขอบคุณครับ
Logged
praewiie
มือใหม่หัดวาป
*
Posts: 23


« เขียนตอบ #4 on: May 23, 2008, 11:20:37 PM »

แอบงง แหะๆ  Cheesy
Logged
Romeo Arashi
Global Moderator
พลเมืองดีเด่น
*****
Posts: 1623



WWW
« เขียนตอบ #5 on: May 24, 2008, 05:46:55 PM »

ขอบคุณค๊าบ เอามาอีกเยอะๆนะ  Kiss
Logged
techanitkov
นักแคมป์ปิ้งตัวยง
**
Posts: 315



« เขียนตอบ #6 on: May 25, 2008, 07:11:48 PM »

ไปญี่ปุน สำหรับเรา ต้อง ขอ คุณ ตัน แล้ว     

ดีมากครับ ช่วยได้เยอะเลนครับผม
Logged

KOV design studio
architecture interior furniture and all design item
Patrox
มือใหม่หัดวาป
*
Posts: 66



WWW
« เขียนตอบ #7 on: July 09, 2008, 08:20:12 PM »

ขอบคุณมากครับ ที่ เล่าความรู้ ช่วยได้มากเลยครับในการเข้าใจ
Logged

"Stop Aspiring, Start Doing"
- Robert Rodriguez
Pages: [1]   เลื่อนขึ้น แบ่งปันให้เพื่อนๆ
 
 
Jump to:  

Powered by MySQL Powered by SMF 1.1.19 | SMF © 2006-2007, Simple Machines Powered by PHP
second life virtual money
Second Life Virtual Business
Custom Search
Linden Dollar Business
Second Life® and Linden Lab® are trademarks or registered trademarks of Linden Research, Inc. All rights reserved. No infringement is intended.
©ThaiSecondLife.net 2007-2011 All Right Reserve. Webmaster[at]ThaiSecond Life.net