[Second Life]製作一個點陣動態跑馬燈(一)

原文請看這裡 

想做出一個點陣跑馬燈的原因是因為Second Life並不支援中文字,使用英文Texture的方式已經被人做出來了,請看矮民的介紹

其實像我們中文Second Life的玩家,在沒有良好的技術支援以及文件下面,絕對無法將SL推廣出去,所以希望大家能夠多多貢獻出自己的技術啦。

做出來的效果就像是這樣,上面的字是可以動態更改的,至於如何更改,之後的文章會跟各位介紹 。

Snapshot_001_001

製作一個物件擁有五個面的prim

由於SL上面有物件數量的限制,所以我們讓一個Prim就能夠顯示五個面在同一個平面上,就請跟這我這樣做。

先創造一個立方體物件在土地上

Snapshot_001_002

接著創造新的Script並且將下面的程式碼貼在裡面。

string FACE_TEXTURE = "5748decc-f629-461c-9a36-a35a221fe21f";
string  TRANSPARENT = "701917a8-d614-471f-13dd-5f4644e36e3c";

default
{
    state_entry()
    {
        llSetPrimitiveParams([
          PRIM_TYPE, PRIM_TYPE_PRISM, PRIM_HOLE_SQUARE, <0.199, 0.8, 0.0>, 0.30,
            ZERO_VECTOR, <1.0, 1.0, 0.0>, ZERO_VECTOR,
          // display a default face texture
          PRIM_TEXTURE, 1, FACE_TEXTURE, <2.48, 1.0, 0.0>, <-0.740013, 0.0, 0.0>, 0.0,
          PRIM_TEXTURE, 6, FACE_TEXTURE, <1.0, 1.0, 0.0>, <0.0, 0.0, 0.0>, 0.0,
          PRIM_TEXTURE, 4, FACE_TEXTURE, <-14.75, 1.0, 0.0>, <0.130009, 0.0, 0.0>, 0.0,
          PRIM_TEXTURE, 7, FACE_TEXTURE, <1.0, 1.0, 0.0>, <0.0, 0.0, 0.0>, 0.0,
          PRIM_TEXTURE, 3, FACE_TEXTURE, <2.48, 1.0, 0.0>, <-0.255989, 0.0, 0.0>, 0.0,

          PRIM_COLOR, 1, <0, 0, 0>,1,
          PRIM_COLOR, 6, <1, 0, 0>,1,
          PRIM_COLOR, 4, <0, 1, 0>,1,
          PRIM_COLOR, 7, <0, 0, 1>,1,
          PRIM_COLOR, 3, <1, 1, 1>,1,
          PRIM_FULLBRIGHT, ALL_SIDES, TRUE,

          // show transparent textures for the other sides
          PRIM_TEXTURE, 0, TRANSPARENT, <0.1, 0.1, 0>, ZERO_VECTOR, 0.0,
          PRIM_TEXTURE, 2, TRANSPARENT, <0.1, 0.1, 0>, ZERO_VECTOR, 0.0,
          PRIM_TEXTURE, 5, TRANSPARENT, <0.1, 0.1, 0>, ZERO_VECTOR, 0.0,

          PRIM_SIZE, <0.03, 2.89, 0.5>
        ]);

        // Remove ourselves from inventory.
        llRemoveInventory(llGetScriptName());
    }
}

這時候你就可以得到一個非常漂亮五個顏色的prim,任誰都忍不住想要去舔舔看....

Snapshot_001_004

讓這個霓虹燈閃吧閃吧

接下來我們先測試一下讓這個霓虹燈,把程式碼複製到你的物件上並且存檔。

vector tempcolor;

changetoNext(){
    tempcolor = llGetColor(3);
    llSetColor(llGetColor(7),3);
    llSetColor(llGetColor(4),7);
    llSetColor(llGetColor(6),4);
    llSetColor(llGetColor(1),6);
    llSetColor(tempcolor,1);
}

default
{
    state_entry(){
        llSetTimerEvent(1);
    }
    timer(){
        changetoNext();
    }
}

這時候你就可以得到一個 每秒都在變化的五彩霓虹燈了....

Snapshot_001_006

讓霓虹燈接起來吧!

沒錯,我相信大家都想知道要怎麼讓更多的霓虹燈有關聯性,這我就在這裡做個簡介吧,我們用linkmessage來將上一個物件最左邊的顏色傳給下一個物件,這樣下一個物件就知道要在什麼時間改成什麼顏色了。

就像是我從最右邊的物件開始推出顏色給下一個物件一樣。

複製 -Snapshot_001_007

請複製出三個同樣的物件,並且將最左邊以及中間物件Script改為

integer mynum;

changetoNext(vector nextcolor){
    llMessageLinked(LINK_ALL_OTHERS, mynum-1, (string)llGetColor(3), "");
    llSetColor(llGetColor(7),3);
    llSetColor(llGetColor(4),7);
    llSetColor(llGetColor(6),4);
    llSetColor(llGetColor(1),6);
    llSetColor(nextcolor,1);
}

default
{
    state_entry(){
        mynum = (integer)llGetObjectDesc();
    }
    link_message(integer linknum, integer num, string str, key id){
        if(num==mynum){
            changetoNext((vector)str);
        }
    }
}

最右邊的物件改為

integer mynum;
vector tempcolor;

changetoNext(){
    tempcolor = llGetColor(3);
    llMessageLinked(LINK_ALL_OTHERS, mynum-1, (string)llGetColor(3), "");
    llSetColor(llGetColor(7),3);
    llSetColor(llGetColor(4),7);
    llSetColor(llGetColor(6),4);
    llSetColor(llGetColor(1),6);
    llSetColor(tempcolor,1);
}

default
{
    state_entry(){
        mynum = (integer)llGetObjectDesc();
        llSetTimerEvent(1);
    }
    timer(){
        changetoNext();
    }
}

最後將最左邊的物件Description改為11,中間物件改為12,右邊改為13,並且再用Ctrl-L把物件Link起來

這樣就完成了

一般來說,若是使用messagelink,每一個物件都要用某個東西來分別是不是應該他要拿到的,我比大家懶一點,所以我就將Description改成這樣,方便我們在拿取物件分別。

11,12,13,....
21,22,23,....
31,32,33,....

這樣的好處我們不用大費周章的去修改每個物件的Script,也不會把不該送的送到其他物件中。

你問我方不方便?

當然方便啊,這樣我可以只改Description就製作出世界最長的跑馬燈耶...

Snapshot_001_009_001