2007年11月24日 星期六

啥SL—【state轉換會造成資訊遺漏測試】

  由於state轉換會把除了timer的event全部移除,所以在下認為,如果你下一個state還想要用上一個state用的listen,你可能會想,再加上一模一樣的listen就可以了。但是,個人認為,由於state轉換會做移除event動作,這樣會造成某些資訊的遺漏,所以我做了一個實驗。

  實驗準備:
  1. 請準備一盒衛生紙
  2. 一打A片
  Zzzzz

  實驗只需要兩個Object即可,我分別稱之為Object1和Object2。

  Object1程式碼如下:
integer count=0;
default
{
state_entry()
{
while(TRUE)
{
count++;
llSay(99,(string)count);

if(count%10==0)
count=0;

}
}

}

  是的,這是無限次在99頻道喊叫的有碼Object……Zzz
  總之,當他喊到10以後,又會重喊。

  Object2程度碼如下:
default
{
state_entry()
{
llListen(99,"","","");
}

listen(integer ch,string name,key id,string message)
{
llSay(0,"state default:"+message);

if((integer)message%10==0)
state test;
}

}

state test
{
state_entry()
{
llListen(99,"","","");
}

listen(integer ch,string name,key id,string message)
{
llSay(0,"state test:"+message);

if((integer)message%10==0)
state default;
}

}

  簡單來講,這個Object2的程式碼去聽99頻道,也就是Object1喊的數字,一喊到10就轉換到test state。而test state一喊到10就回到default state。

  實驗結果如下:
[7:24] Object: state default:1
[7:24] Object: state default:2
[7:24] Object: state default:3
[7:24] Object: state default:4
[7:24] Object: state default:5
[7:24] Object: state default:6
[7:24] Object: state default:7
[7:24] Object: state default:8
[7:24] Object: state default:9
[7:24] Object: state default:10
[7:24] Object: state test:9
[7:24] Object: state test:10
[7:24] Object: state default:9
[7:24] Object: state default:10
[7:24] Object: state test:4
[7:24] Object: state test:5
[7:24] Object: state test:6
[7:24] Object: state test:7
[7:24] Object: state test:8
[7:24] Object: state test:9
[7:24] Object: state test:10
[7:24] Object: state default:1
[7:24] Object: state default:2
[7:24] Object: state default:3
[7:24] Object: state default:4
[7:24] Object: state default:5
[7:24] Object: state default:6
[7:24] Object: state default:7
[7:24] Object: state default:8
[7:24] Object: state default:9
[7:24] Object: state default:10
[7:24] Object: state test:2
[7:24] Object: state test:3
[7:24] Object: state test:4
[7:24] Object: state test:5
[7:24] Object: state test:6
[7:24] Object: state test:7
[7:24] Object: state test:8
[7:24] Object: state test:9
[7:24] Object: state test:10
[7:24] Object: state default:1
[7:24] Object: state default:2
[7:24] Object: state default:3
[7:24] Object: state default:4
[7:24] Object: state default:5
[7:24] Object: state default:6
[7:24] Object: state default:7
[7:24] Object: state default:8
[7:24] Object: state default:9
[7:24] Object: state default:10
  
  雖然llSay會delay,但是,delay歸delay,他還是會say,而且say的時間不會晚得太離普,所以把say很晚的問題先排除。在這個前提下,注意紅色的state test,它確實有遺漏一些資料,因此實驗結果證明了我的假設—state轉換會造成資訊遺漏。

2007年11月12日 星期一

