2008年09月12日
■ダンスボールスクリプト【LSL】
初めてダンスボールスクリプトを書く際、グーグル様を使用しReferenceを探しまくったわけだがサッパリ見つからなかった経験がある。
ソースコードをバシバシ乗せることは価格破壊にでもつながるのかな。
ある程度lslを把握してる人の為に、簡単な仕組みをば
はじめに、スクリは2種類用意する。
main_script(踊ってる人間の管理、ダンスの管理)
perm_script(権限取得とStart/StopAnimation)
perm_scriptでは、初期起動時に以下のコードを入れると便利だと思う
--ココカラ--
string sn = llGetScriptName();
//slにはこのスクリの文字列長(perm_scriptだと11)
integer sl = 11;
if(llStringLength(script) == sl)
{
me = 0;
}
else
{
me = (integer)llDeleteSubString(sn,0,sl);
}
--ココマデ--
これをやっとけば、自分のナンバーをわざわざ書き込んでおく必要がない。
meはグローバル変数として定義しといてよ。
・1個目をプリムに投入→perm_scriptのままなので、meには0
・2個目をプリムに投入→perm_script 1に勝手に名前かわるんで、meには1
って感じね。
で、全体図が以下
①タッチイベントが起きると
②タッチした人間が、「最初にタッチしたのか」「2回目なのか」を判断する
内部にlistを持っておけば可能だろう。
③「最初にタッチ」なら、TRIGGERアニメのパーミッションを取得しにいくわけだが
これを子スクリプト(perm_script)にやらせる。全部スクリは同じプリムに突っ込むので
LINK_THISに、「管理をやらせたいスクリナンバー(integer)」と「開始の文字列(string)」と
「タッチした人間のUUID(key)」を送信する。
「2回目」であれば、内部テーブルからタッチした人のkeyを削除し、
LINK_THISに、「管理をやらせているスクリナンバー(integer)」と「終了の文字列(string)」
を送信する。
④perm_scriptは、送信されてきたinteger値とmeが同じならば、自分への仕事だと判断して
⑤開始か終了かを判断
⑥開始ならばパーミッションを取得し、アニメーションを再生
⑦終了ならば、アニメを停止し、llResetScript()する。
ざっくりこんな感じ。
ダンスが複数なら、
ダンス名のlist(dances)と再生時間のlist(times)をもって、
カウント変数(count)ももって
timer()
{
if(count >= llGetListLength(dances))
{
count = 0;
}
string dance = llList2String(dances,count);
llMessageLinked(LINK_THIS, 999,dance,NULL_KEY);
llSetTimerEvent(llList2Integer(times,count));
count++;
}
こういう事をやればいい。
子スクリプトは、NULL_KEYが送られてきたらとか999ならダンストリガーだとかいう処理を入れればいい。
んで、パーミッション取得済みかそうじゃないかのフラグも用意して、フラグが立ってたらStartAnimationやればよい。
なんだか書いててだるくなったのでここまで。
質問はコメントかSL内でよろしく
ソースコードをバシバシ乗せることは価格破壊にでもつながるのかな。
ある程度lslを把握してる人の為に、簡単な仕組みをば
はじめに、スクリは2種類用意する。
main_script(踊ってる人間の管理、ダンスの管理)
perm_script(権限取得とStart/StopAnimation)
perm_scriptでは、初期起動時に以下のコードを入れると便利だと思う
--ココカラ--
string sn = llGetScriptName();
//slにはこのスクリの文字列長(perm_scriptだと11)
integer sl = 11;
if(llStringLength(script) == sl)
{
me = 0;
}
else
{
me = (integer)llDeleteSubString(sn,0,sl);
}
--ココマデ--
これをやっとけば、自分のナンバーをわざわざ書き込んでおく必要がない。
meはグローバル変数として定義しといてよ。
・1個目をプリムに投入→perm_scriptのままなので、meには0
・2個目をプリムに投入→perm_script 1に勝手に名前かわるんで、meには1
って感じね。
で、全体図が以下
ボールタッチ | |
↓ | |
main_script | ┬───perm_script |
├───perm_script 1 | |
├───perm_script 2 | |
├───perm_script 3 | |
└───perm_script 4 |
①タッチイベントが起きると
②タッチした人間が、「最初にタッチしたのか」「2回目なのか」を判断する
内部にlistを持っておけば可能だろう。
③「最初にタッチ」なら、TRIGGERアニメのパーミッションを取得しにいくわけだが
これを子スクリプト(perm_script)にやらせる。全部スクリは同じプリムに突っ込むので
LINK_THISに、「管理をやらせたいスクリナンバー(integer)」と「開始の文字列(string)」と
「タッチした人間のUUID(key)」を送信する。
「2回目」であれば、内部テーブルからタッチした人のkeyを削除し、
LINK_THISに、「管理をやらせているスクリナンバー(integer)」と「終了の文字列(string)」
を送信する。
④perm_scriptは、送信されてきたinteger値とmeが同じならば、自分への仕事だと判断して
⑤開始か終了かを判断
⑥開始ならばパーミッションを取得し、アニメーションを再生
⑦終了ならば、アニメを停止し、llResetScript()する。
ざっくりこんな感じ。
ダンスが複数なら、
ダンス名のlist(dances)と再生時間のlist(times)をもって、
カウント変数(count)ももって
timer()
{
if(count >= llGetListLength(dances))
{
count = 0;
}
string dance = llList2String(dances,count);
llMessageLinked(LINK_THIS, 999,dance,NULL_KEY);
llSetTimerEvent(llList2Integer(times,count));
count++;
}
こういう事をやればいい。
子スクリプトは、NULL_KEYが送られてきたらとか999ならダンストリガーだとかいう処理を入れればいい。
んで、パーミッション取得済みかそうじゃないかのフラグも用意して、フラグが立ってたらStartAnimationやればよい。
なんだか書いててだるくなったのでここまで。
質問はコメントかSL内でよろしく
Posted by sppiN at 14:02│Comments(0)