エビマヨ60分クッキング第8回~センサー編その2~

2008.06.20.21:00

 

こんばんはエビです。(6月4日番組分)

今回テーマは前回に引き続き「センサー」です。
前回はllSensorRepeatがメインでしたが、今回は別のセンサーとしても使えるスクリプトを紹介します^^

~スクリプト~

===================================================
1:Light(float flag)
2:{
3: llSetPrimitiveParams([ 25, ALL_SIDES,flag]);
4:}

5:default
6:{
7: state_entry()
8: {
9: llSetAlpha(0.0,ALL_SIDES);
10: llSetPrimitiveParams([ PRIM_PHANTOM, TRUE]);
11: llVolumeDetect(TRUE);

12: Light(0.0);
13: }

14: collision_start(integer num)
15: {
16: if (llDetectedType(0) & AGENT)
17: {
18: Light(0.4);
19: }
20: }

21: collision_end(integer num)
22: {
23: if (llDetectedType(0) & AGENT)
24: {
25: Light(0.0);
26: }
27: }
28:}
===================================================

結構あっさりとしたスクリプトになっています。
このスクリプトは、一つのプリムに埋め込むことで成り立ちます。
このスクリプトが入ったオブジェクトを地面に敷き詰めると、
冒頭の画像のような、透明オブジェクトにアバターが重なった瞬間に、光るような装置になっています。

今回のメインとなる文は、イベント文で
14行と21行の
collision_start(integer num)
collision_end(integer num)
です。

このイベントはオブジェクトにぶつかった(重なった)ときに起こるものですが、
collision_startはオブジェクトにぶつかった瞬間に、
collision_endはオブジェクトから離れた瞬間に
それぞれのイベント以下の{}内の命令が発動します。

それぞれのイベントでは同じ命令が書かれてありますが、
16行、23行は
ぶつかったのは何かを判定しています。
llDetectedType(0)はぶつかったものの種類を割り出し、
& AGENTでアバターのみを判定します。
前回のブログにある、センサー判定の種類でAGENT,ACTIVE,PASSIVE,SCRIPTEDを挙げましたが
これと同じです。

18行、25行では
Light(数字)とありますが、
これは1~4行目のユーザー関数を呼び出しています。

ユーザー関数とは、自分で作れる命令文で
毎回毎回同じ命令をさせるのに、スクリプトの中に同じ文を書かなければならない場合があります。
毎回書くと、スクリプトが長くなってしまったり、見づらくなってしまうので
これをまとめて、一つの命令で実行させてしまったほうが楽な場合もあります。
この、まとめて一つの命令にしたものをユーザー関数と言います。

今回作ったユーザー関数は、
3行目の
llSetPrimitiveParams([ 25, ALL_SIDES,flag])
で、
この長い命令を、Light(float flag)と短い文で表わすようにしています。

Light(float flag)のflagは、
llSetPrimitiveParams([ 25, ALL_SIDES,flag])のflagに作用して

18行目のLight(0.4)のように命令すると
llSetPrimitiveParams([ 25, ALL_SIDES,0.4])
と同じことをしてくれます。

さて、llSetPrimitiveParams([ 25, ALL_SIDES,flag])
という長ったらしい一文ですが

これは光(グロウ)の制御です。
25という数値がグロウを制御させる値で、SLビューアのバージョンが上がればPRIM_GLOWというものに置き変えられるはずです。

[ 25, ALL_SIDES,flag]で一つの設定値で、ALL_SIDESはプリムの全部の面にたいして命令をします。

flagは光の強さで0.0~1.0までです。1.0が光全開になります。

これと同じような文が10行目にありますよね。
llSetPrimitiveParams([ PRIM_PHANTOM, TRUE]);

これは、オブジェクトをファントムにさせる文で、TRUEだとファントム化、FALSEだとファントムではなくなります。

このllSetPrimitiveParamsはプリムの属性を制御できる命令文で、
()の中の値を変えることで、プリムの大きさ、形(箱、球、円柱等)などを制御できます。

通常collisionでのイベントは、ファントムオブジェクトでは発生しません。
今回オブジェクトに重なることで光るようにしましたので、ファントムにする必要がありました。
そこで、
11行目の
llVolumeDetect(TRUE)

ファントムでもイベント発生させるようにしています。
FALSEだと、ファントムではイベント発生しなくなります。

~応用編~

応用ってことでもないのですがw
上の画像のように、歩くと両脇のライトが点灯するということもできます。
これは、
親プリムをセンサー(collision反応用)として透明化し、
子プリムとして、両脇にボールを配置したものです。
このとき
スクリプトの3行目を
llSetLinkPrimitiveParams(LINK_ALL_CHILDREN,[ 25, ALL_SIDES,flag])
と変更します。

LinkとLINK_ALL_CHILDRENが挿入されていますね。
これで、子プリムに対して光制御ができます。
LINK_ALL_CHILDRENは子プリムすべてに対して制御するという意味です。

もし、5個のプリムで構成されたオブジェクトで
子プリムの2番と4番に対して光制御する場合は、
llSetLinkPrimitiveParams(2,[ 25, ALL_SIDES,flag]);
llSetLinkPrimitiveParams(4,[ 25, ALL_SIDES,flag]);
と二つ入れてください。

ただ2を光らせてから、4をひからせるので
同時点灯せずに、ちょとタイムラグが出ます><

~さて次回~
センサー編はひとまず終了ってことで、
またネタ考えなきゃ~~~

投稿者:メルティングドッツ

 

この記事にコメントする

名前(ニックネーム可)とメールアドレスは必ず入力してください.
メールアドレスは管理者にのみ通知されます.
投稿に時間がかかる場合がございますが、投稿ボタンは2回押さないでください.




ログイン情報を記憶しますか?