2010年12月28日火曜日

デジタルウォッチのスクリプト

うちはスクリプトの製作依頼は基本的に受付してないんですが、簡単なスクリプトの製作やご相談とか、商品の簡単な改造くらいだったら私の気分次第でやらせてもらったりします。それで、デジタル時計のスクリプトを売ってもらえないか?っていうお問い合わせ件数が結構多かったんですね。でもうちで販売してる時計のスクリプトそのものは売りたくないし、どんな時計に使うのか聞いたら何れも腕時計用だったので、お客様の製作する腕時計に合わせて書き直すのはちょっと大変かなって思ってお断りしてたんですよw

ってことで、今回は簡単なデジタルウォッチのスクリプトです。。。まあ液晶表示部分だけですけどねwww


まずプリムの製作です。ボックスを作ってサイズを0.01x0.01x0.01、テーパーX0.60,Y0.40、スライスB0.900くらいにしてください。


作ったものを5つコピーして並べ、左から順にオブジェクト名を h1 h2 colon m1 m2 に変更して全部リンクさせてください。親プリムはどれになっても構いませんが、X、Y方向を間違えないようにしてくださいね。

各プリムの側面や底面は目立たないよう透明にしてください。

液晶文字のテクスチャはこんな感じで作ります。作るのが面倒だったらスクリプトに書いてあるUUIDそのまま使うとこれと同じものが出ます。(背景は透明です)


そしてスクリプトです。このスクリプトはどのプリムに入れても動くと思うので、腕時計の親プリムに入れたらややこしくなくていいかもですね^^
// デジタルウォッチ
integer JST=TRUE;  // TRUEで日本時間、FALSEでSL時間
integer tmp;  // 一時記憶用
// リンク番号保存用変数
integer h1;  // 時の左プリム
integer h2;  // 時の右プリム
integer colon;  // :用のプリム
integer m1;  // 分の左プリム
integer m2;  // 分の右プリム
key texture="495abf2a-034c-9ff9-273e-3ce5d424b3e3";  // 表示用数字テクスチャのUUID
// テクスチャのオフセット位置データ
list ou=[-0.417,-0.25,-0.083,0.083,0.25,0.417,-0.417,-0.25,-0.083,0.083,0.25,0.417];
list ov=[0.25,0.25,0.25,0.25,0.25,0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25];

set_texture(integer num, integer i)
{  // 表示用
    if (num < 1) return; // リンクがない場合リターン
    llSetLinkPrimitiveParamsFast(num,[PRIM_TEXTURE,0,texture,<0.2,0.5,0>,<llList2Float(ou,i),llList2Float(ov,i),0>,0.0]);
}

init()
{
    integer i;
    integer j=llGetNumberOfPrims();  // リンクしてるプリムの数
    for (i=0; i <= j; i++) {
        string str=llGetLinkName(i);  // プリム名取得
        // colon,h1,h2,m1,m2の各リンク番号を保存
        if (str == "colon") colon=i;
        else if (str == "h1") h1=i;
        else if (str == "h2") h2=i;
        else if (str == "m1") m1=i;
        else if (str == "m2") m2=i;
    }
}

default
{
    state_entry()
    {
        init(); // initへ
        set_texture(colon,10); // 中央の:を表示
        llSetTimerEvent(0.1);  // 0.1秒毎のタイマー
    }

    changed(integer change)
    {
        if (change & CHANGED_LINK) init();  // リンクが変わったらinitへ
    }

    timer()
    {
        integer i;
        if (JST) i=(integer)llGetGMTclock();  // 日本時間のときはGMT時間を取得
        else i=(integer)llGetWallclock();  // そうでないときはSL時間(PST/PDT)
        if (i != tmp) {  // 時間が変わったら
            tmp=i;  // tmpに格納
            if (JST) {  // 日本時間だったら
                i+=32400; // 9時間(9*3600)加算
                if (i >= 86400) i-=86400;  // 86400(24*3600)以上は86400減算
            }
            integer h=i/3600;  // 時
            integer m=i%3600/60;  // 分
            string hh=(string)h;  // 時の表示用
            string mm=(string)m;  // 分の表示用
            // 10以下のとき0を付けて2桁にする
            if (h < 10) hh="0"+hh;
            if (m < 10) mm="0"+mm;
            i=(integer)llGetSubString(hh,0,0);  // 時の10の位
            if (i == 0) i=11;  // 0だったら空白(11)にする
            set_texture(h1,i);  // 時の左側を表示
            set_texture(h2,(integer)llGetSubString(hh,1,1));  // 時の右側を表示
            set_texture(m1,(integer)llGetSubString(mm,0,0));  // 分の左側を表示
            set_texture(m2,(integer)llGetSubString(mm,1,1));  // 分の右側を表示
        }
    }
}

0 件のコメント:

コメントを投稿