ソラマメブログ
< 2024年04月 >
S M T W T F S
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        
Mail

2007年04月24日

モジュール:フェードイン・アウト(2)

fadeInOut links
モジュール:フェードイン・アウト(2)

先ほどのフェードイン、アウトscript
llMessageLinkedを用いて、汎用的に使えるようにモジュール?っぽい状態にしました。
われながら地味ですが、便利なものを作った気がするので、今後多用します。

◆地味すぎる更新なのでせめてビデオにとりました。
タッチするとフェードアウト、フェードインします。

モジュールを利用するとコードはコレだけです。
default{
touch_start(integer num){
llMessageLinked(LINK_SET,0,"harayoki.setFade 0.0 0.4",NULL_KEY);
llSleep(2.0);
llMessageLinked(LINK_SET,0,"harayoki.setFade 1.0 0.05",NULL_KEY);
}
}


◆使い方
フェードイン・フェードアウトさせたいプリムに
モジュール:フェードイン・アウト(2)
新規scriptを"FadeInOut Module"など適当な名前で作り、
記事の最後にあるソースをドババっとコピペします。
こちらのscriptは利用する際、中身を編集しません
利用者が組むスクリプトは別の名前で作ります。
(この画像の場合はmainという名前)

あとはmainのscriptからフェードアウト・フェードインしたい場所で
呪文のように
・フェードインしたい時
llMessageLinked(LINK_SET,0,"harayoki.setFade 1.0 0.8",NULL_KEY);
・フェードアウトしたい時
llMessageLinked(LINK_SET,0,"harayoki.setFade 0.0 0.8",NULL_KEY);
と書きます。
これでなだらかに透明度が変化するはずです。

書式の説明をすると、
harayoki.setFadeがフェード開始命令
1,0とか0,0になってる2番目が、行き着く透明度の値
0.8になってる3番目の値が
フェードのスピード(0.0~1.0)です。値が大きいほど早いです。
ただし0にしてはいけません。

LINK_SETの意味が理解できる人は、
もっと高度な使い方ができるでしょう。
ここでは説明しませんが。


◆ FadeInOut Module
// FadeInOut Module ver 1.02
// programed by harayoki
// 2007/4/24 release
// 2007/5/1 bug fix for side_num and module sysytem.
integer debug = FALSE;
Trace(string s){
if(debug){
llOwnerSay(s);
}
}
float FPS = 15.0;
float _interval;
float _targetAlpha;
float _alpha;
float _ratio = 0.1;
integer LINK_NUM = LINK_SET;
integer FACE_NUM = ALL_SIDES;
key owner;
string _callback;

Init(){
owner = llGetOwner();
_interval = 1.0 / FPS;
//if(debug) Test();
}
Test(){
llMessageLinked(LINK_NUM,0,"harayoki.setAlpha 0.0",NULL_KEY);
llMessageLinked(LINK_NUM,0,"harayoki.setFade 1.0 0.2",NULL_KEY);
}
ChangeAlpha(){
float da = (_targetAlpha - _alpha);
if(llFabs(da)<0.05){
_alpha = _targetAlpha;
llSetTimerEvent(0);
CallBack();
}else{
_alpha += da*_ratio;
}
llSetLinkAlpha(LINK_NUM,_alpha,FACE_NUM);
}
AlphaCommand(string s){
list arr = llParseString2List(s,[" "],[""]);
string command = llToLower(llList2String(arr,0));
if(command=="harayoki.setalpha"){
Trace(command+" "+(string)_targetAlpha);
_targetAlpha = llList2Float(arr,1);
llSetTimerEvent(0);
llSetLinkAlpha(LINK_NUM,_targetAlpha,FACE_NUM);
}else if(command=="harayoki.setfade"){
_targetAlpha = llList2Float(arr,1);
_ratio = llList2Float(arr,2);
_callback = llList2String(arr,3);
if(_ratio==0) _ratio = 0.01;//default
Trace(command+" "+(string)_targetAlpha+" "+(string)_ratio+" "+_callback);
_alpha = llGetAlpha(FACE_NUM);
if(_alpha>1) _alpha = 1;// some time 6!!
llSetTimerEvent(_interval);
}
}
CallBack(){
llMessageLinked(LINK_NUM,0,_callback,NULL_KEY);
}
default{
state_entry(){
Init();
}
on_rez(integer num){
llResetScript();
}
link_message(integer sender_num,integer alpha,string str,key id){
Trace("link_message fader");
AlphaCommand(str);
}
timer(){
ChangeAlpha();
}
}


ちなみに、フェードではなく透明度だけを一瞬でコントロールしたい場合は
・透明にしたい時
llMessageLinked(LINK_NUM,0,"harayoki.setAlpha 0.0",NULL_KEY);
・不透明にしたい時
llMessageLinked(LINK_NUM,0,"harayoki.setAlpha 1.0",NULL_KEY);
・透明度50%にしたい時。
llMessageLinked(LINK_NUM,0,"harayoki.setAlpha 0.5",NULL_KEY);
と書けます。
まあこれはllSetLinkAlphaでも同じですけど…オマケです。
いやむしろその方がメッセージ経由で無いので早いはず。

時間的なラグが無ければmessageのやり取りを使ったscriptigは
この例のようにOOP的構成にできるので楽なのですが…。
惜しい。
追記
ビデオの例のscriptでllSleep(2.0);している間も
モジュール側では忙しく動作しています
別スレッドのような状態ですね。

同じカテゴリー(フェードIN/OUT)の記事
 DL:フェードIN&OUTモジュール(4) (2007-05-15 06:23)
 バグ修正:フェードIN&OUTモジュール(3) (2007-05-01 19:14)
Posted by harayoki at 21:00│Comments(3)フェードIN/OUT
この記事へのトラックバック
hid Voom|渡邉英徳です。 坂口トモユキさんの作品「裏Home」の展示実験...
「裏Home」展示実験開始【メタバースの建築|Architecture in Metaverse】at 2007年10月22日 09:43
この記事へのコメント
さきほどはドウモです。
笑いますた。。
また色々作って遊びたいですねー
Posted by mina jun at 2007年04月24日 21:33
こんばんわ( ´∀`)

Harayokiさん、スゴイです!!!
script書いちゃうんですねー
私は、頭から煙だしながら闘ってます(笑)
よくわからず、書けない状態ですよ(・_・;)
なので尊敬です m(_ _)m

今やりかけのものが終わったら作ってみよーかなあ♪
撮影ブースに続き、またマネさせてください(笑)
Posted by Ruru at 2007年04月24日 21:39
>minaさん
わん

>Ruruさん
本業が微妙にプログラマっぽいので得意なのですが
SLではデザイナのふりをしようかと思ってます!
絶対プログラム以外のほうが面白いっす。
Posted by harayoki at 2007年04月24日 21:53
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。