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します~
さて、次回の懐中時計は、クロノグラフ?
ストップウォッチ機能付きを考えています(ニッ)
今回の実験機

出来損ないの熊じゃないですよ~
緑の針=時間、青の針=分、赤の針=秒、黒の針=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します~
Posted by natu(DCCXXIII) at 23:35│Comments(0)
│商品開発秘話(スクリプト、プリムなど)