2007年12月20日 星期四

啥SL—【訊息傳遞—前言與Chat】

前言

  要在Second Life內開發,訊息的傳遞是很重要的。Second Life內的溝通在這個wiki頁面有介紹,但個人認為,最重要的只有四點,分別為:

  其中個人將以上四點又分為內部與外部。Chat、Link Message為內部;HTTPRequest、XML-RPC為外部,由於本人不是很了解XML-RPC,所以這裡暫不介紹,我本人是很希望有人能教教我,不過這也只是希望啦……

Chat

  Chat的方式大致就如同以上圖片所表示的,右邊的方塊用llWhisperllSayllShout這三種方式和其他物件溝通(這三者的差別在於距離的不同,分別為10m、20m、100m),而左邊的方塊可以用一個叫llListen的方法去聽取資訊,只要在state_entry內放置這個方法,就可以啟動listen這個event,而這樣的溝通方式不只出現在物件與物件間的溝通,玩家與物件間的溝通也是用Chat的方式。

  首先,先制定好頻道號碼(channel),頻道號碼為0是是和玩家溝通的頻道,而0頻道出現的訊息,就是左下角對話視窗的訊息,以我玩過的線上遊戲來說,就是範圍頻道……而Chat的溝通方式,就是在一定範圍內去聽取某些頻道號碼上的訊息,至於哪些號碼在SL是特定號碼,可以點選上面channel的連結。

  而在listen這個event內可以處理接收到的訊息,分別為(integer ch, string name, key id, string message)這裡的channel、name、id以及msg只是變數名稱,這個可以自訂,前面我標示的是變數型態。

  ch就是channel,意思是取得聽到資訊的來源是從哪個頻道來的,如果
llListen啟動太多種,不清楚是收到的資訊是哪個頻道來的,這裡可以用if條件來做判斷

  name就是取得聽到訊息的來源名稱,可以是物件名也可以是人名。

  id指的是聽取訊息來源的key值,可以是物件的key也可以是人的key值。

  message就是聽取迅息的內容,是字串型式。

  Chat使用範例如下:
  
  A物件的程式碼:

integer CH_TEST=358;
default
{
state_entry()
{
While(TRUE)
{
llShout(CH_TEST,"Fcuk You!!!");//範圍為100m
}
}
}

  意思就是,A物件在100公尺內無限迴圈內一直大喊著"Fuck You!!!"而且是在第358(上我吧!!Zzz)頻道大喊。(用CH_TEST當358是好習慣,因為以後可以某些頻道想改號碼,直接這樣改CH_TEST的變數即可)

  此時B物件要去聽取資訊,他的程式碼如下:

integer CH_TEST=358;

default
{
state_entry()
{
llListen(CH_TEST,"",NULL_KEY,"");//這裡的NULL_KEY也可以寫""來取代
  llListen(0,"shortlin Yue","","I want to play H game!!!")
}

listen(integer ch,string name,key id,string message)
{
if(ch==CH_TEST)
{
llShout(0,"Don't fuck me!!!");
llShout(0,(string)ch);
llShout(0,name);
llShout(0,id);
llShout(0,message);
}

if(ch==0)
{
llShout(0,"Sorry, I can't help you");
}
}
}

  此時B物件如果在A物件100m範圍以內,他就會啟動了listen,因為他llListen中的參數並沒有給太多的限制,只有啟動了會聽取頻道358的訊息。因此他會大喊"Don't fuck me!!!"接著喊"358",如果A物件叫做A那他還會喊"A"而如果A物件的key值是"595c90dc-feff-5a80-9401-0cc111e8d8bb"那他接下來會喊"595c90dc-feff-5a80-9401-0cc111e8d8bb",最後,他會喊A喊過的訊息"Fcuk You!!!"。

   此時,如果有玩家或物品名稱叫做shortlin Yue,他在頻道0以及B物件100m以內大喊著"I want to play H game!!!",這時也會啟動B物件的listen event,此時B物件就會喊"Sorry, I can't help you"。如果有特別限制聽取某物的訊息,可以利用該物的key值。如何取得該物的key?可以利用llSay(0,(string)llGetKey)這樣的方式在你要知道key值的物件上寫下這個程式碼。

  其實Chat這樣的溝通方式代表著,當一物件啟動了listen這個event,這物件就會接收從四面八方而來的訊息……如此一來是會增加很多負擔的。還有一點要注意,不管是llSay或是llShout,他們都會有一個毛病,就是說出來的順序有可能會delay且不依照順序

  意思就是,如果你寫了這樣的程式碼:


default
{
state_entry()
{
integer index;
for(index=0;index<10;index++)
{
llSay(0,(string)(index));
}
}
}

  這樣的程式照道理會依照順序出現0、1、2、3、4、5、6、7、8、9,但是由於llSay會delay,他可能會變成0、2、3、1、4、5、6、7、8、9這樣的情形出現。


  大體上來說,如果你要開發的東西是需要一個很大的環境,如RPG或FPS遊戲,Chat的方式還是比較常見,因為Link Message有距離的限制,而這點會在下篇談到。

沒有留言: