2009年9月27日日曜日

[LSL] シンプル ダンス アニメーション HUD :)

おひとりさま用 ダンス アニメーション HUD のお勉強用サンプルをかいてみました。

ものすごくシンプルな、HUD にあるダンスアニメーションをタッチするたびに切り替える、というものです。
ただ、アニメーションの操作(パーミッションやアニメーション名の取得)も重要ですが、スクリプトとかプログラミングのテクニックのお話しのほうも重要かもしれません。
HUD をタッチするたびにダンスを切り替える、、、というのは for 文による繰り返し処理に近いものがあります。こちらのブログの記事にもひさしぶりにスクリプトネタを書きましたが、複数のページをもつダイアログの処理も同じ考えかもしれません。

繰り返し処理の際にカウントする変数をうまく使って、1番目だったら、とか2だったら、というような数の指定を直接しない、、、ということですね。

MLDU (多人数高機能ダンスマシン?) などはすでに1つのプリムで何十ものスクリプト ファイルの連携で、何十人もの人とダンスを踊るものですが、スクリプト作成の最初の最初は以下のような 「おひとりさまダンスマシーン」 から出発するのでしょうね。
「おひとりさま」で HUD でしか使わない、という前提のダンス HUD のサンプルは以下のようになるのかな。

integer numOfAnims = 0; //HUDの中のアニメ数をいれる変数
string nowDancing = "";  //踊っているダンス名をいれる変数
integer danceIndex = 0; //何番目のダンスかをいれる変数(インデックス)

default{
    attach(key id){
        if(id!=NULL_KEY){ //NULL_KEYでなければ装着、NULL_KEYは取り外し
            danceIndex = 0; //インデックスを0に
            llSetText("",<1.0,1.0,1.0>,1.0); //HUDのテキストをクリア
            //attach イベントで取得した key を使ってパーミッションリクエスト
            llRequestPermissions(id,PERMISSION_TRIGGER_ANIMATION);
            //アニメーションの数を取得
            numOfAnims = llGetInventoryNumber(INVENTORY_ANIMATION);
            if(numOfAnims==0){ //アニメーションがないとき
                llOwnerSay("アニメーションがありません~。");
            }else{ //アニメーションがあったら
                llOwnerSay((string)numOfAnims+"個のダンスを使えます~。");
                llSetText("Dance!",<1.0,1.0,1.0>,1.0);
            }
        }else{
            if(nowDancing!=""){ //ストップするアニメーションがないときのエラー回避
                llStopAnimation(nowDancing);
            }
        }
    }
    state_entry(){
        llSay(0, "Hello, Avatar!");
    }
    run_time_permissions(integer perm){ //別注参照~とっても重要!
        if(perm & PERMISSION_TRIGGER_ANIMATION){ //暗黙の許可をもらう
            llOwnerSay(llKey2Name(llGetPermissionsKey())+" さん、タッチでダンススタート、さらにタッチで次のダンス、止めるときははずしてね。");
        }
        if(numOfAnims==0){ //アニメーションが無いときのメッセージ
            llOwnerSay("でも、その前にアニメーションをいれてね。");
        }
   }
   touch_start(integer total_number){
       if(numOfAnims>0){ //アニメーションがあるときだけタッチに反応
           if(nowDancing!=""){ //今踊ってるダンスをとめます。踊ってなければスルー 
               llStopAnimation(nowDancing);
           }
           if(danceIndex>=numOfAnims){ //インデックスがアニメ数以上のときは0に
               danceIndex = 0;
           }
           // HUD のインベントリから danceIndex 番目のアニメーション名を取得
           string s = llGetInventoryName(INVENTORY_ANIMATION,danceIndex);
           llStartAnimation(s); //アニメーション開始
           nowDancing = s;     //現在のアニメーション名として登録
           llSetText(s+" ("+(string)(danceIndex+1)+"/"+(string)numOfAnims+")",<1.0,1.0,1.0>,1.0);
           danceIndex++;
      }else{  //アニメーションがないのにタッチして踊ろうとしたときの対応
           llOwnerSay("アニメーションが入ってないから踊れないよ。");
      }
   }
}

これで何個アニメーションが HUD に入っていてもソースを変えることなくダンスを踊ることができます。
HUD の装着・取り外しで HUD 内のアニメの数が更新されます。

