こんばんは~。ぺんです。
いきなりこれでどうだw
ジャスミンさんの観光ブログでも紹介されている海賊カフェにて、
あほしてきましたw
そこの看板店員ことでなさん作の前掛け(ふんどし?)をつけて
くろさんと3人でおどってみましたw見事なシンクロです!!
こういうネタアイテムを自分で作れるのもSLならではですよね。
######################################################
それではスクリプト講座いきましょうか!!
今回ご紹介するアイテムはこれ。
ちょっとアメリカンな帽子です。
しかも、一定時間が経過すると音と回転でお知らせしてくれる
機能つきです。
個人的にはこれがあれば時間制限のあるキャンプとかで便利かな
と思って作りました。キャンプで放置して、別作業しながら
キャンプ終了時間が近づくと音でお知らせ。そして、すぐに
座りなおすと。貧乏人の知恵ですねw
ちなみに時間制限はそれぞれのキャンプで違うので
設定しなおさないとだめですけど。そこはあしからず。
ちなみに帽子じゃなくてもいいです。便利かなと思う
ものならなんでもOK。
それでは、今回のコードです。
default{
state_entry(){
state settimer;
}
}
state settimer{
touch_start(integer total_number){
if(llDetectedKey(0) == llGetOwner()){
llSay(0, "Timer Start!!");
llSetTimerEvent(10);
}
}
timer(){
llSetTimerEvent(0);
state expired;
}
}
state expired{
state_entry(){
llTargetOmega(,5*PI,1.0);
llLoopSound("PINPOOON", 1);
llSetTimerEvent(10);
}
timer(){
llStopSound();
llTargetOmega(, 0, 1.0);
llSetTimerEvent(0);
state settimer;
}
}
回を重ねるうちに徐々にコードの長さが伸びてきましたね。
でも、見た目ほど難しくありません。
半分以上はすでにやった内容ですからw大丈夫ですよ。
では、今回のコードの流れと必要事項ですです。
1. state set_timer(タイマーをセットする状態)へ移行
2. 持ち主が触ると
3. タイマーをセット
4. 設定時間が来ると
5. state expired(セットした時間が経過した状態)へ移行
6. 回転、音でお知らせ
7. 別タイマーをセット(一定時間経過後、回転と音を止めるため)
8. 設定時間が来ると
9. 回転と音を停止
10.state set_timer(タイマーをセットする状態)へ移行
といった感じです。
今回のスクリプトはstate(状態)の移行を利用しています。
これらの説明ははすでに前回やているのでここでは
簡単にどういう遷移をするかを表す図だけ
置いておきます(詳しくは第8回を参照のこと)。
今回、スクリプト講座で特に覚えてほしいのは3. 4. 7. 8. 9.です。
これは上記のスクリプトで言うと
llSetTimerEvent(10);
timer(){
}
の部分になります。llSetTimerEventの方が2.タイマーをセットするにあたり、timerの方が3.設定時間が過ぎるとにあたります。
llSetTimerは()内にこのコマンドが実行された後、何秒後にイベントを
起こすかを設定します。いまだと10秒後にお知らせ機能が働くといった
感じです。
そのイベントの内容を書くところがtimerの{}内になります。
この二つはセットだと思ってもらってかまいません。
llSetTimerEventを使うときはかならずtimerも使うことになります。
次は2.アイテムの持ち主が触るとという部分について説明します。
スクリプトではどの部分にあたるかというと
touch_start(integer total_number){
if(llDetectedKey(0) == llGetOwner()){
}
}
この部分に当たります。触れば何かが起こるというのは以前(第5回を参照のこと)にやったようにtouch_startの{}何で表現できました。しかしながら、これだと
誰が触ってもtouch_startの{}内が実行されてしまいます。
どうにかして、持ち主だけがタイマーをセットできるようにする必要が
あります。それを可能にしているのが、
if(llDetectedKey(0) == llGetOwner()){
}
この部分です。これが触った人が持ち主だったらをあらわしています。
llDetectedKey(0)がこの場合触った人のKEYを所得するコマンドに、
llGetOwner()がこのアイテムの所有者のKEYを所得するコマンドになります。
これらが同じ(==)であった場合だけ、ifの{}内を
実行することになります。そして、ifの{}内にllSetTimerEventを
入れることで持ち主だけがタイマーをセットできるようになります。
ここでKEYって何?とおもわれた方もいるでしょう。
以前にも説明したかもしれませんが、KEYとはキャラクター、
オブジェクト、テクスチャーなどがそれぞれ持っているIDのことで、
このIDはそれぞれが別のものを持っています。
次に、4.回転、音でお知らせ 9.回転、音を止めるの部分です。
これらはタイマーが切れたときに実行されるものなので
4.回転、音でお知らせの場合はstate expired内の
state_entry(){
llTargetOmega(,5*PI,1.0);
llLoopSound("PINPOOON", 1);
}
これはstate settimer内のtimerの{}内が実行された直後に実行される
ものになります。そのためsettimer内のtimerの{}内に上記の
state_entryの{}内を書いても同じです。
さて、回転と音ですが回転に関しては第3回音に関しては第8回で説明してるので省略します。
最後に、9.音と回転を止める方法ですが、state expired内の
timer(){
llStopSound();
llTargetOmega(, 0, 1.0);
}
に書き込みます。これは、state expired内で回転と音を再生した直後に新たなタイマーをセットしていることによって起こります。以下の
青字の部分ですね。
state_entry(){
llTargetOmega(,5*PI,1.0);
llLoopSound("PINPOOON", 1);
llSetTimerEvent(10);
}
ここで少しタイマーに関して補足を入れます。このスクリプトを
見るとtimer()はそれぞれのstate(状態)にひとつづつあります。
どちらのtimeの{}内が実行されるかはセットしたタイマーが
切れたときにどちらのstateにいるかに依存します。
タイマーが切れたときstate expired内にいるならstate expired内の
timer()が実行されます。
音と回転を止める方法ですが、音のとめ方は
llStopSound();
そのままです。
回転は以下のように回転速度を0にしてしまえばいいです。
llTargetOmega(, 0, 1.0);
さて、今回のスクリプト講座はいかがでしたか?
難しかったかもしれませんね。
来週はちょっと派手なものを作りますよ!!
それでは。