ソラマメブログ

2008年12月26日

アナログストップウォッチ(スクリプト)を考える(#^.^#)

クリスマス、終わっちゃいましたね^^こんばんは、なつです。

さて、次回の懐中時計は、クロノグラフ?
ストップウォッチ機能付きを考えています(ニッ)

今回の実験機
アナログストップウォッチ(スクリプト)を考える(#^.^#)
出来損ないの熊じゃないですよ~

緑の針=時間、青の針=分、赤の針=秒、黒の針=1/10秒です。

角度を変えて↓
アナログストップウォッチ(スクリプト)を考える(#^.^#)

本体タッチでダイアログを表示↓アナログストップウォッチ(スクリプト)を考える(#^.^#)

ダイアログから、スタート、ストップ、リセットを選びます

動いてるところ↓
アナログストップウォッチ(スクリプト)を考える(#^.^#)

機能:
本体タッチで、ダイアログ(初期状態は、stop、start、resetの3つボタン)を表示します。
startボタンで、計測開始し2つ目のダイアログ(stop、resetの2つのボタン)を表示します。
stopボタンで、計測中止し、3つ目のダイアログ(start、resetの2つボタン)を表示します。(時間をチャット出力)

start→stopで、計測中止というのは、stopしてからstartを押すと続けて計測します。
stopを押した時、1分30秒なら、そこから加算します。

resetボタンで、針位置、時間をリセットします。

スクリプト


---------------------------------親プリムココから-------------------------------------------
integer LHandle2;
integer CHANNEL2 = 723001;
string mes;


list stopw = ["start","stop","reset"];

Me(){

llOwnerSay(mes);
llMessageLinked(LINK_ALL_CHILDREN, 0, mes, "");

}


default
{
state_entry()
{

LHandle2 = llListen(CHANNEL2, "", "NULL_KEY", "");

}

touch_start(integer total_number)
{
llDialog(llDetectedKey(0),"Select command",stopw,CHANNEL2);
}


listen(integer channel, string name, key id, string message)
{

if(message == "start"){
mes =message;
Me();
llDialog(llDetectedKey(0),"Select command",["stop","reset"],CHANNEL2);
}
else if(message == "stop"){
mes =message;
Me();
llDialog(llDetectedKey(0),"Select command",["start","reset"],CHANNEL2);
}
else if(message == "reset"){
mes =message;
Me();
llDialog(llDetectedKey(0),"Select command",["start","stop","reset"],CHANNEL2);
}




}
}
---------------------------------親プリムココまで-------------------------------------------
親プリムスクリプト解説
ちょっと、変数とかの名前が変ですけど、他のスクリプトに組み込むので、自分で分かりやすくしてます^^

親プリムは、単純です。
タッチされたら、ダイアログを表示して、押されたボタンの名前をそのまま、全子プリムに送信してます。
ただ、押されたボタンによって、次に表示されるダイアログのボタンを変えてます。
(ここ、後で変更したので、ごちゃごちゃしてます><)


---------------------------------子プリムココから-------------------------------------------

integer cut_i = 0;
integer cut_r;

set_rot()
{
cut_r = (cut_i % 10) * 36;
llSetLocalRot(llEuler2Rot(-(<0, 0, cut_r * DEG_TO_RAD>)));
}

default
{
state_entry()
{
set_rot();
}

touch_start(integer total_number)
{
//llSay(0, "Touched.");
}

link_message(integer sender_num, integer num, string str, key id)
{
if(str == "start"){
llSetTimerEvent(0.1);
}
else if(str == "stop"){
llSetTimerEvent(0);
integer tim = cut_i / 10;
integer hh = tim / 3600;
integer mm = (tim % 3600) / 60;
integer ss = (tim % 3600) % 60;
integer so = cut_i % 10;
llOwnerSay((string)hh + ":" + (string)mm + "," + (string)ss + "." + (string)so);
}
else if(str == "reset"){
llSetTimerEvent(0);
cut_i = 0;
set_rot();
}
}
timer(){
cut_i ++;
set_rot();

}
}

---------------------------------子プリムココまで-------------------------------------------
子プリムスクリプト解説:

ちょっと、ごちゃごちゃしてます^^
これは、1/10秒針用のスクリプトです。
他の針用に変更しやすくするために、こんな書き方になってます。

defaultから上の部分

integer cut_i = 0; --------------------時間計測用
integer cut_r;---------------------------角度計算用

set_rot()
{
cut_r = (cut_i % 10) * 36;
llSetLocalRot(llEuler2Rot(-(<0, 0, cut_r * DEG_TO_RAD>)));
}

このset_rot()の部分を書き換えることで、他の針用に変更します。

リンクメッセージで「start」と聞こえたら、
タイマーイベントを0.1秒毎に呼び出します。
タイマーイベントでは、cut_iを1づつ加算してますので、
set_rot()の内容は、cut_i を10で割って余り(最後の桁の数値)に36(1周で360の1/10)をかけてます。

llSetLocalRot(llEuler2Rot(-(<0, 0, cut_r * DEG_TO_RAD>)));は、
もうおまじないのように覚えてOkだと思います^^
角度をRot型に変換して、自分の角度にセットしてます。

リンクメッセージで「reset」と聞こえた時は、
見たまんまです、
変数を0にして、針の位置をリセットし、タイマーを止めます。

リンクメッセージで「stop」と聞こえた時が、ちょっとややこしいです^^
まず、タイマーを止めます。

その後の処理ですが、cut_i を時間、分、秒、1/10秒と見やすく分けて、チャット出力してます。
cut_i=秒ではなく、cut_i=1/10秒なので、一度 integer tim = cut_i / 10; で
秒に直してます^^

ばかだから、ややこしくて・・・(最初勘違いしてて、何回も失敗しました)
分かりやすく直してから、計算してます。

このチャット出力の部分は、どこかの針に1つだけあればいいので、
他の針には、書かなくていいです。

ちなみに、ですけど、
このまま、コピーして頂いても動きます・・・けど、
あくまでも、実験用なので、2個並べたら連動とかしちゃいますので、そのあたりは工夫してください^^

あと、タイマーイベントで、時間を加算してますが、これがどれぐらい正確か?
もっと、簡単な方法があるんじゃないか?
もしかしたら、すっごく重いスクリプトじゃないのか?
とか、まだまだ実験中なので、ご注意くださいませ^^

1/10秒針のスクリプトしか載せてませんけど、
時間のチャット出力の部分の、hh=時間、mm=分、ss=秒ですので、
あの計算方法で各針のset_rot()中を書きなして頂くとOkだと思います。

以上、今日はここまでです。
これからINします~





同じカテゴリー(商品開発秘話(スクリプト、プリムなど))の記事画像
普通のプリム?スカルププリム?の続き
普通のプリム?スカルププリム?
心が折れた・・・><
作業進行状況
色変更スクリプト(RGB微調整)
もうすぐ発売
 普通のプリム?スカルププリム?の続き (2009-12-09 15:58)
 普通のプリム?スカルププリム? (2009-12-07 20:44)
 心が折れた・・・>< (2009-10-28 15:48)
 作業進行状況 (2009-09-21 21:59)
 色変更スクリプト(RGB微調整) (2009-09-11 03:11)
 もうすぐ発売 (2009-09-07 00:51)
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。