2007年04月28日
仕組み:セキュリティロックあいてむ(5)
securityLockItem links
シリーズ?5回目です。
続きまして、セキュリティロックアイテムの
ボタンに仕込まれているscriptを解説します。
ボタン12個全てに同じscriptが仕組まれます。
まず下準備。
ボタンを押したときの音声ファイル(wav)を
12個のボタンすべての中に入れ込んでおきます。
シリーズ?5回目です。
続きまして、セキュリティロックアイテムの
ボタンに仕込まれているscriptを解説します。
ボタン12個全てに同じscriptが仕組まれます。
まず下準備。
ボタンを押したときの音声ファイル(wav)を
12個のボタンすべての中に入れ込んでおきます。
音声ファイルは子プリム(ボタン)が押された際、
親プリム側で鳴らすようにすればひとつ入れ込むだけですみますが、
子プリムから親プリムへメッセージを伝える段階で
タイミング的なズレがでると嫌なので
子プリムボタン全てに入れ込みました。
たくさん入れたからといって、特にファイルサイズも増えないでしょうし。
(プリム間メッセージは、たまにタイムラグが起こることがあるようです)
次に、ボタンそれぞれに、デザインされている文字(数字、#、*)そのままの名前をつけます。
これで準備OKです。
全部のボタンに下記のscriptを仕込みます。
各命令の詳細まで説明しませんが
動作としては
・scriptが始まったとき、自分の座標を記憶する
・タッチされたとき、ボタンが押し沈むアニメを再生し、音を鳴らす、親プリムに自分が押された事を伝える
という事をします。
ボタン側ではパスワード関連の処理にはノータッチです。
あくまでUIパーツとしての振る舞いのみ記述し
ボタンが押された後の処理は親プリムに任せます。
(なぜそうするかは、次の本体側script解説で取り上げます。)
どのボタンが押されたかを親プリムに伝えるために
自分の名前を引数にしています。
そのためにプリムの名前をボタンの文字そのままにしたわけです。
の部分は親プリムscriptがリセットされたとき、
子プリムのscriptも強制的にリセットする為に呼び出されます。
scriptがリセットされたときの位置を基準に
ボタンが押されたアニメを再生する仕様なので
ボタンの本体に対する相対位置を移動した時、
ボタン全てのscriptにリセットをかけないと、
ボタンを押した際に
このようにどこかに行ってしまいます。
その為の強制scriptリセット処理なのですが。
素直に今いる位置からアニメさせたほうがよかったかな。
※普段このアイテムを使用している際には
ボタンと本体の相対位置は変化しないので
このままでも問題ありません。
--
実は、このアイテムを使用する際ですが、
なにせSLなので!どこからでもカメラの位置を移動して
パスワードを覗き見る事ができてしまいます。
でもボタンが動く演出が無いのも寂しいので
売り出す際にはボタンアニメはユーザ側でoffできるように直しましょうか。
ボタン側はこんな感じです。
親プリム側で鳴らすようにすればひとつ入れ込むだけですみますが、
子プリムから親プリムへメッセージを伝える段階で
タイミング的なズレがでると嫌なので
子プリムボタン全てに入れ込みました。
たくさん入れたからといって、特にファイルサイズも増えないでしょうし。
(プリム間メッセージは、たまにタイムラグが起こることがあるようです)
次に、ボタンそれぞれに、デザインされている文字(数字、#、*)そのままの名前をつけます。
これで準備OKです。
全部のボタンに下記のscriptを仕込みます。
string _myName;
vector _orgPos;
vector PUSHED_POS = <-0.005,0,0>;
string SE_NAME = "keyTouch";
string COMMAND_NAME = "onClickButton";
Init(){
_myName = llGetObjectName();
_orgPos = llGetLocalPos();
}
default{
state_entry(){
Init();
}
on_rez(integer num){
llResetScript();
}
touch_start(integer total_number){
llPlaySound(SE_NAME,1.0);
llMessageLinked(LINK_ROOT,0,COMMAND_NAME+" "+_myName,NULL_KEY);
llSetPos(_orgPos + PUSHED_POS);
llSleep(0.05);
llSetPos(_orgPos);
}
link_message(integer sender,integer num,string mes,key id){
if(mes=="reset"){
llResetScript();
}
}
}
各命令の詳細まで説明しませんが
動作としては
・scriptが始まったとき、自分の座標を記憶する
・タッチされたとき、ボタンが押し沈むアニメを再生し、音を鳴らす、親プリムに自分が押された事を伝える
という事をします。
ボタン側ではパスワード関連の処理にはノータッチです。
あくまでUIパーツとしての振る舞いのみ記述し
ボタンが押された後の処理は親プリムに任せます。
(なぜそうするかは、次の本体側script解説で取り上げます。)
どのボタンが押されたかを親プリムに伝えるために
自分の名前を引数にしています。
そのためにプリムの名前をボタンの文字そのままにしたわけです。
if(mes=="reset"){
llResetScript();
}
の部分は親プリムscriptがリセットされたとき、
子プリムのscriptも強制的にリセットする為に呼び出されます。
scriptがリセットされたときの位置を基準に
ボタンが押されたアニメを再生する仕様なので
ボタンの本体に対する相対位置を移動した時、
ボタン全てのscriptにリセットをかけないと、
ボタンを押した際に
このようにどこかに行ってしまいます。
その為の強制scriptリセット処理なのですが。
素直に今いる位置からアニメさせたほうがよかったかな。
※普段このアイテムを使用している際には
ボタンと本体の相対位置は変化しないので
このままでも問題ありません。
--
実は、このアイテムを使用する際ですが、
なにせSLなので!どこからでもカメラの位置を移動して
パスワードを覗き見る事ができてしまいます。
でもボタンが動く演出が無いのも寂しいので
売り出す際にはボタンアニメはユーザ側でoffできるように直しましょうか。
ボタン側はこんな感じです。
仕組み:セキュリティロックあいてむ(6)
設置例:セキュリティロックあいてむ(4)
構造:セキュリティロックあいてむ(3)
テクスチャ公開:セキュリティロックあいてむ(2)
セキュリティロックあいてむ(1)
設置例:セキュリティロックあいてむ(4)
構造:セキュリティロックあいてむ(3)
テクスチャ公開:セキュリティロックあいてむ(2)
セキュリティロックあいてむ(1)
Posted by harayoki at 23:14│Comments(2)
│セキュリティロック
この記事へのコメント
ボタンを押したときの反応が、移動じゃなくて色変化だったらもっとバレバレですね :-)
Posted by teess at 2007年04月29日 01:11
そうですね、作らなくてよかったです。
Posted by harayoki at 2007年04月29日 02:23