セカンドライフスクリプト講座 by Beginners Supporter

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

第9回セカンドライフスクリプト講座 タイマーを使おう

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

いきなりこれでどうだw

lec9_001.jpg


ジャスミンさんの観光ブログでも紹介されている海賊カフェにて、
あほしてきましたw

そこの看板店員ことでなさん作の前掛け(ふんどし?)をつけて
くろさんと3人でおどってみましたw見事なシンクロです!!

こういうネタアイテムを自分で作れるのもSLならではですよね。

######################################################

それではスクリプト講座いきましょうか!!

今回ご紹介するアイテムはこれ。

lec9_002.jpg


ちょっとアメリカンな帽子です。
しかも、一定時間が経過すると音と回転でお知らせしてくれる
機能つきです。

個人的にはこれがあれば時間制限のあるキャンプとかで便利かな
と思って作りました。キャンプで放置して、別作業しながら
キャンプ終了時間が近づくと音でお知らせ。そして、すぐに
座りなおすと。貧乏人の知恵ですね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(<0,0,1>,5*PI,1.0);
    llLoopSound("PINPOOON", 1);
    llSetTimerEvent(10);
  }

  timer(){
    llStopSound();
    llTargetOmega(<0,0,0>, 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回を参照のこと)。

lec9_state.jpg


今回、スクリプト講座で特に覚えてほしいのは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(<0,0,1>,5*PI,1.0);
  llLoopSound("PINPOOON", 1);
}


これはstate settimer内のtimerの{}内が実行された直後に実行される
ものになります。そのためsettimer内のtimerの{}内に上記の
state_entryの{}内を書いても同じです。

さて、回転と音ですが回転に関しては第3回音に関しては第8回で説明してるので省略します。

最後に、9.音と回転を止める方法ですが、state expired内の

timer(){
  llStopSound();
  llTargetOmega(<0,0,0>, 0, 1.0);
}


に書き込みます。これは、state expired内で回転と音を再生した直後に新たなタイマーをセットしていることによって起こります。以下の
青字の部分ですね。

state_entry(){
  llTargetOmega(<0,0,1>,5*PI,1.0);
  llLoopSound("PINPOOON", 1);
  llSetTimerEvent(10);
}


ここで少しタイマーに関して補足を入れます。このスクリプトを
見るとtimer()はそれぞれのstate(状態)にひとつづつあります。
どちらのtimeの{}内が実行されるかはセットしたタイマーが
切れたときにどちらのstateにいるかに依存します。
タイマーが切れたときstate expired内にいるならstate expired内の
timer()が実行されます。

音と回転を止める方法ですが、音のとめ方は

llStopSound();



そのままです。
回転は以下のように回転速度を0にしてしまえばいいです。

llTargetOmega(<0,0,0>, 0, 1.0);



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

来週はちょっと派手なものを作りますよ!!
それでは。
スポンサーサイト

第8回セカンドライフスクリプト講座 state(状態遷移)を使おう, 音を鳴らそう

こんばんは。ペンです。
先日のネタですが、われらBECの犬ことfilloさんが人魚になる
グッズをくれました~。作った本人(犬?)は人魚になることは
できずわけのわからん生命体になってました。
それをこっそり?激写。

lec8_001.jpg


なんだろうこれは?w
なぜ犬が人魚を作ろうかと思ったのだろうと疑問に思ったのは内緒です。

せっかくなのでみんなで着て記念撮影することに。

lec8_002.jpg


普通に撮ろうとしたのになぜかみかんまんこと
tacticsがど真ん中に入りハーレム状態w
しかも上半身裸で仁王立ちw

やはりみんなで同じ格好したりしてワイワイするのは楽しいですw
またやりたいですね~

###################################################

それでは、第8回スクリプト講座と参りましょうか。

今回作りたいものはサウンドボックス。クリックで音楽再生、停止が
できるというものです。で、どんなものかというと

lec8_003.jpg


どーん

ただの箱です。外見は好きに作ってください。
大事なのはスクリプトですw外見作るの面倒やったんやろと
思った人。 そのとおりw

前回の講座で宣言したように、ネタアイテム作りたかったんですが
普通のアイテムになってしまいました。悔しいw

それでは今回使うスクリプトに登場してもらいましょう。

