第9回 超初心者用スクリプト講座 タイマーを使おう

ぺん

2007年07月05日 22:25


こんばんは~。ぺんです。

いきなりこれでどうだ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);



さて、今回のスクリプト講座はいかがでしたか?
難しかったかもしれませんね。

来週はちょっと派手なものを作りますよ!!
それでは。
超初心者用 スクリプト講座