別注参照は、llRequestPermissions を使った場合は run_time_permissions イベントを使うことです。というのも、HUD のような装着や Sit などによるアバターへのリンクをしたプリム内スクリプトからのパーミッションリクエストは「暗黙の許可」を行いますので、run_time_permissions で本来ダイアログで表示する「許可するかどうか」の結果を確認しなくても llStartAnimation や llStopAnimation は動く(使える)のですが、それを知ってやっているのであればいいのですが、、、知らないと知っているのでは違いますからね。
暗黙の許可についてはこちらなどを参考に。

上記サンプル、そこそこエラー処理もしてますし、List を使わないのでメモリー不足になることもありません。

ただ、、MLDU などは細かいところでちょっと違う処理をしていたりします。そのあたりは過去のブログにチラチラ書いていたりします。
以上、おひとりさまダンス HUD のサンプルでした~。

2009年9月25日金曜日

[LSL] llDialog - ダイアログの切り替え

ひさしぶりのスクリプト ネタになります。
こちらのブログにも「ダイアログ」「切り替え」「12以上」(ボタンですね)といったキーワードで検索されて閲覧されている方がそこそこいらっしゃいました。

MLDU(ダンス マシン)は llDialog を使った複数ページ(ダイアログ)でさまざまな設定やダンス アニメーションの開始を指示します。ある程度ダイアログの切り替えに関しての知識やテクニックがたまったかもしれませんので、ちょっとご紹介します。

複数ページ ダイアログの作り方

単純な複数ページのダイアログについて考えてみます。
といっても、メニュー>サブメニュー ではなく、最終的にボタンとなって表示されるアイテムが 12 個以上ある場合の、複数ページを使って表示するシンプルなものについてです。

スクリプトって、いろいろな書き方ができるので、このやり方だけではないことを前提させてくださいね。

以下のようなリストにある要素をボタンとして表示して、次のページ、次のページで順番に表示させるようなものを考えてみます。

list buttonList = [“1”,”2”,“3”,”4”,“5”,”6”,“7”,”8”,“9”,”10”,“11”,”12”,“13”,”14”];

最低でも必要なボタンは [“次のページ”]ですよね。できれば [“前のページ”] ボタンもほしいところ。私はなるべくダイアログの [無視する] ボタンを押されたくないので、だいたいダイアログを閉じるための [“閉じる”] ボタンをいれるクセがついています。

そうすると、1つのダイアログに表示できる要素数は 9 つ (12-3) となります。
この 9 つのリスト要素をどう処理するかになります。

いろいろやり方あるけど、いきついたのは「ページ管理」です。

現在のページ数をおぼえておき、それらから表示するボタンを選ぶ方法ですが、実装方法としては for 文をまわす方法とリスト操作する方法があります。for をまわすよりリスト操作のほうが比較的軽い処理になりますが、for 文には for 文のよさもあったりします。
以下サンプル。わかりやすいようにしたため、実用的ではない「お勉強スクリプト」です。たとえば実際は list base = [“前のページ”,”閉じる”,”次のページ”] とは書きませんね。
それぞれの要素を string prev = “前のページ”; と宣言して、list にいれたほうが、あとあと if 文の比較のときに string prev を比較すればいいですから。。。と、、いうことを前提に。

list bList = ["1","2","3","4","5","6","7","8","9","10","11","12","13","14"];
list base = ["前のページ","閉じる","次のページ"];
integer dChan = –10; //ダイアログ用チャンネル(本当はランダムにしたほうが実用的)
integer dHandle;
integer page = 0;
integer pageMax;
integer pageItem = 9; //これも通常は初期化処理で計算かな。
key avatar = "";
string dialogMsg = "次、前のページでダイアログがかわります。";
float timeout = 20.0;