default{
  touch_start(integer total_number){
    llSay(0, "Music start");
    llLoopSound("lapping_seagulls_01", 1);
    state play;
  }
}

state play{
  touch_start(integer total_number){
    llSay(0, "Music stop");
    llStopSound();
    state stop;
  }
}

state stop{
  touch_start(integer total_number){
    llSay(0, "Music start");
    llLoopSound("lapping_seagulls_01", 1);
    state play;
  }
}



今回のスクリプト講座で覚えてほしいのは

1. stateの使い方
2. サウンドの出し方、消し方

になります。

まずは1.stateの使い方について説明したいと思います。
今後使う機会が多くなると思うので、しっかりマスターしましょう。
では、始めにstateってなにって思った方もいると思うので簡単に
説明します。

stateとは状態のことを表します。たとえばドアがあるとします、
これには主に二つのstate(状態)があります。ひとつは、
開いているというstate(状態)、もうひとつは閉じているという
state(状態)です。また、これらは開ける、閉めるという
動作で「開いている→閉じている」、「閉じている→開いている」と
いう状態の遷移がおこります。それが以下の図になります。

state_door.jpg


それでは、今回作るサウンドボックスの場合はどんな
図になるでしょう?状態が遷移する引き金は誰かが触ったらという
ことにして考えてみてください。
答えは以下です。

state_player.jpg


これらをスクリプトであらわしたものが以下になります。

default{
  touch_start(integer total_number){
    state play;
  }
}

state play{
  touch_start(integer total_number){
    state stop;
  }
}

state stop{
  touch_start(integer total_number){
    state play;
  }
}



これをさらに分解して

default{

}

state play{

}

state stop{

}


ここから考えてみましょう。さて、これらは一体何を表すのでしょう?
これらが先ほど説明したstate(状態)です。一番上にあるのが
default。defalutはスクリプトが実行される際に一番最初に入る
state(状態)
です。他二つは再生状態、停止状態を表します。
これらはstate play, state stopで表されます。
stateの名前はスクリプトを書く人が独自に決定することができます。
たとえばドアの場合ではstate open, state closeとするといいでしょう。

これに触ること状態が移動するようにしたものが以下のものに
なります。

default{
  touch_start(integer total_number){
    state play;
  }
}

state play{
  touch_start(integer total_number){
    state stop;
  }
}

state stop{
  touch_start(integer total_number){
    state play;
  }
}


スクリプトの流れを説明すると、まずスクリプトが実行されると
defaultに入るのは上記のとおりです。この状態で誰かが
触るのを待ちます。これはdefaultの{}内にあるtouch_startが
担当します。ここで、誰かが触るとstate playに移行します。
他のstateに移行するためには state stateの名前; を利用します。
後は同様でstate playで誰かが触るのを待って(state playの{}内
にあるtouch_startがこれを担当)、触られればstate stopへ
移行。state stopの状態で触られればstate playへ移行することに
なります。後は、触られることでstate play, state stopを
行き来することになります。図で現すとこんな感じ。

しかしながら、これでは状態が移行するだけで
特に何も起こりません。そこで、2. サウンドの出し方、消し方
が必要になります。まずサウンドを出すコマンドですが

llLoopSound("lapping_seagulls_01", 1);



になります。ただ、このコマンドはループ再生をするコマンドに
なります。どの音楽ファイルを使うかは""内で指定してください。
現状ではlapping_seagulls_01という音楽ファイルが実行されます。
次に音量を0~1で指定します。上記のスクリプトでは1になっています。
これが最大音量を表します。

しかしながら、ここで注意してほしいことがあります。
スクリプトにファイル名を記入したからといってそれだけで
音楽が再生されるわけではありません。このスクリプトを入れる
オブジェクトに再生したい音楽ファイルを入れる必要があります。
ここではオブジェクトにlapping_seagulls_01という音楽ファイルを
入れることになります。以下を参照してください。

lec8_004.jpg


最後に音楽をとめる方法ですが、以下のコマンドになります。

llStopSound();


これは特に説明要らないでしょう。

最後にこれら2つのコマンドのどこに組み込むかですが、状態は
あくまでもその状態を表します。再生状態なら再生をしている状態。
停止しているなら停止をしている状態。それぞれの状態で
触るのは何ボタンでしょう?再生している状態なら停止ボタンを。
停止しているなら再生ボタンをということになるでしょう。
これを踏まえてスクリプトを見ると理解が進むと思います。

