2007年11月21日

トースターのスクリプトと作り方、教えてください。


いろんな所においてあるあの、タッチでパンが入って、しばらくすると焦げて出てくるトースターを作りたいのですが、
スクリプトがよくわかりません。教えてください。



Posted by itapo  at 20:34 │Comments(4)TrackBack(0)スクリプト関連

この記事へのトラックバックURL

http://oshiete.slmame.com/t73458

この記事へのコメント
私はみたことがないですが、どういうものですか?

LSL関連の日本語解説書が2冊でてますし、
以下のサイト等をみてある程度理解すれば、
よほど特殊な動作をさせていないかぎりわかると思いますよ。

http://miz.slmame.com/
http://www.aipiro.com/
http://rpgstats.com/wiki/index.php?title=Ja:Main_Page

そもそもプログラミングがって話なら、自分で作るより買ったほうが遥かに楽かと。

関数的には、
llSetTexture
llSetAlpha
llSetTimerEvent
lSetPos
あたりを使かえば、タッチして一定時間後に、パンを下から上に移動させて、できそうだけど。
あとはそれにあわせて適当に音を追加するだけじゃないかな。

むしろ日本人の初心者OKで、教えてくれそうな人が結構いるSandBox探していったほうがいいかと、これ書いてる間に思いました。
Posted by とおりすがり at 2007年11月22日 02:40
トースターですか。私も実物は見たことがないのですが、まずオブジェクトがどういった構成かわからないのですが、想像すると
・トースター本体:ボックスプリム
・つまみ部分(パンをトースターに入れる横のつまみ):形は任意
・パン:ボックスプリムを薄くしたもの
があると思われます。
テクスチャは本体部分とパンの焼ける前と後が必要でしょう。
さらに、「チン」となるサウンドが必要でしょう(チンなのかガシャなのか・・・?)

実際のスクリプトですが、プリム間通信(llMessageLinkedとlink_message)でそれぞれのプリムに処理をさせなければなりません。ということはルートプリムのスクリプト、パン・つまみのスクリプトが必要になります。

ここで疑問。
・トースターには常に焼ける前のパンが入っているのか?
・焼けたパンはどーなるのか?

たとえば、
・最初はトースターのみでタッチするとパンが入る。
・パンが入っている状態でタッチするとトーストする。
・焼いている最中はタッチしても何もしない。
・できあがったパンが入っている状態でタッチすると、パンが無くなる(最初の状態に戻る)

というような処理をしたいのであれば、ステートを分けるか、タッチ部分で状態フラグをチェックして処理を分岐するようなことをしなければなりません。また、最初にパンを透明にしておく&焼けたパンを取ったら透明にするような処理も必要になります。
さらに、タイマーが起動中はタッチしても何もしないようにする必要がありますので、同じ状態フラグを設定・参照する必要があるでしょう。

分かりやすく状態フラグを持つとすると、
状態フラグが
 0の時:パンが入っていない状態
 1の時:焼く前のパンが入っている状態
 2の時:焼いている状態(パンは見えない。凝るなら上からのぞき込めばパンの耳が見えるし、中のヒーターがオレンジ色になっているでしょう)
 3の時:焼けたパンがでている状態
となります。

フローチャート(処理の流れ)
※オーナーでないと操作できない。誰でも操作できるようにするならUUIDの取得・比較はいらない

【ルートプリム用】
<メイン部分>
1.オーナーUUIDを取得(llGetOwner)

<タッチ部分>(touch_start)
1.タッチした人のUUIDを取得(llDetectedKey)
2.タッチした人がオーナーであれば処理続行(if)
3-1.状態フラグが0ならば(if)
3-2.小プリムにリンクメッセージ1を発行(llMessageLinked)
3-3.状態フラグを1にする
4-1.状態フラグが1ならば(else if)
4-2.小プリムにリンクメッセージ2を発行(llMessageLinked)
4-3.タイマー起動(llSetTimerEvent)
4-4.状態フラグを2にする
5-1.状態フラグが3ならば(else if)
5-2.小プリムにメッセージ0を発行(llMessageLinked)
5-3.状態フラグを0にする
(状態フラグが2の時は処理をしないので記述無し)

<タイマー部分>(timer)
1.小プリムにリンクメッセージ3を発行(llMessageLinked)
2.状態フラグを3にする
3.「チン」と音を鳴らす(llPlaySound)

【小プリム用】
<メイン部分>
1.パンの場合は自身を透明にする(llSetAlpha)
2.最初の位置を取得(llGetLocalPos)

<リンクメッセージ受信部分>(link_message)
1-1.リンクメッセージ0を受信したとき(if)
1-2.自身を透明にする(パンのみ)(llSetAlpha)
1-3.焼ける前のテクスチャを設定(パンのみ)(llSetTexture)
1-4.自身を最初の位置に戻す(llSetPos)
2-1.リンクメッセージ1を受信したとき(else if)
2-2.パンの場合は自身を透明から見えるようにする(パンのみ)(llSetAlpha)
3-1.リンクメッセージ2を受信したとき(else if)
3-2.自身の位置を動かす(最初の位置-下がる分)(llSetPos)
4-1.焼けた後のテクスチャを設定(パンのみ)(llSetTexture)
4-2.自身を最初の位置に戻す(llSetPos)

※ルートプリム用、小プリム用ともREZされたら、スクリプトのリセットが必要です。

さらに、ルートプリムのタッチ部分で、それぞれの状態の時にオブジェクトの上に「パンを入れて」とか「今焼いてるよ」みたいなメッセージを表示することもできます(llSetText)。
ヒーター部分も作るのであれば小プリム用のスクリプトでリンクメッセージ2を受信したらオレンジ色にして、リンクメッセージ3を受信したら元の色にもどすとか(llSetColorまたはllSetTexture)、湯気(煙?)をパーティクル(llParticleSystem)で表現してもいいとおもいます。
Posted by sasapy at 2007年11月22日 14:56
ありがとうございます!
ためしてみたら、ちゃんとできました。
チン!のサウンドを探したんですが、なかったのでとりあえず
日テレのあのキャラクターのやつをいれてみました。
ほんとうにありがとうございました。
Posted by itapo johin at 2007年11月22日 18:14
itapoさん
よかったですねぇ。
どういったものが希望だったのがわからなかったので、てきとーに書いてみたのですが・・・。
Posted by ささぴささぴ at 2007年11月23日 11:09