default{
      state_entry(){
            page = 0;
            avatar = "";
      }

      touch_start(integer total_number){
            if(avatar == ""){  //page管理しているので一時点に1人だけ対応するため
                  page = 0;
                  integer len = llGetListLength(bList);
                  pageMax = len/pageItem;
                  if(len%pageItem == 0){  //pageItem数で割り切れているときは
                        pageMax--;          //page数が1つ多いのでマイナス1
                  }
                  avatar = llDetectedKey(0);
                  dHandle = llListen(dChan, "", avatar, "");
                  llListenControl(dHandle,TRUE);
                  llDialog(avatar,dialogMsg,base+llList2List(bList, page*pageItem, page*pageItem+pageItem-1), dChan);  //開始と終了の計算
                  llSetTimerEvent(timeout);  //無視ボタンなどを押されたときの対応のため
            }
      }

      listen(integer chan, string name, key id, string msg){
            llSetTimerEvent(0.0);
            if(msg == "閉じる"){
                  llListenControl(dChan, FALSE);
                  llListenRemove(dHandle);
                  avatar = "";
                  jump exit;
            }else if(msg == "次のページ"){
                  page++;
                  if(page > pageMax){ //ページ数が最大数より大きくなったら 0 に戻す
                        page = 0;
                  }
            }else if(msg == "前のページ"){ 
                  page--;
                  if(page < 0){ //ページ数がマイナスになったら最大ぺージ数に
                        page = pageMax;
                  }
            }else if(msg == "1"){
                  //実際は個別の処理です。受け取ったメッセージ(ボタンのラベル)をそのまま
                  //llSayのように使うのなら、本来条件分岐の必要はありません。
                  llSay(0,msg+" が押されました。");
            }else if(msg == "2"){
                  llOwnerSay(msg+" が押されました。");
            }else if(msg == "3"){
                  llInstantMessage(id,msg+" が押されました。");
            } // この繰り返しをボタン分かく場合もあります。
            llDialog(avatar,dialogMsg,base+llList2List(bList, page*pageItem, page*pageItem+pageItem-1), dChan);  //開始と終了の計算
            llSetTimerEvent(timeout);
            @exit; //閉じるの場合のとび先はここ
      }

      timer(){
            llSetTimerEvent(0.0);
            llListenControl(dChan, FALSE);
            llListenRemove(dHandle);
            avatar = "";
            page = 0;
      }
}

[追記 2009.09.27] 上記ソースコード、そのままコピペするとダブルクォーテーション(“)がおかしくてコンパイルエラーになります。ちょっと大きめの斜めってる “ を変更してください、、、。回避方法はおいおい探します。。。
[追記 2009.10.26] “ を replace してみました。今度はだいじょうぶです。

これで以下のようなダイアログがでて、次のページ、前のページで切り替わります。

dialog1    dialog2

これがダイアログ操作の基本形ですね。
ご参考になれば。

2009年9月24日木曜日

Yaz Rockett New Song!

5ヶ月ぶりに Yaz さんが曲を ACIDplanet にアップしました~。
acid

It’s Devide Day by Day (radio edit) です。
なんと、ジャンルは House ですよ!軽快なリズムと軽やかなヴォーカル。が、最初のイントロで一瞬「ぶ~たたたん?」と思ってしまったのは。。。(笑

先日の Black Sonic 2009 での Yaz さんの Pic~
Yaz@BS2009

Yaz@BS2009 Yaz@BS2009

ACID にまだまだアップしてない Yaz Rockett の曲もあり。怒涛の ACID アップ期待したいところです。

2009年9月20日日曜日

MLDU ベンダー再設置しました

[更新] 現在 MLDU4 は marketplace.secondlife.com での販売となります。Studio4D さんにベンダー設置しておりません。

Studio4Dの改装にともないしばらく MLDU4 のベンダーがありませんでしたが、やっと再設置しました~。
今度は入り口正面右側のもったいないくらいの位置に棚を作ってもらいました。
Live さん、ありがとう~。

New Vendors

で、新装開店 & もっと多くの人にダンスを楽しんでいただきたく 6 人用フルバージョンの MLDU4 をお値段を 600L$ から 400L$ にしてみました。
と、、、いっても実は MLDU は個人のお客様よりクラブ オーナーのお客様が多いので売れ筋は 15人用もしくは 30人用なんですけど^^

まずは 1L$ のお試し版をお使いいただき、機能にご納得いただけたらその上のフルバージョンをご購入くださいませ。
ちょうど中間にあるベンダーはノートだけの配布になりますが、MLDU4 がどんな機能をもっているかを知ることができると思います。

MLDU_Pop1c
Try MLDU and Enjoy SL dancing!

2009年9月16日水曜日

BLACK SONIC 2009 もうすぐ。

9月19日(土)、20日(日)と BLACK SONIC 2009 開催されますね。ブラソニゼロナインっていったほうがいいのかな。
もちろん、Yaz Rockett も参加ということで楽しみではあるのですが、今回は PrinPrin SIM の Une Bague(通称「ゆんぬ」)で日夜踊り狂っている(?)Prin Dancers (プリン ダンス部)も、とあるアーティストのバックダンサーで出演することになっています。アバターはアンリアです。

UR Dancers
(注)この衣装での出演ではございません。。。 

今回のブラソニで私はダンスを操作するダンス マスターではありませんが(でも、ダンス部 部長 (笑))、本番で「手のひら汗かく~」ほどの緊張にダンス マスターが包まれるのはいうまでもありません。(ダンス部員・ダンサーは Position に Sit してダンス マスターからの招待ダイアログで「はい」を答えるだけですからwww)

まして、、、これだけすごい movie 見ると、すごいイベントに参加するかも、と実感。

まぁ、日本のインワールドではそうそうたるメンバーが参加しますからね。
がんばれ副部長 ^^)b

