2007年04月24日
モジュール:フェードイン・アウト(2)
fadeInOut links
先ほどのフェードイン、アウトscriptを
llMessageLinkedを用いて、汎用的に使えるようにモジュール?っぽい状態にしました。
われながら地味ですが、便利なものを作った気がするので、今後多用します。
◆地味すぎる更新なのでせめてビデオにとりました。
タッチするとフェードアウト、フェードインします。
モジュールを利用するとコードはコレだけです。
◆使い方
フェードイン・フェードアウトさせたいプリムに
新規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
ちなみに、フェードではなく透明度だけを一瞬でコントロールしたい場合は
・透明にしたい時
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を
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);
}
}
◆使い方
フェードイン・フェードアウトさせたいプリムに
新規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);している間も
モジュール側では忙しく動作しています。
別スレッドのような状態ですね。
ビデオの例のscriptでllSleep(2.0);している間も
モジュール側では忙しく動作しています。
別スレッドのような状態ですね。
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
今やりかけのものが終わったら作ってみよーかなあ♪
撮影ブースに続き、またマネさせてください(笑)
Harayokiさん、スゴイです!!!
script書いちゃうんですねー
私は、頭から煙だしながら闘ってます(笑)
よくわからず、書けない状態ですよ(・_・;)
なので尊敬です m(_ _)m
今やりかけのものが終わったら作ってみよーかなあ♪
撮影ブースに続き、またマネさせてください(笑)
Posted by Ruru at 2007年04月24日 21:39
>minaさん
わん
>Ruruさん
本業が微妙にプログラマっぽいので得意なのですが
SLではデザイナのふりをしようかと思ってます!
絶対プログラム以外のほうが面白いっす。
わん
>Ruruさん
本業が微妙にプログラマっぽいので得意なのですが
SLではデザイナのふりをしようかと思ってます!
絶対プログラム以外のほうが面白いっす。
Posted by harayoki at 2007年04月24日 21:53