2007年12月20日 星期四

啥SL—【訊息傳遞—Link Message】

物件被Link起來的模樣

  Link Message可以把訊息傳給本身自己其他的Script與其他Link物件的Script。而圖中黃色為parent藍色皆為child。Link Message的優點是傳的速度快,且不會被竊聽,但缺點就是要把兩物件Link起來,距離不能太遠,我算過大約只能4.346m的距離。不過這不代表所有被link的物件一定要這樣的距離,像以下圖中這樣,只要最近的兩塊物件沒有超過這個距離,就可以Link,雖然還是有限制,但在Second Life裡看到很多房子的製作其實都是被Link起來的。

如果要超過4.346m的距離得要有中間物件

  那Link Message到底是如何使用的?只要使用llMessageLinked,就會啟動指定物件的link_message這個event。

  
llMessageLinked的格式如下:
llMessageLinked(integer linknum, integer num, string str, key id)

  
linknum指的是要傳給訊息的物件的種類代號。代號有以下五種:
Constant Value Description
LINK_ROOT 1 root prim in linked set (but not in a single prim, which is 0)
LINK_SET -1 all prims in object
LINK_ALL_OTHERS -2 all other prims in object besides prim function is in
LINK_ALL_CHILDREN -3 all child prims in object
LINK_THIS -4 prim script is in

  在這邊翻譯一下,LINK_ROOT指的是要傳給parent。LINK_SET是要傳給所有被的物件。LINK_ALL_OTHERS是要傳給除了自己以外的物件。LINK_ALL_CHILDREN是要傳給所有的child。LINK_THIS則是傳給自己本身其他的Script。

  num是要傳給物件屬於數字的訊息。

  str是要傳給物件屬於字串的訊息。

  id是要傳給物件屬於key的訊息。

  llMessageLinked使用範例如下:
  llMessageLinked(LINK_THIS,1,"ohohohoh!!",NULL_KEY);

  這樣的用法就是我要傳給自己物件其他的script數字為1字串為
ohohohoh!!key值為NULL_KEY的訊息

  而啟動的
link_message這個event要寫入的參數格式是(integer linknum, integer num, string str, key id),使用範例如下:

link_message(
integer linknum, integer num, string str, key id)
{
  if(str=="It is from A Object")
  {
    llSay(0,"A");
  }

  if(str=="
ohohohoh!!" && num==1)
  {
    llSay(0,"You're dead!!!");
  }
}

  意思就是收到字串為
It is from A Object就會說A,收到ohohohoh!!(喔喔喔喔!!)就會說You're dead!!!(你已經死了!!!)。

  
Link Message的整個使用範例如下:

  當A物件和B物件被Link起來的時候,A是parent,B是child,而A除了有A1程式碼外還有A2。A物件的A1程式碼如下:

integer LM_SEND_TO_CHILD=88;//和之前的Chat一樣,給定常數方便管理
integer LM_SEND_TO_OTHER_SCRIPT=2;
default
{
  state_entry()
  {
    llMessageLinked(LINK_ALL_CHILDREN,LM_SEND_TO_CHILD,"I am your father!!!",NULL_KEY);

    llMessageLinked(LINK_THIS,LM_SEND_TO_OTHER_SCRIPT,"I am your brother!!",NULL_KEY);
  }
}

  而A物件的A2程式碼如下:

integer LM_SEND_TO_OTHER_SCRIPT=2;
default
{
  link_message(integer linknum, integer num, string str, key id)
  {
    if(num== LM_SEND_TO_OTHER_SCRIPT)
    {
      llSay(0,"Btother!!!!!");
    }
  }
}

  因為A1有啟動了傳給其他Script的llMessageLinked,所以A2的 link_message event就一定會被啟動,而他if去判斷接收的num是不是我們要的,簡單來講,就是所謂的過濾。然後A物件就會很感傷地說"Btother!!!!!"

  而B物件的程式碼如下:
integer LM_SEND_TO_CHILD=88;
default
{
  link_message(integer linknum, integer num, string str, key id)
  {
    if(num== LM_SEND_TO_CHILD)
    {
      llSay(0,"No!!!!");
    }
  }
}

  因為A物件的A1是傳訊息給其他的child的,所以身為child的B物件就一定啟動link_message這個event然後再經由判斷正確後,B物件會像是路克天行者般地大喊:不!!!!因為A物件說了句"I am your father!!!"

  OK,以上就是利用Link Message傳遞資訊的方式,下一篇將會提到我們如何利用HTTPRequest來和外部溝通。

沒有留言: