ソラマメブログ

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
って感じね。

で、全体図が以下
ボールタッチ
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)
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。