ソラマメブログ

2008年03月01日

walking のスクリプティング講座2(その3)

さ~ さっさと翼やってしまおう

前にも書いたけど 角度が違うだけで 後は皆同じだから 片方の翼(実際には翼の根元のボールに入れたスクリプトだけど)だけ見てみる
//
// File: Wing_L.lsl
// Date Author number of nodes
// 2007/9/9 walkinglint 34
// 2007/9/7 walkinglint 22
// 2007/9/7 walkinglint 18 (Wing_R->Wing_L)
// 2007/9/7 walkinglint 18
// 2007/9/5 walkinglint 32
// 2007/9/5 walkinglint 15 (Wing->Wing_R)
// 2007/9/2 walkinglint 15
//
rotation open_rot;
rotation close_rot;
rotation invisible_rot;
integer is_open = FALSE;
integer wing_channel = 283;
string id_str;
string open_str;
string close_str;
string visible_str;
string invisible_str;

この辺は変数の定義とか初期化

変数は定義してからじゃないと使えないんだ

まあ その方が読みやすいからいいと思うよ

というのは別の話で w

open_rot とか close_rot とかいうのは 開いた時の翼の角度と 閉じた時の翼の角度

invisible_rot というのは 翼を見えなくしている時の翼の角度

飛んでない時は見えなくしてるんだけど そのままの角度にしていたら 見えなくても クリックをブロックしてしまうので 他の人の迷惑だし 自分でも自分の翼をクリックしてしまってやっかい

角度を変えていたら多少はまし... 大きさ変えればいいのかなと試してみて うまくいかなかったな なんでだろ w

後は オブジェクト間通信のチャネルと メッセージの文字列を保持するための変数

さて 処理部分も さっさと片付けてしまおう w
default {
on_rez(integer param) {
close_rot = llEuler2Rot(<199.25 * DEG_TO_RAD, 74.55 * DEG_TO_RAD, 157.30 * DEG_TO_RAD>);
open_rot = llEuler2Rot(<107.45 * DEG_TO_RAD, 32.95 * DEG_TO_RAD, 257.45 * DEG_TO_RAD>);
invisible_rot = llEuler2Rot(<360.0 * DEG_TO_RAD, 0.0 * DEG_TO_RAD, 300.0 * DEG_TO_RAD>);
id_str = llGetOwner();
open_str = id_str + "open";
close_str = id_str + "close";
visible_str = id_str + "visible";
invisible_str = id_str + "invisible";
llListen(wing_channel, "", "", "");
}

最初に実行される場所

ここで 角度 と メッセージの文字列を設定している

角度は 編集 で翼の角度を変えながら その角度をメモして こんな風にすると設定できる ちょっと面倒だけど w

メッセージの文字列は 前に書いたように 所有者の ID を含ませるようにしてる

で wing_channel を llListen させる
    attach(key avid) {
integer status = llGetAgentInfo(llGetOwner());
if (status & AGENT_FLYING) {
llSetLinkAlpha(LINK_SET, 1.0, ALL_SIDES);
} else {
llSetLinkAlpha(LINK_SET, 0.0, ALL_SIDES);
}
}

そうそう ここは後で追加した部分だけど 装着する時に 飛んでいるかどうかで 見えるようにするかどうか変えないといけない

制御部は片方の翼に入れているので 制御部なしで 別の翼が付けられる場合があるからね

後 制御部と翼のスクリプトは別々のプリムに入ってないとだめみたいだったな そんな気がしただけ? あはは
    listen(integer channel, string name, key id_str, string message) {
if (message == open_str) {
llSetLocalRot(open_rot);
} else if (message == close_str) {
llSetLocalRot(close_rot);
} else if (message == visible_str) {
llSetLinkAlpha(LINK_SET, 1.0, ALL_SIDES);
} else if (message == invisible_str) {
llSetLinkAlpha(LINK_SET, 0.0, ALL_SIDES);
llSetLocalRot(invisible_rot);
}
}
}

さて これで最後

wing_channel にメッセージが来るとここにくる

そこでメッセージの種類を調べて それぞれのメッセージに対する実際の処理を行えばいいんだ

角度を変えるのは llSetLocalRot

見えるようにしたり見えないようにするのは llSetLinkAlpha

で OK だね

というわけで 今回は あっさり ここで お終い!!

同じカテゴリー(walking のスクリプティング講座)の記事
 プロフィール写真の表示に問題 (2009-11-30 20:55)
 ミニ太陽系 (2009-03-21 06:03)
 関数から文字列を返したら何か問題になる? (2009-03-18 18:02)
 llListFindList って型って関係ないんだったっけ (2009-03-18 14:02)
 夏時間(PDT)の実験 (2009-03-08 22:04)
 15パズルの作り方(その3) (2009-03-08 06:03)
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。