2009年9月15日火曜日

The STREET3 !

The STREET3
Studio4D の新作「The STREET3」シリーズ発売です!
クオリティかなり上がってます。ループの切れ目を意識させない、あとそれぞれのダンスにちゃんとした「特徴」があって、Henmations や Sine Wave と比べても全く遜色がない、ワールドワイドレベルのダンス アニメーションといっても過言ではないはず!
さらに、、、Live さんやっちゃいましたね。以下の動画!

というか・・・脱帽です。特に終わりの部分のカット/シーンは・・・まねできまんせん><
Studio4D … どこまで進化するのか楽しみです。
MLDU の棚~作って~w 結構問い合わせあるんですよ^^ S4D にベンダーないけど~というw
ダンス好きは OEDO City の S4D に GO!!!

2009年9月6日日曜日

セカンドライフ ダンス アニメーション ショップ 巡り 3

まだまだ知らないところ、、、いっぱいありますね。
YouTube でセカンドライフを使ったマイケル ジャクソンの「スリラー」ダンスって昔からあるのですが、スリラーダンスのワンシーン動画とか、フルサイズのスリラー トリビュート動画とかを見ていました。


こちらはスリラーじゃないのですが、ひさしぶりの Pancaketitz さんの動画なので^^

それで気がついたのですが、、、これら、スリラー PV のワンシーンのアニメーション、みんな同じの使ってる、、、とw そこで SL ビューワーの検索を使って調べてみると、、、行ったことのないダンス アニメーション ショップを発見!(ちなみに、YouTube で見ていたスリラーダンスは Sine Wave の Easy さん作であることが判明 ^^;)
そのお店の名前は 「MINISTRY OF MOTION MOCAP ANIMATIONS」です。
Nomasha
SL ビューワーの検索の結果リストに出てきた理由は、、、これ!
Billy Jean
ダンスアニメーションの種類もかなり豊富です。まだ全部試しきれていません。また、ギターやドラムなどのアニメーションもあります。こんな大きなダンスアニメーションショップなぜ今まで知らなかったのかな?
MINISTRY OF MOTION
 MINISTRY OF MOTION
こちらのショップの STREET/HIP-HOP 系のダンスがかなりツボでした。
ヘッドスピンはものすごくきれいで、ダンサーのレベルが高いのかな、と思わせる出来です。
まだ行ったことのない人はぜひ~。
以前のショップご紹介ページリンクはこちら。
ダンス アニメーション ショップ巡り 1
ダンス アニメーション ショップ巡り 2

2009年9月3日木曜日

Studio4D 新装開店!

new Studio4D!

mika さんmoto さんmimiy さんの巨大なポスターが目を引く新しい Studio4D が新装開店です!

そしてこの新装開店と同時に Studio4D も COPY 可のダンスの販売を開始しました。ダンスボール紛失事故が多いなか、値段をある程度おさえたこの COPY 可のダンスはうれしいですね。

Studio4D starts to provide 2 modes!

お値段はぜひ Studio4D Dance Animations 現地でご確認を!!!

Studio4D ブログの新装開店情報

MLDU は新しい置き場ができたら、また継続して置かせてもらう予定です~。今しばらくお待ちください~。

で、、、さっき落ちてからインできませ~ん ><

[追記] 2009.09.03 1:49am
あ、、、、これ、もしかしてトラブルかも。
20090903stat
この時間に 10,813 のオンラインは少ないですね。。。
こういうときはグリッド ステータスを調べてみるわけで。

http://status.secondlifegrid.net/2009/09/02/post735/

全部ではないですが、多くの SIM が落ちてますね~。
ブログの時間は米国サンフランシスコの時間です。世界時計とかで日本時間とサンフランシスコの時間の違いを確認してくださいね。
でも、最近ずっと調子悪かったです。そんなに重い SIM じゃなくても 5m 歩いては止まり、金縛りになり、、、でした。

一瞬、なんどインにトライしても (Alt ちゃんでも) できなかったのでハードウェア BAN? とか思っちゃいましたが、、、(もちろん、心当たりありませんがw