2007年12月21日 星期五

啥SL—【Event—Collision】

Collision

  如同字義,就是碰撞,只要你把collision(integer num_detected)collision_start(integer num_detected)collision_end(integer num_detected)land_collision(vector pos)
land_collision_start(vector pos)
land_collision_end(vector pos)
這幾個Event放入程式碼就會因為物體受到碰撞而啟動該Event內的程式。

  在這邊先來說說collision和land_collision有什麼差別好了,前者是只要有使用者(AGENT)和物件(object)觸碰就會啟動,後者是只要碰到土地才會啟動。而獲得的參數資料,前者是測到有幾個人或物同時碰到,後者是測碰到該物的土地位置。

  而有start、end以及沒有這兩個字樣的event都和之前的SeonsorTouch一樣,剛開始碰撞,和碰撞結束以及持續碰。

  不過因為他這event並不像那樣
Seonsor那樣有什麼重複和單一次碰,所以只要有碰撞他都會偵測,搞得我覺得這三樣好像功用差不多,雖然持續碰撞確實是會持續一陣子啟動,但我使用的效果並沒有那麼好,感覺他的感應太過於敏感。

  總之,以下是範例程式碼:

default
{
collision_start(integer num_detected)
{
llSay(0,"Don't kiss my ass!!!");
}

collision(integer num_detected)
{
llSay(0,"Don't fuck me!!");
}
collision_end(integer num_detected)
{
llSay(0,"Don't leave me!!!");
}

land_collision_start(vector pos)
{
llSay(0,"I touch the land!!");
}

land_collision(vector pos)
{
llSay(0,"I can't leave the land!!!");
}

land_collision_end(vector pos)
{
llSay(0,"Go to find another land!!!");
}

}


  嗯,因為實驗結果和我預期的有一點不太一樣,所以我不太好解釋,建議去試著寫看看。

  還有,
collisioncollision_startcollision_end這三個event如果要特別過慮某種物件可以使用llCollisionFilter(string name, key id, integer accept)這個method,這個method在我們的遊戲當中是很重要的成份,他降低了event一直被碰撞啟動的麻煩……不過還是不夠完美,因為他只能特別針對一個物件過濾,不能對多個物件過濾,所以在我們的遊戲當中,魔王本來是要只能對我們的武器感應到碰撞,但因為這個限制,我們只能寫只對"Object"物件過濾。

  看不懂?那看以下使用範例應該會比較快:

default
{
state_entry()
{
llCollisionFilter("shortlin Yue", NULL_KEY, TRUE);
}

collision_start(integer num_detected)
{
llSay(0, "Oh my god, you are shortlin!!");
}
}


  上面這個程式碼呢,就是我"shortlin Yue"或著名叫"shortlin Yue"的物件去碰他,他就會說話了,其他東西碰到就不會說話,所以name是傳物體或使用者名字,id就是該使用者或物體的key值,但這裡可有可無,當是NULL_KEY時就代表沒有特別限制"哪一個"特別的物件或使用者,而accept是要傳0或1的布林值,當是TRUE時,就代表只允許,FALSE就代表不允許。

  所以當時我們的專題本來是想用這個方法特別限定只會測到我們的武器,可惜的是我們的武器有很多樣,這個method多寫又沒有用(他只針對最後一個),所以我們最後才寫了
llCollisionFilter("Object", NULL_KEY, FALSE);因為我們的地板是叫"Object",為了避免魔王每次碰地板都會啟動event所以才這樣寫。

沒有留言: