2009年02月16日
ダイアログで指定面のみテクスチャを変更
タッチでダイアログが出て特定面のテクスチャを選択変更できるスクリプトを教えてください。
元スクリプトはとあるサイトから頂いてきたものです。
保存するとエラーが出るのですが、どこが悪いのか調べても私にはよく分かりませんでした。
基本テクスチャから別の3種類のテクスチャを立体の0番面で選択変更させたいのです。
integer DIALOG_CH = 1024;
default
{
state_entry()
{
llListen(DIALOG_CH,"",NULL_KEY,"");
}
touch_start(integer num)
{
key avatar = llDetectedKey(0);
llDialog(avatar,"Select image",["01","02","03","04";],DIALOG_CH);
}
listen(integer chan, string name, key id, string mes)
{
llSay(0,"Dialog Message="+mes);
if ( mes == "01") llSetTexture("001",0);
else if (mes == "02") llSetTexture("002",0);
else if (mes == "03") llSetTexture("003",0);
else if (mes == "04") llSetTexture("004",0);
}
}
この元になったスクリプトをそのまま無変更で張り付けて保存してみてもSyntax errorが出てしまいます。
それと、これで変更した各テクスチャの画像位置調整はどうやってしたらよいのでしょうか?
スクリプト起動後、任意のテクスチャを選択>編集>テクスチャーを選択にチェック>編集面を選び、水平垂直を微調整
の、繰り返しでよいのでしょうか?
元スクリプトはとあるサイトから頂いてきたものです。
保存するとエラーが出るのですが、どこが悪いのか調べても私にはよく分かりませんでした。
基本テクスチャから別の3種類のテクスチャを立体の0番面で選択変更させたいのです。
integer DIALOG_CH = 1024;
default
{
state_entry()
{
llListen(DIALOG_CH,"",NULL_KEY,"");
}
touch_start(integer num)
{
key avatar = llDetectedKey(0);
llDialog(avatar,"Select image",["01","02","03","04";],DIALOG_CH);
}
listen(integer chan, string name, key id, string mes)
{
llSay(0,"Dialog Message="+mes);
if ( mes == "01") llSetTexture("001",0);
else if (mes == "02") llSetTexture("002",0);
else if (mes == "03") llSetTexture("003",0);
else if (mes == "04") llSetTexture("004",0);
}
}
この元になったスクリプトをそのまま無変更で張り付けて保存してみてもSyntax errorが出てしまいます。
それと、これで変更した各テクスチャの画像位置調整はどうやってしたらよいのでしょうか?
スクリプト起動後、任意のテクスチャを選択>編集>テクスチャーを選択にチェック>編集面を選び、水平垂直を微調整
の、繰り返しでよいのでしょうか?
テクスチェンジのHUDについて
モール用のプリムカウンターを探しています
連続するアニメーションの処理
オブジェクトの上にフローティングテキストを出す。
チャットログの盗聴について
椅子に座った後で位置調整できるスクリプト
モール用のプリムカウンターを探しています
連続するアニメーションの処理
オブジェクトの上にフローティングテキストを出す。
チャットログの盗聴について
椅子に座った後で位置調整できるスクリプト
if ( mes == "01") {llSetTexture("001",0);}
else if (mes == "02") {llSetTexture("002",0);}
else if (mes == "03"){ llSetTexture("003",0);}
else if (mes == "04"){ llSetTexture("004",0);}
エラーメッセージが出た時にカーソルがどの位置にあるのか見てみてください。カーソル近辺にエラーになる原因があるはずです。
あとテクスチャの位置とか繰り返しは
llSetPrimitiveParams という関数で指定出来ますよ。この関数は編集画面のほとんどの設定を指定出来ます。
下記URLの PRIM_TEXTURE の項目を参照してみてください。
http://wiki.secondlife.com/wiki/LlSetPrimitiveParams
あとこのスクリプトで気になるのはListenが開きっぱなしですよね?
現状ではstate_entryでListen開いてますが、出来れば
タッチしてからListenを開いて、タイマーセット(30秒くらい)
listenイベントに入ったらListen解除と、timerイベントでListen解除くらいの処理はしておいた方が無難ですよ。
参考にして書き換えていきたいと思います。
Listenのタイマーリセットも追加してかけておきます^^
テクスチャの位置修正数値は、それえぞれ動かした時の水平、垂直にでている数値を入れればいいのでしょうか?
テクスチャは全てベースは同じ物(ワンポイント違い)を使っているので動かす位置情報はみな同じ数値です。
integer DIALOG_CH = 1024;
default
{
state_entry()
{
llListen(DIALOG_CH,"",NULL_KEY,"");
}
touch_start(integer num)
{
key avatar = llDetectedKey(0);
llDialog(avatar,"Select image",["TYPE_01","TYPE_02","TYPE_03","TYPE_04"],DIALOG_CH);
llSetTimerEvent(30.0);
}
listen(integer chan, string name, key id, string mes)
{
llSay(0,"チェンジャー" +mes);
if (mes == "TYPE_01") llSetTexture("TYPE_01",0);
else if (mes == "TYPE_02") llSetTexture("TYPE_02",0);
else if (mes == "TYPE_03") llSetTexture("TYPE_03",0);
else if (mes == "TYPE_04") llSetTexture("TYPE_04",0);
}
}
テクスチャの調整は面倒そうでしたので、テクスチャ自体の方で調整することにしました。
これでエラーは起こらなかったのですが、装着させてオブジェをクリックしてもダイアログが出ませんでした。
逆にREZした状態でクリックしたら希望通りのダイアログ発生&テクスチャチェンジ出来ました。
自身に装着の場合はスクリプトが違ってくるのでしょうか?
それとチェンジするときのllSayを所持者だけに聞こえるよう、llOwnerSayにして保存したところエラーメッセージが出てしまいました…
なるほど、やっぱりややこしいのですね^^;
私も調べては見たのですがよく分からなかったので上記のようにテクスチャ自体でサイズを調整をして再UPし直しました。
成功はしたのですが、まだスクリプトが間違っているみたいで、装着状態でダイアログが出て来ませんでした。
どこがおかしいのかご指摘宜しくお願いします。
llOwnerSayの場合はチャンネルが必要ないので
llOwnerSay("チェンジャー" +mes);
ということになります。
llOwnerSayを使うということは、テクスチャ変更はオーナーのみですよね?
だったらListenのキーをNULL_KEYからllGetOwner()に変えた方が良いですよ。これだとオーナーのみの発言を聞きます。
アタッチでダイアログが出ないのは、実際に試してみないとなんとも言えないですね。出来るはずです。
llOwnerSayではチャンネル指定はいらないのですね。
>テクスチャー変更はオーナーのみ
そうです。
NULL_KEYの文字を消してllGetOwner()に書き換えました。
が、やはりタッチしてもうまくいきません。
装着でもREZでもうまくいかないようです。
さっき上手くいっていたスクリプトに戻しても上手くいきませんでした…
上手くいっていた時のことを思い出しますと、タッチで貼り替える面以外の面にテクスチャを貼って完成させたことが原因じゃないかと思いました。
デフォルトテクスチャの状態でスクリプトを入れ、タッチするとちゃんとダイアログが出ましたので。
テクスチャを全面に貼ってからスクリプトを挿入した方がいいのでしょうか?
integer DIALOG_CH = 2048;
default
{
state_entry()
{
llListen(DIALOG_CH,"",NULL_KEY,"");
}
touch_start(integer num)
{
key avatar = llDetectedKey(0);
llDialog(avatar,"なににする?",["A","B","C","D"],DIALOG_CH);
}
listen(integer chan, string name, key id, string mes)
{
llWhisper(0,"choice = " +mes);
if ( mes == "A") llSetTexture("TYPE_01",0);
else if (mes == "B") llSetTexture("TYPE_02",0);
else if (mes == "C") llSetTexture("TYPE_03",0);
else if (mes == "D") llSetTexture("TYPE_04",0);
}
}
llOwnerにすると、他の人へあげてもダイアログは出るものの、テクスチャーガ変わらなかったので仕方が無しにllWhisperに落ち着きました。
それとListenとTimerの解除を記入する場所と形式があやふやでしたのでとりあえず今は入れていませんです><
いままでスクリプトは難しく苦手意識があったのですが、どうにか助けを貰いながらでも動くと面白く感じてきました^^
http://pao.slmame.com/e531203.html
変更点は
(1)llListenの位置
(2)llListenの時間による解除
(3)タッチした面の認識(Viewer のバージョンが1.21以降で使用できる)
(4)画像を変更できるの権限の設定 (オーナー/誰でも)
なお、(4)の誰でも画像が変更できるというのは実用的ではないと思います。 グループや特定の人物などのほうが便利だと思います。
これは他に原因があると思いますよ。
あとテクスチャを先に貼っても後で貼っても関係ないと思います。スクリプトが動かないのは、スクリプトの「実行」のチェックが外れてしまったのではないでしょうか?
スクリプトウィンドウの左下に「実行」というチェックボックスがあります。何かの拍子にチェックが外れてしまう時があります。
あと、ダイアログのListenが開きっぱなしによる弊害としては、
例えば同じオブジェクトが複数あった場合に
どれかひとつのテクスチャを変更すると他のオブジェクトの
テクスチャも同時に変更されてしまいます。
NULL_KEYの場合はさらにオブジェクトのオーナーに
関わらず、Rezされている同じオブジェクト全て
(厳密には20mくらいの範囲内)のテクスチャが変わる事になります。
なので、Listenは極力使用する時のみ開くというのが良いです。
あとタイマーをセットするのは、ダイアログを開いたけど
「無視する」を押された場合の対処です。
「無視する」を押されてしまうとイベントが発生せず、
Listenが開きっぱなしになりますので、それを防ぐために
一定時間でListenを解除した方が良いですね。
なるほど!大変参考になりました。
早速変更したいと思います^^
何かの拍子に実行が解除されてしまうということがあるのですね!
理由が分からず混乱してしまいました。><
handle = llListen(DIALOG_CH,"",avater,"");
↑の部分に
(11, 6) : ERROR : Name not defined within scope
のエラーが…
スペルが違うだけじゃないでしょうか?
もしくは宣言文がない。
プログラムのエラーの大半がスペルミスです。
よくよく見てみてください。