啥SL—【LSL程式基本架構】

  對一物件點選PieMenu的Edit,並在編輯視窗中點開more按鈕,在名為Content的標籤內點選New Script新增程式。對該程式點兩下就會出現以下視窗和LSL最基本的程式碼(有時候會挺緩慢的,請耐心等候)。

  這篇文章因為有考慮到完全沒寫過程式的初學者,所以寫得有點雜亂(其實可能沒有這種人來這裡XD~),建議已經掌握一些要點的朋友可以大約略看看有哪些型態,並注意每一段的注意事項和紅色字體即可。


  如圖,這就是LSL全部的基本架構了。切記,基本State區為default區塊,該區塊前後順序如圖,不能隨意更動位置,也就是說你自訂的State一定要在default後面,全域變數與全域函式一定要在default前面;而全域變數與全域函式的順序就沒有那麼嚴格了。

  看!!LSL沒有繼承、沒有abstract、沒有overloading當然也沒有interface!!!而且他每個Script還有16KB的限制!!(16KB的限制請參考這裡:http://lslwiki.net/lslwiki/wakka.php?wakka=Memory)

  很好,自high完後開始正式介紹一下LSL基本架購,由於自己程式語言學藝不精,要是自己有哪方面用詞說錯,敬請指正。

  在說明前有幾點列表,算是我之後沒有詳細談到的部分,希望對那些完全沒學過程式的初學者有所幫助:
  • 只要輸入"//"這兩個符號後,其後面的字皆為註解,不列入為執行的程式碼,但注意,LSL沒有像java一樣方便的駐解方式,就是/*.....*/,它只有"//"
  • LSL是是case-sensitive的,也就是大小寫區分的意思
  • 每個區塊均以"{"、"}"這兩個符號代表區格
  • 每個全域函式與event在其名稱後面都會有個"("、")"這兩個括符
  • 宣告變數、state轉移、return 型態、jump、使用@標計jump以及使用function或自訂的全域函式都得在最後加上";"這個符號
  • compiler指的就是把LSL編譯成電腦看得懂的語言,也就是當你對你的script按save時下方會出現compile....等字樣。詳細相關資料可看維基百科(http://zh.wikipedia.org/w/index.php?title=Compiler&variant=zh-tw)
  • save的快捷鍵為ctrl+S
  • 存檔會需要一點時間,請耐心等候,要是你在comipler期間關掉檔案,檔案是會回復原來狀態的
  • ctrl+z為回上一步,ctrl+y為回下一步。
  • 編輯器上方多少還是有可用的工具,在Edit中有Search/Replace這個工具方便使用者找尋或替代自己要的英文字母
  • 在LSL編輯器內無法輸入中文(新的Second Life軟體已經可以輸入)
  • LSL的程式碼是有可能會消失在SecondLife的Database的,請記得作好備份

變數型態

  先來介紹一下LSL的變數型態,他不像一般的程式語言所有型態都有,且宣告的名稱也有一點不太一樣(例如一般的程式語言宣告整數是"int a;",它是"integer a;")。LSL的變數型態只有:
  1. string(字串)(eg. string str="test";)
  2. integer(整數)(eg. integer int=2;)
  3. float(浮點數,意即含小數之數字)(eg. float fl=2.5;)
  4. vector(向量,x、y、z三方向為浮點數的向量)(eg. vector location=<1.25,4.22,3.2>;)
  5. rotation(角度,除了x、y、z外,還多了個s的四個浮點數。這四個浮點數字代表意義可參考這裡:http://www.lslwiki.net/lslwiki/wakka.php?wakka=quaternions,至於為何Liden不用直觀的x、y、z調角度我就不清楚了,希望知道的人可以告知一下,謝謝。)(eg. rotation rot=<0.1,02.,0.3,1.0>;)
  6. key(在SecondLife內,每個物件與人都有一個key,這是用來區別一個物件或人的代號,因此是一個有固定長度的特別字串)(eg. key object="595c90dc-feff-5a80-9401-0cc111e8d8bb";)
  7. list(有點像一般程式都會有的陣列,但不必宣告此陣列是屬於何型態。你只要想成是放很多不同型態的變數放在裡面的列表就可以了,不過list內不可以放list,雖然compiler會過,但程式碼正式執行會有run-time error)(eg. list test=["test",2,5.33,<1.0,2.0,4.2>,<0,0,0,1>];)
  至於宣告方法和很多一般程式語言一樣,便是:
  變數型態 變數名稱;
  例如:
  integer test;

  代表test這個變數是integer(整數)
  若要給他一個值,就加個"=",
  例如:
  integer test=2;

  意思便是test這個變數是2的意思。

  給值的部分當然可以之後的全域函式或Event內再給,但是絕對不可以在全域變數區寫:
  integer test;
  test=2;
  以上寫法只可以在全域函式或Event內寫。

  名詞解釋:
  全域變數:只要把變數宣告在default前就是全域變數。
  區域變數:只要把變數宣告在event或全域函式(在LSL的函式只有全域函式)內就是區域變數。變數名稱可以和其他區域的區域變數重複。

  注意事項:
  • 全域變數的宣告名稱不可重複,也不可以和state或函式名稱重複
  • 變數宣告不可宣告在event與state之間,不然不能compiler
  • vector和rotation內的浮點數其實可以輸入整數,只是這樣會比較慢。來源:這裡的第三段文字(LSL does do some implicit typecasting but the LSL compiler does not actualy convert types or simplify code; it just makes implicit typecasts explicit. So while <0,> is valid, it will use more bytecode and be slower then <0.0,>. For this reason please be sure to use a decimal point. 0. is enough you don't need an extra zero.
    ) 
強制轉型

  通常一個function(我習慣稱method)會要求你傳入的是字串或浮點數或整數,如果要傳入的是浮點數你直接傳整數,是行得通的,它會自動幫你轉成浮點數。但如果是要求傳入整數,你傳入浮點數,或字串是不行的,此時要在前面加個(integer)例如:
  float fl=5.2;
  string str="5";
  integer int1=(integer)fl;
  integer int2=(integer)str;
  此時int1和int2都為5。
  同理,像是llSay這個function有需要string,你只要這樣寫llSay(0,(string)5),他就會把5變成"5"了。以上範例只能適用在宣告區域變數,宣告全域變數不可這樣用,不然compiler不會過(很有可能是LSL的bug),不過基本上轉型在合理區塊都是可以用的。

布林值

  LSL沒有boolean這個變態,喔,是變數型態,但是他可以藉由integer來得知這是true還是faluse。例如:
  integer T=TRUE;
  integer F=FALSE;

  TRUE和FALSE都要大寫,代表這是LSL的Constant,也就是說你不可以宣告一個變數名稱叫TRUE。而TRUE代表1,FALSE代表0。


  Operator也就是程式語言的符號,由於資料龐大,請直接進入Operator上面連結觀看(沒錯!俺懶了!!!)。


  LSL的流程控制有以下幾個,這些都可在event或全域函式內撰寫
  1. if-else(如果if()內的條件為TRUE就執行,之後跳到下一個else if()內判斷,如再為FALSE就執行else內的程式碼。注意,這裡的else if與else可以不寫)
    (eg.
    if(TRUE)
    {
      ......
    }
    else if(test==2)
    {
      ......
    }
    else
    {
      ......
    }
    )
    流程圖可看此篇文章的下面圖片(http://squall.cs.ntou.edu.tw/cprog/Materials/IfStatement.html),基本上所有程式語言都是大同小異的。
  2. while(和do-while、for都是迴圈。只要符合while()內的條件,就會不斷重複執行{}內的程式碼,直到條件不符合為止)
    (eg.
    while(TRUE)
    {
      .........
    }
    )
    以上為無限迴圈,永遠跳不出來,除非你使用了jump。
  3. do-while(先執行do內的程式碼再判斷while內的條件,如果成立後便一直執行。)
    (eg.
    do
    {
      ......

    }while(進迴圈條件)
    )
  4. for(()內的格式如下:
    for(初始化;條件;改變)
    初始化和改變可以不寫,只有條件的話跟while是沒啥兩樣的。)
    (eg.
    integer index;
    for(index=0;index<5;index++)
    {
      ......
    }
    在index等於5前都不會跳出,也就是說這程式碼會執行五次,index++意即index=index+1一直遞增下去。)

  5. jump(嗯……就是……跳!在流程內的程式碼跳到指定的名稱那一行,從那一行之後開始執行,而這標計用@自訂名稱表示。jump 自訂名稱,@自訂名稱。)
    (eg.
    jump 自訂名稱;

    ................程式敘述
    @自訂名稱;)
  6. return(回傳所需型態的結果,有何用處會在之後介紹如何使用全域函式解釋)
    (eg. return
    所需變數型態的結果;)
  7. state(轉移state)
    (eg.state 你想要轉移的state名稱; )
  注意事項:
  • 在全域函式要寫轉移State有一個很大的bug,就是你直接在函式內寫state 你想要轉移的state名稱;,compiler是會error的,這時要脫褲子放屁一下,你要寫:
    if(TRUE)

    state 你想要轉移的state名稱;
  基本上,一個script一定要有一個default state,而一個default state一定要有一個event(沒有的話compiler過不了)。也就是說,當一個程式碼在跑的時候,他就是從default state開始跑起。

  default state如下:
  default
  {
   event名稱()
   {

   }
  }

  而自訂State方式如下:
  state 你想要的名稱
  {
   event名稱()
   {

   }
  }


  event的列表全部都有列在上面Event的連結,在這邊只會提到幾個較常使用的:

  state_entry:這是所有state進入後都會先執行的event。

  touch_start:只要玩家點選PieMenu的Touch,就會啟動目前程式跑到的state裡面的這個event。

  timer:只要啟動了llSetTimerEvent(浮點數)這個function,這個event就會啟動。那個浮點數代表每幾秒啟動一次timer內的程式碼。

  注意:
  • 同樣的Event可以被允許重複寫在同一個state上,雖然這個一點用都沒有,但是LSL是不會當例外處理的,當event被啟動時,他會啟動寫在最後面的event。因為本人曾經發生過不小心把程式碼複製貼上兩次,在debug時覺得自己沒寫錯怎會出錯,原來出錯是出在這種地方。
  • 如果該Event被啟動,但程式碼還停留在迴圈內,那這個程式碼會先處理迴圈,再來處理Event的啟動。如:
    state_entry()
    {
      while(TRUE)
      {
        llSetTimerEvent(1);
      }
    }
    timer()
    {
      llSay(0,"fuck!!!!!!");
    }
    由於這個程式很乖,所以它不會在每秒鐘喊fuck!!!!!!
    主要是因為無限迴圈永遠跑不出去,所以他永遠不會執行Event,代表只要有迴圈在,Event這裡並不能同步執行
  • 當state轉移時,event會被抽離,如果你下一個state有上一個state想要繼續啟動的event,這很有可能會造成資訊遺漏,所以要是能的話,我在這邊建議state轉換儘量少使用(但這個前題是有想要做遊戲這種需要每秒一直有event持續啟動的專題)
  • 雖然state轉換時會把event抽離,但只有timer這個event例外,他會從先前state的timer轉移執行現在state的timer。如果有必要在兩個state都用到timer的話,務必請在轉移state前把timer啟動設為0(代表不啟動timer),請重新在另一個state設定llSetTimerEvent()。以下為發生轉移state照樣執行另一個state的timer的情形:
  default
  {
  state_entry()
  {
  llSetTimerEvent(1);
  }

  timer()
  {
  state A;
  }
  }

  state A
  {
  state_entry()
  {

  }

  timer()
  {
  llSay(0,"state A timer()");
  }
  }
  上面的範例意思是,state A中並沒有llSetTimerEvent,結果他還是會跑state A中的timer程式碼證明了timer()這個event不會因為state轉移而被抽離。

全域函式

  在全域函式中,包含了要回傳和不回傳的型式。而你的自訂函式格式可以如以下四種:
  1. 變數型態 自訂函式名稱(){.......程式碼.......}
  2. 變數型態 自訂函式名稱(變數型態 自訂傳入變數名){.......程式碼.......}
  3. 自訂函式名稱(){.......程式碼.......}
  4. 自訂函式名稱(變數型態 自訂傳入變數名){.......程式碼.......}
  1和2皆為要回傳的型式,也就是說,在程式碼內你必須要使用return回傳一開始宣告的變數型態結果。

  (eg.
  string caculateYourCup(string name)
  {
    if(name=="Tina")
    {
      return "A Cup";
    }
   return "B Cup"; 
  
  }
  這涵式的意思是,當遇到名字為Tine的人就回傳"A cup",其餘為"B Cup"
  )

  注意:
  • 這裡可沒有什麼overloading這種東西。overloading就是同名字的函式,但傳入不同的變數

  簡單來說,連結內可以說是LSL的API,如前面有用到的llSay(0,"fuck!!!!")便是使用了LSL的Function。

  基本上我介紹LSL會把重心擺在這,藉由要做的物件來分享一些LSL的Function使用方法。所以基本的介紹就到此告一段落了……如果有LSL的相關問題,歡迎來詢問(跟SL有關的問題,也可以唷!SL不是SecondLife,是ShortLin!!!嗚……SecondLife把我的SL搶走了……Zzz)。

2007年11月11日 星期日

啥SL—【在SL的華人地點(?)介紹】

  之所以加個?是因為有些地點不確定是不是華人的聚集地,不過看在他都有我們華人的建築物,就一起歸納吧。 

  對台灣人而言,最直接,一聽就明白,就知道那是什麼的,當然就是巴哈姆特了。雖然那地方應該只是巴哈姆特裡SecondLife討論區的站長買的,而不是以巴哈姆特這個社群網站的名義,但是巴哈姆特這頭銜真的是讓人有家的感覺……

位置: Cyberian Sands(35,58,21),巴哈地有換過,圖為搬家前的畫面

  如果想加入該Group,應該可以到他們的討論區(http://forum.gamer.com.tw/A.php?bsn=07702)請站長幫忙加入(應該吧= =a)。

  要注意的是,沒辦法立即Teleport(傳送)到該地,都會到達一個中心,那個地方就是一個名叫釣魚島的島中心,因為巴友團的地是向該島島主買的,所以才會直達到那個中心位置,因此要看巴友團的地必須要再往地圖西南一點。

  這地方值得一提的就是該地方其實是一家SL的銀行,旁邊也有幾個座位可以賺點小錢,大多都是坐十分鐘1L$,等你賺到20L$就讓你站起來,只有一張椅子是11分鐘賺2L$,賺到30L$就讓你站起來(註一)。(注意,該地可能因為之前改建,所以坐椅子賺錢的設施已被取消)
  
釣魚島中心:Diaoyu Islands(131146,24)
釣魚島官網(http://supaclub.com/)

  接下來非常值得一去的就是China Boat了。這裡的島主非常好心地提供了一堆免費的物件(超多,老實說我覺得要是在好幾個月前就知道了,搞不好我們的校地會更不一樣),那地方也佈置得相當漂亮。
  (相關文章:http://d2life.net/content.asp?id=67http://d2life.net/content.asp?id=40)

中國船位置:China(150,143,35)

  如果你覺得中國很有中國風味,那有兩個地方的中國風更加地讓在下佩服。一個是由中國男子與日本女子的夫妻所建造的島china campus,另一個則是在一個叫Alarbus的島。這兩塊島都有中國建築,前者的規劃真的非常地整齊,而後者則是有刻意建起的長城,隔成兩邊不同的建築。

china campus位置:china campus(130,150,24)
若我沒料錯的話這應該是他們的官網(http://chinese.slmame.com/)

  先來說說china campus上面的店家,那裡總共有兩家店,一個應該是他們開的,在那裡聊天的話每五分鐘可賺2L$。而對面是演義工作室,他們是專賣衣服和一些物品的,我有和他們的店長聊天過,她有提到她在這裡雖然賺得不多,但已經足夠讓她吃住解決日常生活(她現實生活已經沒在工作),不過要省吃檢用些就是了,雖然SecondLife賺錢確實困難,但確實是可以證明有人靠這裡生活了。而演義工作室不只在chinese campus,他們也有開個茶館在Cote Azur E這個島上。
  對了,他的演義工作室也有在徵人唷。(http://forum.gamer.com.tw/C.php?bsn=07702&snA=253&locked=F&tnum=3&subbsn=0&Bpage=1&author=cocolee7777)
  (相關文章:http://d2life.net/content.asp?id=39)
  順帶一提,這個工作室還有搞個蠻high的生存遊戲活動,詳情可看這(http://forum.gamer.com.tw/C.php?bsn=07702&snA=274&locked=F&tnum=2&subbsn=0&Bpage=1&author=cocolee7777&media=0)

  影片還挺high的……( http://youtube.com/watch?v=6jK8JAjVse4)

演義工作室的江湖茶館:Cote Azur E(58,170,27)

  而在chinese campus島上還有一個蠻特別的地方,就是崇善寺,聽說那邊可以抽籤,不過我沒抽過就是了。


  剛提到的Alarbus島,其實是蠻漂亮的,但內容我就覺得沒什麼,好像只是為了要把東西賣出去而已沒有什麼讓我覺得特別的idea……還有我猜想地主可能不是華人,因為放上的圖片都是英文,沒什麼中文介紹,地主的資訊也都是英文自我介紹,所以我推論地主不是華人。



  最後零星介紹幾個地點。有一個是自稱台灣大使館的地,老實說聽說正在改建中,不然目前真的是挺荒涼的。雖然整體怖置不差啦,但就是覺得少了些什麼有趣的東西。再來是一個名叫SL TAIWAN的Group(圖片寫著龍門二字),當初我會知道巴哈就是加了這個Group,這個Group的地主反而從來沒看過,只是剛好那天有人在Group聊天,我才知道有巴友團這地方,也才知道釣魚島這地方,然後越知越多……那地方應該算是地主展示自己創作的地方吧,雖說Group是台灣,但介紹卻是簡體字,所以有可能是大陸人。順帶一提,那邊放的廣播電台還不錯聽。還有就是我們台灣的資策會也在裡面買了塊地,也是很荒涼,有一塊大大的看板,本來以為有類似投影片效果,但沒有,我想唯一值得提的就是旁邊有個可以打中國功夫的地方。

台灣大使館位置:Plontafus(245,50,22)

龍門位置:Pengyou(141,106,25)

台灣資策會位置:Anhalt Hill(211,44,22)

  最後當然就是我們Weco Lab啦,雖然建築普普通通,內容也沒啥,但至少我已經盡力了Orz……

Weco Lab位置:Jelloab(218,40,30)

  註一:
  想坐著賺點小錢又不想被踢的話,有個小撇步,就是按alt+ctrl+shift+D上面工具列會出現一個叫Client的選項,再選Character中的Character Test,請把裡面的 Go Away/AFK When Idle的X點掉,就不會被SecondLife踢出去了。也就是說你可以一直掛網賺錢了,只是在釣魚島那只賺到20L$就會被踢出來。以後可能的話,在下會把哪些地方有這種坐著就可以賺點小錢匯整一下也說不定。

啥SL—【LSL入門連結推鑒】

  LSL就是Linden Scripting Language的縮寫,簡單來說,就是在SecondLife裡的程式語言。

  目前個人所知,LSL這個程式碼要在SecondLife內撰寫,也就是說你得用他們爛爛的編輯器來寫。有時候還要飽受lag的痛苦來等待compiler成功……

  基本上工欲善其事,必先利其器,想學好LSL一定要有好的wiki,LSL的wiki總共有四個,而其中三個內容基本上都是來自於一個wiki的,而且這個的wiki內容關於LSL的比較詳細,就連SeocndLife官網指定的wiki都沒他好,官網的頂多是拿來查SecondLife有啥應用比較方便,比如Sculpted Map之類的。

  ok,先來列表一下所有的LSL wiki:
  因為,這篇只是入門,不會講太深入。

  所以在這邊就先介紹如何寫LSL的Hello World吧!!只要是會寫程式的,都知道Hello world相當於阿姆斯狀第一次登陸月球那樣的偉大!

  很簡單,你只要Create一個物件,編輯視窗把more點開,選擇"Content"標籤,點選New Script的按鈕,他就會自動產生一個程式碼了!!!

  沒錯!那個程式碼會跟你說Hello!!!

  這就是Hello World!!

  有沒有很空虛!?有沒有很空虛!?(搖晃)(搖晃)

  好啦,不鬧了,其實個人認為不管做什麼事,成就感是很重要的,當初就是不知道LSL能做什麼,自己怎麼看都不太懂,一點成就感也沒有。

  但有一點很遺憾,個人認為,要先有成就感,必須要有好的美工才行,要有好的美工,你得先有10L$上傳圖片才行才行,沒錢貼自己要的材質,做出來的東西都是一個又一個方塊Orz……我是到暑假拿到老師的帳號,才開始有一點成就感的……也就是我把老師的人和錢都到手才開始有成就感(誤)。

  話雖如此,最一開始看啥英文文件都覺得難的我還是有勉強找了個能夠讓自己有成就感的東西,就是—做時鐘(茶)。

  做時鐘可以看這個網站(http://www.slbuilding.com/)一步一步的影片教學。不過這個要有一點美工底子會比較好,所以重點還是需要錢把圖片上傳Orz……

  拿錢其實不是問題,可以找時間去釣魚島(有很多華人的島,之後會有文章做華人在SecondLife的介紹)坐椅子,只是10分鐘才1L$(有一個特別座是11分鐘2L$),特別為了這點小錢花時間,除非是在掛網,不然真的很耗時間。

  在這邊我是想了一個,就是利用你inventory內有的library資料夾物件,裡面所有的東西都是SecondLife製作人Liden做的。他的東西全都可以拆解且拿去用,當然連Script都可以修改,因此建議寫程式很需要成就感的朋友可以先從那下手。

  如果你不像我是個需要有成就感才能寫程式的傢伙,那你可以先從紅色wiki的Tutorials(http://www.lslwiki.net/lslwiki/wakka.php?wakka=LSLTutorials)去一步一步學習,這邊非常推薦裡面有一個網頁(http://www.kan-ed.org/second-life/using-LSL.html),這裡的每一個教法都有圖片輔助,感覺很棒。可惜的是這網頁我不知為啥只能從學校連進去,我家裡怎樣都連不上,為避免也有這樣情形的發生,我特地把那網站另存抓下來,在這邊給有興趣的朋友分享(http://slsseconlife.googlepages.com/using-LSL.rar)。

  入門連結差不多就到這了,如果問我本人寫LSL有啥習慣的話,我習慣先進紅色wiki首頁的fuction連結,點進去看所有method與method分類。我一切都是從那開始,把一個又一個的method拿來試試,我想這也是為啥一開始沒有成就感的緣故- -"(雖然現在習慣了)。

啥SL—【Creator入門】

  基本上,這裡一樣是放上一堆文章連結,因為已經有比我講得更好的文章了,在這裡頂多就是整合和做點個人的補充。

  在這邊說明一些3D的基本知識。3D模型是分兩種方面的,一是建模,二是貼材質(Texture)。建模就把他想成是捏黏土;貼材質就把他想成是在粘土上貼貼紙或上色。

  如果你有玩過3ds max的話,create那些動作是難不倒你的,不過我好奇會想來看我網誌的人到底有多少人碰過。資工系中大概只有我最閒吧Orz……好啦,其實這是志向不同才會如此。

  個人認為SecondLife建模可以分兩類,一種是在裡面的世界建模,另一種是用外面的3D軟體把在軟體中建好的模做成Sculpt Map,再輸入進入SecondLife。

=====以下為在裡面建模的教學,在裡面…在裡面耶…(羞)=====
  secondlife中的3D建模〔一〕(http://www.d2life.net/content.asp?id=50)

  Secondlife中的3D建模〔二〕(http://www.d2life.net/content.asp?id=51)

  Secondlife中的3D建模〔三〕(http://www.d2life.net/content.asp?id=52)

  基本上,功能就差不多是上面的教學那樣,但身為一個3D軟體界的半調子,這樣是不夠的!!

  玩軟體最重要的是,快、狠、準。

  如果你不會快捷鍵,那你根本無法體會何謂建模的真理!
  
  建模就像捏黏土一樣,大部分都得靠手!但是捏黏土是需要工具才有辦法把黏土捏得好的!玩3D建模只單靠上面的指令有什麼就點什麼,就像是捏黏土一樣什麼都得靠自己的手!這樣是很慢的!

  所以在下得介紹一些快捷鍵給大家:

  視角:
  •   移動觀查視角—Alt+滑鼠左鍵按住不放上下左右移動
  •   旋轉觀查視角—Alt+Ctrl+滑鼠左鍵按住不放上下左右移動
  •   回歸原始視角—Esc

  物件:

  物件這裡有一點要注意,就是編輯視窗中上面一堆可勾選的選項,有一個叫做"Stretch Both Side"的,通常這東西都是被打勾的,如果你不是要做對稱的東西,請取消。如果你有玩過3ds max,這功能我個人認為算是蠻重要的,因為我在3ds max建模時都是由一個小小的面慢慢去拉出與擴展我要的東西,雖然SecondLife裡面這功能沒辦法一拉就拉出一個新面(畢竟要做出這功能會很耗他們伺服器的運算),但是我是覺得這功能至少可以拉出自己想要的地方。一開始還傻傻的,以為拉長物件一定是兩邊拉,害我一直做不出我要的東西。而那個"Stretch Textures"就是是否要拉長材質,如果你想把物件同等比例拉大縮小,把這勾選了,在物件上的材質(Texture)也會跟著放大縮小,如果沒有勾選的話,他就只會重覆拼貼。

  ok,馬上進入快捷鍵的介紹(記得要點選物件讓物件出現有x、y、z的向量方向圖樣才可進行編輯)。

  •   刪除物件—Delete(有時候物件還顯示在那不代表還未刪除,只是它處理慢而已)
  •   複選物件—Shift+滑鼠左鍵點選物件(或Ctrl+滑鼠左鍵點選物件)(個人認為前者比較好選)
  •   Link物件—複選物件後Ctrl+L(註一)
  •   解除Link—Ctrl+Shft+L
  •   旋轉物件—ctrl+滑鼠移動方向
  •   縮放大小—ctrl+shift+點選欲縮放位置(注意,如果該物件是被Link住的,只能等比例縮放,如果想要改Link中的物件,請勾選編輯視窗中的"Edit linked part")
  •   複製該物件—Shift+移動方向(注意,被移動的是原來編輯的物件,不是新物件)(這裡和刪除物件一樣,有時候沒看到有複製不代表沒有複製到,只是他顯示較慢而已)
  •   回上一步(Undo)—Ctrl+Z(要是物件被刪除,這可是回不來的)
  •   回下一步(Redo)—Ctrl+Y(意思是你按過回上一步)

  其實上面有一些快捷鍵可以從SecondLife上面的工具列看到,但我認為這些是我在建模時常用的,我沒記錯的話例如縮放那些的快捷鍵我並沒有看到,我是靠著我玩過3ds max的經驗try看看的,確實是有一些雷同,其實玩軟體玩久了,很多功能的快捷鍵是一樣的,例如Ctrl+Z是Undo這卻是到哪都沒有變的。(專題同組的朋友林泰昇說縮放大小的快捷鍵有簡介,可是我沒看到Orz,希望有心人士能告知一下,因為可能還有功能遺漏。)

  還有,如果你想要更精確的移動方向與角度,請多利用編輯視窗中打開more按鈕中的Object標籤,那裡可以設定很精準的位置,size最大可到10最小可到0.01。

  這裡個人有個建模的小撇步,雖然我知道很簡單,但還是分享一下。因為我在建築建築物時常發現要用同一種東西堆疊,或想在該物件上方做一個物件,而這必須要很精準的相對位置時,本人會先將該物件Shift+移動複製,然後Ctrl+z undo,這樣一來,同一個位置會有兩樣東西重複,只要選擇一樣物件,對著Object標籤中的位置加你想要的相對距離,如此一來兩物件的位置就很精準了。

=====以上為把建模設在裡面的教學>////<=====

=====以下為你可以設在外面的教學!Zzzz=====

  
ok,接下來要來介紹用外面軟體的入門,基本上,這個地方本人卡很大,所以就介紹一些相關連結和自己的使用心得。

  首先,要知道SecondLife只接受Sculpt Map,就是在你上傳一張十塊錢的圖片內裡面有個拉霸選項叫Sculpted prim,點選那個就是了。而匯進去的模型頂多只能對他做縮放和旋轉,不會有一些像Box有中空(hollow)之類的額外編輯功能。

  那,什麼是Sculpted prim?

  很遺憾,因為本人是半調子,雖然碰3ds max有一年多,但能力還是很半調子,那到底是啥我一開始也不是很清楚,只知道是看起來很多色彩的圖片……不過重點是,我要怎麼搞出來?

  首先有幾個資料必須要先讀(很遺憾,我手邊只有英文資料):
  SL wiki(非紅色)(http://wiki.secondlife.com/wiki/Sculpted_Prims:_3d_Software_Guide)
  我們偉大的維基百科(http://en.wikipedia.org/wiki/Sculpted_prim)(在此建議使用firefox的朋友可以用一個名叫OpenSearchFox的外掛把中英文的維基百科列為自己右上角的搜尋列,這樣會方便很多)

  由於本人只碰過3ds max,所以只深入跟3ds max相關的,但深入的結果發現,有兩種方法,可是……做出來的都很爛,所以在此就只放上連結:(注意,代表以下的說明,你得要有3ds max才能繼續看下去)

  第一種方法—http://home.comcast.net/%7Epixelforgeltd/Tutorial.htm
  該方法讓我在匯進SecondLife的東西都做得和在3ds max的原物很不相像……只有一些較圓較簡單的東西還OK。

  第二種方法—http://wiki.secondlife.com/wiki/SculptGenMax
  我都是用這個方法把自己做的東西丟進SecondLife的,只是,我根本看不太懂做這東西的限制……是的,這一樣不是能隨心所欲地把自己在3ds max做好的模型完完整整地擺進去,我是去把這討論區的文章(http://forums.secondlife.com/showthread.php?t=185426)裡面原作者提供的物件拿來修改才OK的。

  由於該討論區是信用卡帳號的使用者才能進去,因此我把我會的方法介紹一下。

  這東西要先下載外掛,也就是那人在LSL wiki寫的max script(http://slsseconlife.googlepages.com/SculptGenMax0.4.1.zip)。

  記住,你得先要有3ds max9才行安裝這個外掛。

  安裝步驟如下:
  1. 點選上方工具列的MaxScript>Run Script,選擇剛下載的檔案
  2. 點選上方工具列的Customize>Customize User Interface
  3. 選該介面的Toolbars標籤
  4. 在該介面的Category選擇SecondLife
  5. 在Action內看到SculptGenMax,將其按住不放拖到上方有圖的工具列,之後就可以點選開啟了這個外掛了
  剛提到過了,因為我還是不清楚他討論區裡的教學,也就是做這東西的限制,所以我都是用這兩個檔案去修改的(http://slsseconlife.googlepages.com/SculptiesBasefileBox.zip
http://slsseconlife.googlepages.com/SculptiesBasefileCylinder.zip)
  
  記住,修改的過程中不可以為他添加東西,只能去針對裡面的每個面做縮放或改變位置,做好後,就可以開啟那個外掛製作sculpted map了。他有分大中小的圖,建議用最小的就可以了,因為這個程式跑起來很慢,很吃CPU資源。
  
  不過啦,用這個方法還是不夠好,只是比第一個方法好多了,至少我要做稜稜角角的東西還有70%、80%像(我指的是匯進SecondLife後的樣子)。
  
  而有沒有其他更好的方法?我相信是有的,看到維基百科那麼多免費的軟體可以用,應該可以抓幾個拿來玩玩,只是我對3D不是特別有興趣,我只把他當作我的輔助工具……所以其實也沒心思花那時間,不過,不一定啦,如果哪天突然很閒去找一個來碰又那麼剛好地可以放進SecondLife,那我就會寫一篇文章了。

=====以上為設在外面其實沒有比較好的教學!Zzzz=====  

  嗯,Creator相關入門就差不多到這裡了,如果想直接看人家做,我相信YouTube(http://www.youtube.com/results?search_query=SecondLife&search=Search)應該有很多的。

  如果想看我的成品,那就只有洛克人X可以看啦。


  除了腳和一些方型零件,我都是在3ds max建好模型再做成Sculp Map,很粗糙滴……要是能的話大概頂多先從Texture改進吧,唉,俺真的是一個半調子Orz。

  註一:
  Link的意思其實就像是群組化一樣。
  有以下幾點要注意:
  1.兩物件Link距離無法太遠,但可以藉由三個、四個短距離的物件把兩物件可Link的距離拉長。
  2.如該群組要設定為Physical,一定要在31個物件以下
  3.有時候Link不好Link,要換個寬敞一點的地方Link
  4.Link或解除Link有時候會很緩慢,不過有時候不是慢,是根本沒有Link,請多按幾次
  5.Link完的物件,黃色外框代表Parent、藍色皆為Children
  6.最後一個被Link的物件會被視為Parent

2007年11月10日 星期六

啥SL—【SecondLife入門】

  基本上,SecondLife(官網:http://secondlife.com/)就是一個虛擬世界,千萬不要把他當成線上遊戲,也不必把他想成什麼太難的玩意兒,他就是一個社群,如此簡單。其實,若要打個比方的話,我們可以說每一個國家就是一個大平台,一個很大的社群,所以你要把SecondLife當成一個國家其實是可以的。本人比較喜歡稱它是一個國家,因為家人每次都在問我那是啥時,說什麼也不懂,我認為直接講說那是一個國家比較快,我可以說我就是在那個名叫SecondLife的國家賺錢、蓋房子、做遊戲。

  糟糕,我突然覺得上面那段話可以跳過了,老毛病又犯了(茶)。

  首先,我必須要為那些好奇SecondLife有什麼有趣的東西的人分享一些連結,最基本的入門便是維基百科(http://zh.wikipedia.org/w/index.php?title=%E7%AC%AC%E4%BA%8C%E4%BA%BA%E7%94%9F&variant=zh-tw)。

  如果你很好奇啟動SeocndLife需要什麼樣的配備,這個香港人的blog有詳細的介紹(http://hi.baidu.com/realture/blog/item/6351af108bc98301213f2ecd.html)

  若還不夠,其實我的專題老師—梅興老師是有蒐集很多資料的,這是他Delicious的SecondLife相關分類(http://del.icio.us/fju_swm/secondlife)。

  但是,剛入門的朋友一定會像我一開始一樣,都是英文會看得非常辛苦,很想看看SecondLife到底有什麼應用,真的很希望有中文介紹。網路上是有幾個"感覺"蠻大的論壇,但我個人不是很喜歡論壇式的排板與每次要看文或下載都得要註冊,這樣的style不是很符合OOPS創作分享天下為公的概念(沒錯,我在打廣告!),所以在下我這裡找了兩個感覺不錯的網站介紹給那些入門者:

  巴哈姆特SecondLife哈啦區(http://forum.gamer.com.tw/A.php?bsn=07702)
  
  第二人生網(http://www.d2life.net/)

  嗯,結果以上還是有論壇嘛……不過至少本人覺得上面兩種樣板的網頁看起來比較爽呀!對了,由於SecondLife在台灣的知名度不高,所以網路上看到的大多是簡體字。如果有看不懂簡體字的,使用FireFox的朋友可以使用同文堂這個外掛;而用IE的朋友可以使用AlibaBar這個軟體;至於Opera的話……嗯,管你們去死!!(喂)

  接下來,我得說明一下為何可以說SecondLife是一個國家,你可以從它的官網首頁發現,這幾天應該都是三四萬人同時上線,目前已經累績一千多萬會員(來源http://secondlife.com/whatis/economy_stats.php)。裡面的虛擬幣也可以兌換成美金,目前是多少,我想從這連結應該看得出來,但我英文不太好,看不太出來,只好登入會員去試他的Buy 和Sell 的連結去試。你點選Sell可以知道他有分兩種Sell,但我不太清楚,只猜得到大概是為了防止一些人用偷吃步的方法換取大量金錢。所以,經過我的測試,要賣L幣的話,目前是286L幣可換1美金;而如果你要買L幣的話,目前是1美金可以買185L幣,。

  因為裡面的虛擬幣可以真的換成現金,所以我才說那裡面根本是一個國家,再加上有一些著名的企業已經在裡面買了小島住了進去,我想這說法應該更有說服力了吧!?(來源:上面提到的第二人生網有提到八個SecondLife該去的地方:http://www.d2life.net/content.asp?id=45)。

  順帶一提,我這邊有一篇認為SecondLife是玩商場數字的文章(http://blog.miula.cc/archives/57),雖然不可否認的,在SecondLife賺錢不容易(可參考維基百科http://www.d2life.net/content.asp?id=48http://www.d2life.net/content.asp?id=47這三篇文章),但是,絕對不可否認這數字的成長,從該篇文章可以知道,那時2007年一月28號應該有兩百八十萬會員,可是現在十一月卻已經有了一千七百多萬會員,短短九個月卻成長了八百萬會員。就算有部分是帳號重複好了,我相信扣除那數量也是很驚人。加上同時上線已從維基百科所說今年二月首次三萬人上線,到現在動不動可以看到四萬人上線,這樣的成長率也是相當地可怕……

  不過,只談錢的事有時候真的挺無趣的,但談創作的事,我個人卻認為這平台真是希望無窮。雖然本人不太喜歡SecondLife那樣的3D,甚至於討厭它,還挺厭惡有人說它是遊戲,但我不至於不接受它,更認為,這是一個我可以發揮我個人創意的平台,因為我可以將我的創作放上去(雖然一張圖要十塊L幣),也可以在裡面寫LSL做好玩的機器人,我甚至聽過一個島主以前只是為了好玩看了很多建築書(建築不是他的本業),卻在這裡大大地發揮了這個能力的效用,這是他始料未及的,而這也證明了一件事—虛擬的世界是可以達到滿足人類心理的效果的。

  總之,一開始不知道要在SecondLife做什麼的,或許可以從這些資訊去找到你要的東西。

  當然,有人可能會說,現實的社會已經夠煩人了,幹嘛還要來到虛擬的世界,又有人可能會認為,喜歡來到虛擬世界的人們根本就是在逃避現實社會,但是我要在這邊說,虛擬的世界亦是這個世界的一部分,沒有什麼逃不逃避;而虛擬的世界可以達到很多天馬行空的幻想,滿足人心理上的需求,達成人與人之間的相互交流,這不是逃避,而是正視自己的需求,所以,你還要亂冠名詞,宅來宅去了嗎?

It is not another world, it's a part of the world.