2008年3月8日土曜日

llSetTimerEvent と llParcel...

起こるときは立て続けに起こるのが世の常で・・・・

Video Ball の調子があまり良くないことは前にエントリしましたが、その動きがなかなか理解できず、いろいろなところに llSay を組み込んで様子を見ていたのですが、たまーに出る、ものすごく不思議な動きだったんです。

簡単に言うと、llSetTimerEvent を 15秒に設定したのに、すぐに timer() イベントが動いちゃう、、、という現象です。

最初は自分のスクリプトを疑いましたが、、、変な分岐などもしてないし、ちょっとあれかな、と思うのは state change を行っているのですが、それでも、llDialog の次に llSetTimerEvent を 15秒にするというシンプルな処理で、すぐに timer() イベントになる、、、という動きに確信を持つようになりました。

こういうときは wiki とか jira で検索してみるのですが、wiki に同じような現象で悩んでいる、、との書き込みがありました。

http://lslwiki.net/lslwiki/wakka.php?wakka=llSetTimerEvent&show_comments=1#comments

結局、私も同じ方法 (15秒のタイマーの前に llSetTimerEvent(0.0) をおこなう) と、state から抜けるときに再度 state_exit() を使って llSetTimerEvent(0.0)をしつこくやることにしました。美しくないけど、しょうがありませんねぇ。。。

それでもう少し様子見ですが、いまのところ同様の現象は出ていないようで「やったぁ!」と思ったのですが、、、、

あれれ? ビデオ表示しているプリムで、AUTO SCALE が、、、、利いてない!!!

autoScale1191 

なおかつ、そういえば昨日お友達から LAND の MEDIA 処理が 1.19.1 で機能拡張したことを聞いたのを思い出し・・・

嫌な予感・・・

で、ビューワーの 1.18.5 で試してみると、、、
autoScale185
ううう (T.T) 同じスクリプトなのに表示ちがいます、、、

LAND の設定での AUTO SCALE は有効みたいなので、土地設定のビデオは問題ないのですが、スクリプトによる llParcelMediaCommandList からの ALIGN, TRUE の設定が 1.19 ~ では効かない、、、ということみたいです。

jira を見る限りだとバグレポートあがってないみたいだし。レポート書くしかないですかねぇ。
そうそう、それで Video Ball のスクリプトも一部修正したのですが、LAND の Media はちょっと面白くて、これまで QuickTime が扱うものだけが利用できたのですが、今度は HTML なんかも表示できるようになったみたい。

試したいなぁ、と思いましたが、この Auto Scale の確認で、、、、時間とれずw
まだ、なんか動きが怪しいので、、、ばたばたしてもしょうがないかもね。たとえば、llParcelMediaCommandList からの動画再生は本来 PLAY だけでいいのですが、なぜか LOOP をいれないと動かないとか、、、
やっぱり、、、RC (Release Candidate) ですから・・・ねぇ
スクリプトで動画を操作している方は TYPE の mime 指定の追加もお忘れなく~
http://wiki.secondlife.com/wiki/LlParcelMediaCommandList

3 件のコメント:

  1. wikiのは
    「SetTimerEvent発行したら以前のタイマーカウントはリセットされて欲しい」
    ってことですかね。
    現状だと現在のタイマーはカウントし続けるから不満だと。
    でステートとタイマーの絡みだと、
    ステート変わってもタイマーカウントはそのまま続行されますね。
    遷移先のステートにtimerイベントが無かった場合、
    timerイベントがあるステートに変わるまで待ち続けてます。
    なので元のステートに戻ってくるといきなりtimerイベントが発生したりしますな。
    すぬまさんのはこの2つ動作の複合かな。
    現象というよりそういう仕様…ですかね。

    返信削除
  2. いつも同様の動きだといいのですが、たまに発生する、、、というのが嫌なところですね。
    ダイアログ表示したときに llSetTimerEvent(15.0) を行い、Listen でダイアログからの message を受け取ったら、まず llSetTimerEvent(0.0) をしているのですが....
    なので、今は、ダイアログから message を受け取って llSetTimerEvent(0.0) を行い、state_exit するときも llSetTimerEvent(0.0) をして、さらには新しくダイアログを表示するときも、llSetTimerEvent(0.0) に続けて llSetTimerEvent(15.0) をしています・・・
    で、変な動きは今のところ発生していないようです。

    返信削除
  3. それで完璧ですのう
    不要なところでは止まるようにキッチリ書かないといけないから、
    コード中にllSetTimerEvent(0.0)が何度も出てきて美しくないのは同意です orz

    返信削除