さて、今回も長くなってしまったなぁとおもいつつ、
まぁ仕方ないかとも思いつつw
なかなか自分でもこれといってぐっとくる面白いものって
つくれませんねぇ。だれかネタくれ~

それでは、また次回w

第7回セカンドライフスクリプト講座 出したら実行 on_rez について

こんにちは。ペンです。

ここ数日、ほしいスキンへの道のりがやたらと遠く
キャンプへ行く気もどんどんと薄れていっています。
1日がんばっても150とかだし。友人には電気代のほうが
高くつくんちゃうとか言われるしw(実際そうかも)
まだ、2500もためないといかんし。

というわけで、商品を発売して
少しでもこの道のりを短くしてやろうと
画策しました。売れるかどうかわからんけど…
商品情報は次回のブログにでも書きま~すw


####################################################

さて、第7回セカンドライフスクリプト講座と参りましょうかw

まずは前回のスクリプト講座の終いにした疑問について思い出して
もらいましょう。

どうすればオブジェクトを在庫目録から出すたびに
実行されるようなスクリプトを作ることができるのでしょう?


これが今回のスクリプト講座の目玉です。

それではまず以下のスクリプトをみてください。

default{
  state_entry(){
    llSay(0, "Hello, Avatar!");
  }

  touch_start(integer total_number){
    llSay(0, "Touched.");
  }

  on_rez(integer i){
    llResetScript();
  }
}


内容は前回にやったNew Scriptの内容とほぼ同じです。違いは

on_rez(integer i){
llResetScript();
}

の部分がたされたことです。これこそが今回の要点になります。
on_rezはこのスクリプトを含むオブジェクトを在庫目録から出した際に
{}内のコマンドを実行するというもの
です。

この場合だとオブジェクトを出した際にllResetScriptが実行されます。
では、llResetScriptとはなんでしょう?

llResetScriptとは字のとおりスクリプトをリセットするコマンドです。

ここで思い出してください。state_entryの{}内はどういったときに
実行されましたか?そうです、スクリプトが生成されたとき、または
リセットされたときです。ここではこのリセットが引き金になって
state_entryの{}内が実行されます。

要約すると上記のスクリプトは
- オブジェクトが在庫目録から出されたときに
- スクリプトをリセットすることによって
- state_entry内を実行
- Hello, Avator!と叫ぶ

と、まぁこんな感じです。

ここまで読んで、オブジェクトを出したときにon_rezの{}内が
実行されるならリセットせずにそこにllSay(0,"Hello,Avator!")を
書けばいいのでは?と考えたひとノ
あなたはいいセンスしてますw

以下のスクリプトを見てください。
実行すると結果は上記のものと全く同じになります。

default{
  state_entry(){
    llSay(0, "Hello, Avatar!");
  }

  touch_start(integer total_number){
    llSay(0, "Touched.");
  }

  on_rez(integer i){
    llSay(0, "Hello, Avatar!");
  }
}


では、何がちがうのでしょう?
実行の流れです。

この場合リセットは行われないのでstate_entryの{}内は
オブジェクトを出しても実行されません。しかしながら、on_rezの{}内は
実行されるためオブジェクトはHello,Avator!と叫ぶことになります。

要約すると
- オブジェクトが在庫目録から出されたときに
- Hello, Avator!と叫ぶ
となります。

こちらの方が簡単でしたね。今は実行結果が同じなので
どちらを使ってもかまいません。好きなほうを選んでくださいw

しかしながら、この2つのスクリプトには
大きな違いがあります。なんでしょう?
そうです、リセットするかしないかです。
これは将来的に大きな違いとなってきます。
しかしながら、詳しく話すにはまだ少し早いかと思うので
もう少し回を重ねてからお話しできたらと思います。
振りだけでごめんなさいw

ここ2回ほど形式ばってしまって面白いものを作ろうという
目標から外れてしまいました。写真もないし・・・
読んでて楽しくないよねぇ。たぶん。

というわけで、次回は何か面白い(いらんもの)を作りたいと思いますw
それでは。
次のページ

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。