2008年03月21日
第10回 スクリプト講座 ポーズボールを作ろう(2)
前回の講座 ポーズボールを作ろう(1)の続きになります。

さて、今回も前回と同様に座るだけでこんなポーズが簡単にとれる
ポーズボールを作っていきましょう(ポーズは別売り)。
以下、入れるだけでOKなスクリプトとその解説記事です。
読みたい方は 続きを読む を押してくださいね。
続きを読む
2008年03月15日
第10回 スクリプト講座 ポーズボールを作ろう(1)
これまでに書いてきたスクリプト講座を
読みなおして思ったこと・・・
それは・・・
こんなアイテムほしくねぇ・・・
です。
と、そんなことを思いながら
スクリプト講座第2期のモットーは
そこそこ魅力的なものってことにしようかと思います。
それでは、スクリプト講座のはじまりです~
今回作るものはタイトル通り、ポーズボールです。
ちまたには普通にあるスクリプトですけど、
内容はとても勉強になるいいものだと思います。
それでは、今回の材料は・・・
どーん!!

箱w
またこれかよって感じですけど、
これだけで十分なんだよね・・・
(スクリプトって色気ないんだよ・・・)
あとは、箱の中に使いたいポーズと、
以下のスクリプト(一番先頭の行にある"hmn-sit02-Seesaw"ってところを
"使いたいポーズ名"に変えてね)を組み込めば出来上がり。
こんな感じでかわいらしいポーズをとることができますw

(カイラスちゃんとふたりで夕日を拝む)
このポーズは::MCH::さんの物をつかわせてもらいました。
今回のスクリプトとその詳しい解説が読みたい人は
続きを読む を押してくださいね。
続きを読む
2008年03月11日
初心者用 スクリプト講座 再開します
今日はちょっとお知らせをさせてもらおうかと思います。
私は過去にBeginners Escort Clubというグループで初心者さんが
SLになじめるようにお手伝いさせてもらってました。
そのときにグループオーナーに頼まれて、
FC2ブログで初心者さんも簡単に学べるようにと
超初心者用のスクリプト講座を書いていました。
結局、講座は9回まで書いてリアルが忙しくなってしまい
中途半端に途切れる結果となっていました。利用されていた方には大変申し訳のない
ことをしてしまいました。すいません。
現在、リアルの忙しさも緩和されゆとりが持てるようになりました。
そこで、FC2ブログで書いていた記事をこちらにうつし、
時間があるときに続きを書いてみようかと思っています。
以前と同様、とっつきにくいと感じられるスクリプトのイメージを
払拭できるような楽しい講座にできればと思います。
以下に第9回までのスクリプト講座内容と記事への
リンクを貼らしていただきました。
これらの記事が初心者さんの手助けになれば幸いです。
それでは今後ともよろしくお願いします。
ぺん
*** ここから過去の講座へのリンク ***
第1回 超初心者用スクリプト講座 はじめに
第2回 超初心者用スクリプト講座 テキストを表示させてみよう
第3回 超初心者用スクリプト講座 回転させてみよう
第4回 超初心者用スクリプト講座 イスの着席位置を調整しよう
第5回 超初心者用スクリプト講座 タッチしたときに何かを実行するには?
第6回 超初心者用スクリプト講座 よく見かける state_entry ってなに?
第7回 超初心者用スクリプト講座 on_rez ってなに?
第8回 超初心者用スクリプト講座 state(状態遷移)を理解しよう、音を鳴らそう
第9回 超初心者用スクリプト講座 タイマーを使おう
それにしても、移行作業中に過去の画像いっぱいみたけど
懐かしい反面はずかしさも・・・
これとかないわ・・・
当事はなかなかとか思ってたんだけどね・・・

2007年07月05日
第9回 超初心者用スクリプト講座 タイマーを使おう
いきなりこれでどうだ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(<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回を参照のこと)。

今回、スクリプト講座で特に覚えてほしいのは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);
さて、今回のスクリプト講座はいかがでしたか?
難しかったかもしれませんね。
来週はちょっと派手なものを作りますよ!!
それでは。
2007年07月03日
第8回 超初心者用スクリプト講座 stateを使おう
先日のネタですが、われらBECの犬ことfilloさんが人魚になる
グッズをくれました~。作った本人(犬?)は人魚になることは
できずわけのわからん生命体になってました。
それをこっそり?激写。

なんだろうこれは?w
なぜ犬が人魚を作ろうかと思ったのだろうと疑問に思ったのは内緒です。
せっかくなのでみんなで着て記念撮影することに。

普通に撮ろうとしたのになぜかみかんまんこと
tacticsがど真ん中に入りハーレム状態w
しかも上半身裸で仁王立ちw
やはりみんなで同じ格好したりしてワイワイするのは楽しいですw
またやりたいですね~
###################################################
それでは、第8回スクリプト講座と参りましょうか。
今回作りたいものはサウンドボックス。クリックで音楽再生、停止が
できるというものです。で、どんなものかというと

どーん
ただの箱です。外見は好きに作ってください。
大事なのはスクリプトです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(状態)です。また、これらは開ける、閉めるという
動作で「開いている→閉じている」、「閉じている→開いている」と
いう状態の遷移がおこります。それが以下の図になります。

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

これらをスクリプトであらわしたものが以下になります。
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という音楽ファイルを
入れることになります。以下を参照してください。

最後に音楽をとめる方法ですが、以下のコマンドになります。
llStopSound();
これは特に説明要らないでしょう。
最後にこれら2つのコマンドのどこに組み込むかですが、状態は
あくまでもその状態を表します。再生状態なら再生をしている状態。
停止しているなら停止をしている状態。それぞれの状態で
触るのは何ボタンでしょう?再生している状態なら停止ボタンを。
停止しているなら再生ボタンをということになるでしょう。
これを踏まえてスクリプトを見ると理解が進むと思います。
さて、今回も長くなってしまったなぁとおもいつつ、
まぁ仕方ないかとも思いつつw
なかなか自分でもこれといってぐっとくる面白いものって
つくれませんねぇ。だれかネタくれ~
それでは、また次回w