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が出てしまいます。


それと、これで変更した各テクスチャの画像位置調整はどうやってしたらよいのでしょうか?
スクリプト起動後、任意のテクスチャを選択>編集>テクスチャーを選択にチェック>編集面を選び、水平垂直を微調整
の、繰り返しでよいのでしょうか?



同じカテゴリー(スクリプト関連)の記事画像
オブジェクトのリンクとタッチで開く扉
自動チャットを止めたい
テレポートするとアニメーションが解除される
同じカテゴリー(スクリプト関連)の記事
 テクスチェンジの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 まおまお  at 06:22 │Comments(16)スクリプト関連

この記事へのコメント
if文のくくりがないのが原因じゃないでしょうか?

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
Posted by Tako★MASARU at 2009年02月16日 08:36
if文は一行だけなら、くくりはいらなかったですね(苦笑)

あとこのスクリプトで気になるのはListenが開きっぱなしですよね?
現状ではstate_entryでListen開いてますが、出来れば
タッチしてからListenを開いて、タイマーセット(30秒くらい)

listenイベントに入ったらListen解除と、timerイベントでListen解除くらいの処理はしておいた方が無難ですよ。
Posted by Tako★MASARU at 2009年02月16日 12:09
あぁ、listenイベントでタイマーリセットも忘れずに。
Posted by Tako★MASARU at 2009年02月16日 12:11
Tako★MASARUさん、ささびさん、ありがとうございます。
参考にして書き換えていきたいと思います。

Listenのタイマーリセットも追加してかけておきます^^


テクスチャの位置修正数値は、それえぞれ動かした時の水平、垂直にでている数値を入れればいいのでしょうか?

テクスチャは全てベースは同じ物(ワンポイント違い)を使っているので動かす位置情報はみな同じ数値です。
Posted by まおまお at 2009年02月16日 17:02
スクリプトを書き換えてみました。

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にして保存したところエラーメッセージが出てしまいました…
Posted by まおまお at 2009年02月16日 22:57
ささびさん、入れ違いになってしまいました><

なるほど、やっぱりややこしいのですね^^;
私も調べては見たのですがよく分からなかったので上記のようにテクスチャ自体でサイズを調整をして再UPし直しました。

成功はしたのですが、まだスクリプトが間違っているみたいで、装着状態でダイアログが出て来ませんでした。

どこがおかしいのかご指摘宜しくお願いします。
Posted by まおまお at 2009年02月16日 23:01
llSayをllOwnerSayにそのまま変えるとエラーになりますよ。

llOwnerSayの場合はチャンネルが必要ないので

llOwnerSay("チェンジャー" +mes);

ということになります。

llOwnerSayを使うということは、テクスチャ変更はオーナーのみですよね?

だったらListenのキーをNULL_KEYからllGetOwner()に変えた方が良いですよ。これだとオーナーのみの発言を聞きます。



アタッチでダイアログが出ないのは、実際に試してみないとなんとも言えないですね。出来るはずです。
Posted by Tako★MASARU at 2009年02月16日 23:07
Tako★MASARUさん

llOwnerSayではチャンネル指定はいらないのですね。
>テクスチャー変更はオーナーのみ
そうです。
NULL_KEYの文字を消してllGetOwner()に書き換えました。

が、やはりタッチしてもうまくいきません。
装着でもREZでもうまくいかないようです。

さっき上手くいっていたスクリプトに戻しても上手くいきませんでした…

上手くいっていた時のことを思い出しますと、タッチで貼り替える面以外の面にテクスチャを貼って完成させたことが原因じゃないかと思いました。
デフォルトテクスチャの状態でスクリプトを入れ、タッチするとちゃんとダイアログが出ましたので。

テクスチャを全面に貼ってからスクリプトを挿入した方がいいのでしょうか?
Posted by まおまお at 2009年02月17日 01:13
最終的に動作確認をしてこうなりました。

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の解除を記入する場所と形式があやふやでしたのでとりあえず今は入れていませんです><


いままでスクリプトは難しく苦手意識があったのですが、どうにか助けを貰いながらでも動くと面白く感じてきました^^
Posted by まおまお at 2009年02月17日 03:27
タッチした面を認識し、その面だけ画像を変更するスクリプトです。
http://pao.slmame.com/e531203.html

変更点は
 (1)llListenの位置
 (2)llListenの時間による解除
 (3)タッチした面の認識(Viewer のバージョンが1.21以降で使用できる)
 (4)画像を変更できるの権限の設定 (オーナー/誰でも)

なお、(4)の誰でも画像が変更できるというのは実用的ではないと思います。 グループや特定の人物などのほうが便利だと思います。
Posted by pao at 2009年02月17日 08:33
>llOwnerにすると、他の人へあげてもダイアログは出るものの、テクスチャーガ変わらなかったので仕方が無しにllWhisperに落ち着きました

これは他に原因があると思いますよ。

あとテクスチャを先に貼っても後で貼っても関係ないと思います。スクリプトが動かないのは、スクリプトの「実行」のチェックが外れてしまったのではないでしょうか?

スクリプトウィンドウの左下に「実行」というチェックボックスがあります。何かの拍子にチェックが外れてしまう時があります。



あと、ダイアログのListenが開きっぱなしによる弊害としては、
例えば同じオブジェクトが複数あった場合に
どれかひとつのテクスチャを変更すると他のオブジェクトの
テクスチャも同時に変更されてしまいます。

NULL_KEYの場合はさらにオブジェクトのオーナーに
関わらず、Rezされている同じオブジェクト全て
(厳密には20mくらいの範囲内)のテクスチャが変わる事になります。


なので、Listenは極力使用する時のみ開くというのが良いです。
あとタイマーをセットするのは、ダイアログを開いたけど
「無視する」を押された場合の対処です。

「無視する」を押されてしまうとイベントが発生せず、
Listenが開きっぱなしになりますので、それを防ぐために
一定時間でListenを解除した方が良いですね。
Posted by Tako★MASARU at 2009年02月17日 09:35
おっと、ささびさんが先に投稿されてましたね(苦笑)
Posted by Tako★MASARU at 2009年02月17日 09:36
ささぴさん、Tako★MASARUさん、paoさん

なるほど!大変参考になりました。
早速変更したいと思います^^

何かの拍子に実行が解除されてしまうということがあるのですね!
理由が分からず混乱してしまいました。><
Posted by まおまお at 2009年02月18日 19:24
ごめんなさい!何かエラーが出てしまいました。

handle = llListen(DIALOG_CH,"",avater,"");

↑の部分に
(11, 6) : ERROR : Name not defined within scope
のエラーが…
Posted by まおまお at 2009年02月18日 21:36
宣言されている変数の名前と実際に使用してる変数の名前の
スペルが違うだけじゃないでしょうか?

もしくは宣言文がない。

プログラムのエラーの大半がスペルミスです。
よくよく見てみてください。
Posted by Tako★MASARU at 2009年02月18日 22:05
「avatar」が「avater」になってますよwww
Posted by 麗羅 at 2009年10月09日 05:11
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。