ってことで、今回は簡単なデジタルウォッチのスクリプトです。。。まあ液晶表示部分だけですけどね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 件のコメント:
コメントを投稿