2008年12月13日

数字を残す方法はないでしょうか〜

二回目の投稿です〜
なかなか問題解決しないので投稿させて頂きました。
数字の付いた(テキスト)オブジェクトを装着させて、タッチすると
数字がプラスしていくというものを作成しました〜
しかしアバターから外し再度装着すると、前回の
数字はタッチするまでは残っているのですが、タッチすると
0に戻ってしまい一からの状態になってしまいます。
前回装備していた最後の数字を維持し、続けて数字を
プラスしていくのは可能なのでしょうか〜
だれか教えてください。



Posted by Tsubaki  at 21:33 │Comments(16)

この記事へのコメント
現在、数字はどんな方法で計算していますか?
もしかして装着する際などに、スクリプトをリセットしたり、数字に「0」を代入したりする処理を行っていませんでしょうか。

そうでなければ、グローバル変数に指定しておいた値はデタッチしても保管されているはずですよ。
Posted by natsunatsu at 2008年12月13日 22:32
そうですね~ 入ってるかもです~
装着したオブジェクトは、土地においているオブジェクトを
タッチすると、装着しているオブジェトの数字が変わるといった
ちょっと複雑なものを使用しています~

スクリプトは下記のものになります

integer hit = 1;
string txt;

default
{
state_entry()
{
llListen(-10,"","llGetOwnerKey()","");
}
on_rez(integer num)
{
llResetScript();
}
listen(integer channel , string name , key id , string message)
{
list LvUp = llCSV2List(message);
if (llList2String(LvUp, 0) == (string)llGetOwner())
{
if (hit < 100){
txt = (string)hit;
hit += 1;
(string)hit;
llSetText("Lv."+txt,<1.0,0.0,1.0>,1.0);
}
}
}
}

まだまだ勉強不足で、なかなか解けません~
お助けを~
Posted by Tsubaki Rau at 2008年12月13日 23:28
integer hit = 1;
string txt;

default
{
state_entry()
{
llListen(-10,"","llGetOwnerKey()","");
}
on_rez(integer num)
{
llListen(-10,"","llGetOwnerKey()","");
}
listen(integer channel , string name , key id , string message)
{
list LvUp = llCSV2List(message);
if (llList2String(LvUp, 0) == (string)llGetOwner())
{
if (hit < 100){
txt = (string)hit;
hit += 1;
(string)hit;
llSetText("Lv."+txt,<1.0,0.0,1.0>,1.0);
}
}
}
}

パッと見た感じこれでいけそうですが
Posted by さかぷんさかぷん at 2008年12月14日 00:59
なるほどリセットが入ったんですか~
助かりました~
やってみます~
これで進めます~感謝
Posted by Tsubaki Rau at 2008年12月14日 01:55
ごめんなさい 逆でした
取ったんですね~
Posted by Tsubaki Rau at 2008年12月14日 01:56
もうひとつ ヒントください
今の状態から数字を下げるいい方法は
ないでしょうか 単純にやっても
0からマイナスになるんですけど
ここの部分も今日一日やってるけど
解決できません~
Posted by Tsubaki Rau at 2008年12月14日 02:15
数字を下げた(減らした)ら、マイナスになると思うのですが・・・
マイナスにならないように減らしたい、という意味ならば、

if (llList2String(LvUp, 0) == (string)llGetOwner())
{
if (hit > 0){//★変更行
txt = (string)hit;
hit--;//★変更行
(string)hit;
llSetText("Lv."+txt,<1.0,0.0,1.0>,1.0);
}
}

これで段々減っていく処理になると思います。(最初のは、最大値Lv99までひとつずつ増加する計算でしたので)
Posted by natsunatsu at 2008年12月14日 02:56
ありがとうございました〜
まだまだ問題山積みですが
がんばりま〜す
ほんと助かりました〜

またわからなくなったら投稿させて
いただきます。
Posted by Tsubaki Rau at 2008年12月14日 12:42
またまたわからない部分発生しました〜
いろいろやってみてるんですけど
うまくいきません。
おたすけ〜

integer hit = 1;
string txt;

default
{
state_entry()
{
llListen(-10,"","llGetOwnerKey()","");
}
on_rez(integer num)
{
llListen(-10,"","llGetOwnerKey()","");
}
listen(integer channel , string name , key id , string message)
{
list LvUp = llCSV2List(message);
if (llList2String(LvUp, 0) == (string)llGetOwner())
{
if (hit < 100){
txt = (string)hit;
hit += 1;
(string)hit;
llSetText("Lv."+txt,<1.0,0.0,1.0>,1.0);
} else if (llList2String(LvDown, 0) == (string)llGetOwner()){
if (hit > 0){//★変更行
txt = (string)hit;
hit--;//★変更行
(string)hit;
llSetText("Lv."+txt,<1.0,0.0,1.0>,1.0);
}
}
}
}
}

