2009年08月09日

ダイアログでリンクしたオブジェのテクスを変更

こんばんはm(_ _)m

親プリムをタッチしてダイアログを出して
子のプリムもテクスを変更できるようにしたいのですが・・
どうしてもうまくいきません。.+:。ヨヨヨョョョ(´;ω;`)´-ω-`)´_ _`)ョョョヨヨヨ゚.+:。
どうか助けてください。

下記は自前で組んだ物ですが・・・うまく子プリムはかわってくれないのです
助けてください・・よろしくお願いです

親プリム↓

list Texture =
[
"ASH01", "ASH02"
];
integer Handle;

default
{
touch_start(integer total_number)
{
llMessageLinked( LINK_SET, 0, "", NULL_KEY);
{
Handle = llListen(123, "", "", "");
llDialog(llDetectedKey(0), "Magic square texture", Texture, 123);
}
}

listen(integer channel, string name, key id, string message)
{
if(message == "ASH01")
{
llSetTexture("ASH01",ALL_SIDES);
llMessageLinked( LINK_SET, 0, "", NULL_KEY);
}

else if(message == "ASH02")
{
   llSetTexture("ASH02",ALL_SIDES);
llMessageLinked( LINK_SET, 0, "", NULL_KEY);
   }
llListenRemove(Handle);
}
}


子プリム↓
default {
link_message(integer sender_num, integer num, string msg, key id){
llSetTexture("ASH02",ALL_SIDES);
}
}

※なんか凄く間違ってたり抜けたりしてるとはおもうのですが・・・
小プリムの方のスクリの指定もおかしいのかもしれないし・・・
たりないのかもしれませんし・・・・
お手上げです。・゚゚・(>д<;)・゚゚・。
助けて頂ければ幸いです 
よろしくおねがいします



同じカテゴリー(スクリプト関連)の記事画像
オブジェクトのリンクとタッチで開く扉
自動チャットを止めたい
テレポートするとアニメーションが解除される
同じカテゴリー(スクリプト関連)の記事
 テクスチェンジのHUDについて (2015-07-01 04:51)
 モール用のプリムカウンターを探しています (2014-11-29 20:09)
 連続するアニメーションの処理 (2014-08-24 03:23)
 オブジェクトの上にフローティングテキストを出す。 (2014-08-22 16:46)
 チャットログの盗聴について (2014-02-03 03:43)
 椅子に座った後で位置調整できるスクリプト (2013-03-24 16:37)

Posted by Philotes  at 18:51 │Comments(8)スクリプト関連

この記事へのコメント
リンクメッセージを使うよりも、llSetLinkTextureで子プリムも一気に変更するのでは駄目でしょうか?

list Texture =
[
"ASH01", "ASH02"
];
integer Handle;

default
{
touch_start(integer total_number){
Handle = llListen(123, "", "", "");
llDialog(llDetectedKey(0), "Magic square texture", Texture, 123);
llSetTimerEvent(30.0);
}

listen(integer channel, string name, key id, string message){
llListenRemove(Handle);
llSetTimerEvent(0.0);
if(llGetInventoryType(message)==INVENTORY_TEXTURE){
llSetLinkTexture(LINK_SET,message,ALL_SIDES);
}
}

timer(){
llSetTimerEvent(0.0);
llListenRemove(Handle);
llWhisper(0,"タイムアウトしました。もう一度タッチして下さい。");
}

}


//解説
「llSetTimerEvent」
Listenイベントが発生しなかった際にハンドルがそのまま放置されてしまいます。
タイマーを設定して、一定時間ダイアログの選択が無かったら、ハンドルを戻す処理をしています。


「llGetInventoryType(message)==INVENTORY_TEXTURE」
メッセージで受け取った名前のテクスチャーが存在しているかチェックしています。

「llSetLinkTexture(LINK_SET,message,ALL_SIDES)」
LINK_SET全てに「message」の名前のテクスチャーを設定します。

もしも一部の子プリムのみにテクスチャーを張りたい場合は、もっと別の方法が必要になりますが、リンクしてる全てに張りたいのでしたらこれでOKだと思います。
Posted by natsu at 2009年08月09日 19:33
ありがとうございます。
凄く勉強になりました・・m(_ _)m
・・ついでといっては何段ですが・・・
親プリムと違うテクスを小プリムに指定する事はできるのでしょうか?
もしよろしければおしえてくださいなm(_ _)m
Posted by Philotes at 2009年08月09日 20:53
単純に子プリム側に対応するテクスチャが入っていないのでは?
以下のようにすれば同期を取って代わりますよ。
(これは前提として、ダイアログのボタン=テクスチャ名とした場合です。ボタンと実際に使うテクスチャ名が違う場合は、最初の時のようにmessageの内容をif文で判断して、対応するテクスチャ名をセットして下さい。)

<親プリム側>
list Texture =
[
"ASH01", "ASH02"
];
integer Handle;

default
{
touch_start(integer total_number)
{
Handle = llListen(123, "", "", "");
llDialog(llDetectedKey(0), "Magic square texture", Texture, 123);
}

listen(integer channel, string name, key id, string message)
{
llSetTexture(message,ALL_SIDES);
llMessageLinked( LINK_SET, 0, message, NULL_KEY);
llListenRemove(Handle);
}
}

<子プリム側>
default {
link_message(integer sender_num, integer num, string msg, key id){
llSetTexture(msg,ALL_SIDES);
}
}
この場合は、親プリムにも子プリムにも同じテクスチャをコンテンツの中に入れておかないと駄目です。
子プリム側は違うテクスチャにしたいのでしたら、if文でmsg内容を判断して、対応するテクスチャをセットするようにすればできるでしょう。

llSetLinkTextureを使って、以下のようにすれば、親プリムだけにスクリプトとテクスチャを入れておけば両方とも変わります。

list Texture =
[
"ASH01", "ASH02"
];
integer Handle;

default
{
touch_start(integer total_number)
{
Handle = llListen(123, "", "", "");
llDialog(llDetectedKey(0), "Magic square texture", Texture, 123);
}

listen(integer channel, string name, key id, string message)
{
llSetTexture(message,ALL_SIDES);
llSetLinkTexture(LINK_SET,message,ALL_SIDES);
llListenRemove(Handle);
}
}

このケースでも、message内容をif文で判断して、子プリム側にセットしたいテクスチャを変えてllSetLinkTextureでセットしてあげればできると思います。
その場合は、親プリムの中に、子プリム用のテクスチャも入れておかないといけません。

とりあえず現状から、もっとも簡単な方法として書きました。
後は、先の人が書いたように、もう少し配慮した方が良い部分はあると思いますが。
Posted by Gonbe ShanGonbe Shan at 2009年08月10日 02:32
テクスチャの名前ではなく、UUIDを使うようにすれば、
テクスチャそのものをいれなくてもよくなりますよね
Posted by you Xiao at 2009年08月10日 09:35
子プリムと親プリムに別のテクスチャを設定するならば、llSetLinkTextureでLINK_SETの部分をそれぞれ変更することで出来ますよ。

if(llGetInventoryType(message)==INVENTORY_TEXTURE){
//LINK_ROOT(親プリム)に「message」テクスチャを適応
llSetLinkTexture(LINK_ROOT,message,ALL_SIDES);
}
if(llGetInventoryType(message+"_c")==INVENTORY_TEXTURE){
llSetLinkTexture(LINK_ALL_CHILDREN,message+"_c",ALL_SIDES);
//LINK_ALL_CHILDREN(子プリム全て)に「message_c」テクスチャを適応
}

上の場合、例えば「ASH01」を親プリムに張る場合、子プリム用に「ASH01_c」というテクスチャを用意してあげれば良いわけです。

もしも子プリムのいくつかにまた別々のテクスチャを張りたいという場合には、今度は親と子だけでは判別が出来ませんので、(もっと複雑になりますが)for文を使って一個ずつ子プリムを判別して、Textureを選んで張るような形になると思います。

使いそうな関数などを書いておきますね。このあたりを勉強すれば出来るはずです。

・for文
・llGetNumberOfPrims (全体のプリム数を返す)
・llGetLinkName (プリムを区別する際に使用)
・llGetInventoryType (テクスチャの存在確認に使用)
・llSetLinkTexture (テクスチャを張るのに使用)

ただ、上記のような記述は初心者の方には難しいかと思いますので、Gonbe Shanさんの言うように子プリム内部でリンクメッセージを受け取り、それぞれがテクスチャを適応する形にすると、楽なのかも知れません。

でも子プリムが何個になるかわかりませんが、スクリプトは数が多くなるとそれだけ容量を食ってしまうこともお忘れなく^^;
Posted by natsu at 2009年08月10日 09:45
ささぴさんの投稿に気づかずにあげてしまいました^^;

ご指摘ありがとうございます、テクスチャ確認を張る直前にしたのは、何かの拍子にテクスチャを消してしまったりした際にstate_entryでは対応できないかなと思ったからです。
でもそれだったらchangeイベントでテクスチャ確認した方が効率よさそうでしたね・・・。

子プリム側のスクリプトは、それぞれリスト(テクスチャ名)を書き換えると読み込むスクリプトの数が増えてしまうので、同じ名前のまま流用すると良いかと思います。

コンパイルするたびにスクリプトは別のコードとして認識される・・・はずだったと思いますので、同じスクリプトを入れて流用できれば、多少は読み込みの負荷が軽減されるかと。
Posted by natsu at 2009年08月10日 09:55
こんばんは~
対応が遅れて申し訳ありません。
いろいろ丁寧に対応していただき
感謝ですぅ
やっぱ奥は深いですね!
すくりぷとって
頑張って勉強していきます
ありがとうでしたm(_ _)m
Posted by Philotes at 2009年08月11日 18:45
natsuさんの書き込みに補足ですが、子スクリプトをコピーするときは、コードをコピーアンドペーストするのではなく、保存したスクリプトを一度インベントリにコピーして、別の子プリムにドラッグで入れましょう。
もしくは、子プリムが同じ形状だったりするなら、リンクする前にスクリプトの入った子プリムごとコピーしてもOKです。

そうすると、スクリプトがいくつあっても、同じSIM内では同じメモリが参照され、サーバーのリソースを無駄に消費しません。


逆に、子プリムに新しいスクリプトを作ってはコードを貼り付けて保存・・・を繰り返すと、そのスクリプトの数だけメモリが消費されます。

短いスクリプトでも、チリも積もれば・・・です。
Posted by RoyalTurkey Marksetin at 2009年08月13日 13:20
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。