こんな感じです
これはエラーしてます
Posted by Tsubaki Rau at 2008年12月14日 14:40
一応いい感じまでは
いけたのですが、交互に処理すると
どうしてもプラス側は1減ってから増えて、
マイナス側は1増えてから減っていく感じに
なります。
もう一息だとはおもうのですが^^;

integer hit = 1;
string txt;

default
{
state_entry()
{
llListen(-10,"","llGetOwnerKey()","");
}
on_rez(integer num)
{
llListen(-10,"","llGetOwnerKey()","");
llSetTimerEvent(30.0);
}
listen(integer channel , string name , key id , string message){

if (message == "LvUp"){
if (hit < 100){
txt = (string)hit;
hit += 1;
(string)hit;
llSetText("Lv."+txt,<1.0,0.0,1.0>,1.0);}
}
else if(message == "LvDown"){
if (hit > 0){//★変更行
txt = (string)hit;
hit--;//★変更行
(string)hit;
llSetText("Lv."+txt,<1.0,0.0,1.0>,1.0);
}
}
}
}
Posted by Tsubaki Rau at 2008年12月14日 15:25
txt = (string)hit;
hit += 1;



txt = (string)hit;
hit--;//★変更行

のように、最終的に表示する変数(ここでは txt)に値を入れた後に、hit 変数をカウントアップしたり、カウントダウンしているので、「どうしてもプラス側は1減ってから増えて、マイナス側は1増えてから減っていく感じになります」という挙動になっているのだと思われます。

単純には、上記箇所の順序を入れ替えればよいのではないでしょうか。
Posted by Hidenori Glushenko at 2008年12月14日 20:07
挙動については他の方が答えていますので割愛させて頂きまして・・・

on_rezのところに「llSetTimerEvent~」とタイマーがセットされているところが気になりました。
上記のスクリプト内にはtimerイベントがありませんので、タイマーのセットは必要ないと思います。
もしも表記していないだけで実際はtimerイベントがあるのでしたら失礼します;
Posted by natsunatsu at 2008年12月14日 21:35
なるほどです やればやるほど
混乱してます~^^;
最終はタイマーイベントは削除しました~
もうちょい先になりますが、うちのSIMに
きてください。今回の成果をみることが
できると思います
ほんと助かりました~
Posted by Tsubaki Rau at 2008年12月14日 22:31
次から次に問題が出てきます〜
下記内容でオーナーしか反応しないように
しようと思っているのですが、なかなか出来ません〜
同じ物を他の人が装着して処理すると
同時にプラス・マイナスしてしまいます。
なにかいい方法はないでしょうか〜
いろいろ試したけどだめでした〜
「//」のものは残骸です〜

integer hit = 1 ;
string txt;

default
{
state_entry()
{
llListen(-10,"","llGetOwnerKey()","");
}
on_rez(integer num)
{
llListen(-10,"","llGetOwnerKey()","");
}

listen(integer channel , string name , key id , string message){
//if (llDetectedKey(0) == llGetOwner()){
//list listMessage = llCSV2List(message);
//if (llList2String(listMessage, 0) == (string)llGetOwner()){
if (message == "LvUp"){
if(hit < 100){
hit += 1;
txt = (string)hit;
(string)hit;
llSetText("Lv."+txt,<1.0,0.0,1.0>,1.0);}
}else if (message == "LvDown"){
if(hit > 0){
hit--;
txt = (string)hit;
(string)hit;
llSetText("Lv."+txt,<1.0,0.0,1.0>,1.0);}
}
}
}
Posted by Tsubaki Rau at 2008年12月15日 19:20
(1)llListen(-10,"","llGetOwnerKey()",""); という書き方では、3番目のフィルタは全く効いていません。

3番目のパラメータには発言元のUUIDを指定してフィルタしますが、ダブルクオートで囲った "llGetOwnerKey()" という文字列を key 型に変換したものは、対象オブジェクトとして無効な UUID と判定されて、結局何もフィルタがかからない状態で llListen が実行されます。


(2)「オーナーしか反応しないように」

これは、タッチされたオブジェクトが say する情報に「誰がタッチしたのか」を付加し、listen で受け取る側では、その UUID が所有者なのかを判定するようなロジックが少なくとも必要でしょう。

同一のオブジェクトから聞こえてくる発言そのものだけでは、誰がタッチした発言なのかは判別できません。


----
そろそろこの当初の質問とは異なる内容になってきているので、一度仕切り直すなりした方が、後々このトピックを見る方にも喜ばれるかもしれません。
Posted by Hidenori Glushenko at 2008年12月15日 20:28
そうですね〜 ごめんなさい
まだ解決には至っていませんが
大変助かりました〜
がんばってみます〜
Posted by Tsubaki Rau at 2008年12月16日 13:34
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。