ソラマメブログ
アクセスカウンタ
読者登録
メールアドレスを入力して登録する事で、このブログの新着エントリーをメールでお届けいたします。 解除は→こちら
現在の読者数 1人
プロフィール
rinsui Hax
rinsui Hax
大阪生まれ大阪市在住。 幼稚園時の「将来なりたいのは?」・・・忍者。 2000年の思わぬ運命激変により仕事人生からセミリタイヤしマンガ・小説・映画・ギターに浸かる隠遁生活へ。 長年、映画の個人制作願望を燻ぶらしていたが、SL(セカンドライフ)へ参入しマシニマ(SLでの映画製作)を知って実現可能性を見取り、やおら創作生活がうごめく模様。

未収録記事と記事データのダウンロードはMaglog版ブログからどうぞ

rinsui SL+ Making Blog

SL内ショップはこちらから

Animation Free Space Shop 「COCO/100/176/15」

Salerio Runa&Rin Shop 「Salerio/234/22/27」

QRコード
QRCODE
※カテゴリー別のRSSです。
Information
メタコマースおすすめ商品




オーナーへメッセージ

2008年06月10日

モロ春画のモロ隠しオン・オフスクリプトで御座るよ!!



 
ルナ殿がRuna&Rinショップに隣接して拙者のショップ&部屋を提供してくださった。
 ショップの2階が拙者の部屋でお祝いにと戴いたのが記事写真の春画。
 写真では隠れて御座るが見事なモロ春画なのじゃ。
 自室のことゆえ構わんとモロ出して飾っており申したが、来客を思えば気恥ずかしさが気掛かりになり、タッチにてオン・オフ致せるモロ隠しをば設置致したのでござる。
 パッと切り替わっては味気ないかとタイマーにてアニメ風に切り替わるようにしており申す。

このスクリプトはプリムに適用致したテクスチャの透明度を変化させるもの故、記事写真の如きモロ隠し状態のテクスチャを用意致してプリムに適用する必要があるでござるよ。

 気兼ねは無用にてこのリンクより来宅下され。
テレポート先を拙者の部屋にと思いしが、ルナ殿にてテレポイントを設定しておられるよう故、上空の拙者のブルーカンバンを目印にてどうぞ。
 ついでに床にある穴にて1階ショップへ降りて、RUNA&RINショップ共々覗いて下されれば幸い。

integer kakusi;
float trans;
float time_span=0.15;

default {//
state_entry(){
kakusi=TRUE;//隠し有り、trans==0.0
}

touch_start(integer total_number){
kakusi=!kakusi;

if(kakusi==TRUE){
trans=0.0;//完全不透明
llSetTimerEvent(0.1);
}else{
trans=1.0;//完全透明
llSetTimerEvent(time_span);
}
}

timer(){
if(kakusi==TRUE){//完全不透明=0.0
trans=trans+0.1;
llSetAlpha(trans,ALL_SIDES);

if(trans>1.0){
llSetAlpha(1.0,ALL_SIDES);
llSetTimerEvent(0.0);
}
}else{//完全透明=1.0
trans=trans-0.1;
llSetAlpha(trans,ALL_SIDES);

if(trans<0.0){
llSetAlpha(0.0,ALL_SIDES);
llSetTimerEvent(0.0);
}
}
}
}
  
Posted by rinsui Hax at 16:15Comments(1)TrackBack(0)SL スクリプト

2008年05月28日

二つづつ表情とアニメーションの同時実行スクリプトでござるよ!




ご無沙汰の間にGinji Hax殿より依頼を受けており申したが、そのスクリプトのエッセンスをお伝えするでござる。
依頼は男女にて同期するアニメボールで、男性が笑みを浮かべる女性を抱き上げてキスするというロマンチックな案件。
男女共に「座り」になれば同期アニメがスタート致し、どちらかが「立つ」になれば相方もアニメを止めて「立つ」というものでござった。

これは、ぎんちゃん(以後Ginji Hax殿の愛称にて)のショップ販売案件でスクリプトを公開するのは憚られる故、男女同期のない単独での表情とアニメの同時実行スクリプトを公開するでござるよ。
これは、同じくぎんちゃんの先の依頼にて完成しており申した、男女共に二つのアニメが連続同期するキスボールに、表情の組み込みをテストすべく書いたスクリプトなのじゃ。

オブジェクトへのタッチ時の動作は「座る」に設定してくだされ。
スクリプトにて連続させるアニメーションとしてmale1とmale2の名前を持つアニメーションが必要故用意致され、オブジェクトのコンテンツ内に入れるべし。
表情は組み込まれておるゆえ、スクリプトのみで動作するでござるよ。
male1はループなしの一回きり7.2秒(male2とのつなぎ調整によりタイマーは7.1秒設定)アニメ、male2は28.2秒のループアニメでござる。
アニメ時間は用意されたアニメの総フレーム数をフレームレート(一秒当たりのフレーム数)で割って算出。
ぎんちゃんの例ではフレームレートが10、male1が72フレームで7.2秒、male2は282フレームで28.2秒なのじゃ。
male1は男性が女性を持ち上げるアニメで、その後のmale2では男性が女性を抱き上げてキスするアニメをループして心ゆくまでキスを堪能致す趣向。
勿論male1とmale2はアニメの繋ぎがスムースになる様、制作時にmale1の最終フレームとmale2の第2フレーム(第1フレームはアニメ箇所判定のためのフレームでアップすると第2フレームからのアニメとなる)のポーズが調整されおり申す。
一回アニメとループアニメはアニメーションアップ時の画面で設定するでござるよ。

取り合えずの動作確認ということなら、用意致すアニメの繋ぎポーズと時間は出来合いの適当なものを用意致されれば良し。
但し、male1は一回アニメmale2はループアニメじゃよ。
そして、male1にmale2を続けてアニメ致すのにタイマーが設定されおる故、スクリプト冒頭部分グローバル変数のanim1_timeには新たなmale1アニメの秒数を設定して下され。
記事写真同様、適当なオブジェクトにスクリプトをコピペすれば完成。
タッチでも良いのじゃが、そこは依頼通り「座る」用のスクリプトに致しており申す。
スクリプト内のコメントを読めば処理の内容が判り申そう。
これをば流用致して男女同期複数アニメ&表情を完成致すはそなたの修行次第。
検討を祈り申す!!

string animation_name_m1="male1"; // 実行するアニメーション。ノンループアニメ
string animation_name_m2="male2"; // 実行するアニメーション。28.2秒をループアニメ。
float anim1_time=7.1;//anim1の再生時間
float anim2_time=7.05;//7.05×4=28.2秒でhyoujou_2とタイミングが合う。
key av_m;
vector sit_pos = <0.0, 0.01, 0.0>; // 座る位置,sit_posとsit_rotを全て0にすると普通の座りでsit_poseにならなかった
vector sit_rot = <0.0, 0.01, 0.0>; // 座る角度
integer anim_flag;//アニメーション判定フラグ

hyoujou_2(integer anim_flag){//ユーザー関数。anim2(28.2秒)に同期して「笑顔」と「ニッコリ」
if(anim_flag==1){
llStartAnimation("express_smile");//笑顔
llSleep(3.525);//3.525*2*4=28.2、anim2のサイクルに合うように設定
}
if(anim_flag==1){
llStartAnimation("express_toothsmile");//ニッコリ
llSleep(3.525);//hyoujou_2一回再生で7.05秒
}
}

default
{
state_entry()
{
av_m=NULL_KEY;
llSitTarget(sit_pos, llEuler2Rot(sit_rot * DEG_TO_RAD));//座り位置設定
anim_flag=0;
}

on_rez(integer i){
llResetScript();
}


changed(integer change){//anim1が始まり時か終了時かanim_flagで判定
if (change & CHANGED_LINK) {
anim_flag=!anim_flag;//「座り」「立ち」毎にanim_flagを反転

if(anim_flag==1){//「座り」時=anim1開始
av_m = llAvatarOnSitTarget();//この関数はllSitTarget関数を使って
//sit位置を設定しているオブジェクトでしか機能しない。
llRequestPermissions(av_m, PERMISSION_TRIGGER_ANIMATION);
}else{//「立ち」時=anim1終了
llStopAnimation(animation_name_m1);
av_m=NULL_KEY;
llSetTimerEvent(0.0);
}
}
}

run_time_permissions(integer perm) {//「座り」でanim1開始
llStartAnimation(animation_name_m1);
llStartAnimation("express_toothsmile");//ニッコリ
llSetTimerEvent(anim1_time);//7.1はanim1の時間。anim2のためにタイマーセット
}


timer(){//expression roop
llStopAnimation(animation_name_m1);
llStartAnimation(animation_name_m2);//anim2はループ設定されているのでタイマー不要。
llSetTimerEvent(0.0);
state anim2_smile;//anim2と笑顔・ニッコリループ用ステートへ
}
}

state anim2_smile{

state_entry(){
hyoujou_2(anim_flag);
llSetTimerEvent(anim2_time);
}

timer(){//7.05秒ごとにhyoujou_2をループ
hyoujou_2(anim_flag);//「笑顔」~「ニッコリ」
}

changed(integer change){//「立ち」でhyoujou_2とanim2終了してdefaultへ
if (change & CHANGED_LINK) {
anim2_flag=0;
llStopAnimation(animation_name_m2);
av_m=NULL_KEY;
llSetTimerEvent(0.0);
state default;
}
}
}


  
Posted by rinsui Hax at 20:59Comments(0)TrackBack(0)SL スクリプト

2008年01月20日

タッチでオリジナル胡坐アニメーション座りスクリプトじゃよ!




Salerio Runa&Rinショップのカンバン内住居の座布団でくつろぐ拙者

Runa & Rin Selarioショップカンバン内に住居を用意致したはよいが中はガランドウで誠に殺風景。
まずは来客殿に失礼なきよう座布団をば!と制作致し申した。
写真は試しに座っておる様子じゃが、座布団クリック時の動作は「座る」に設定致しおり、クリックにて座れるはご存知の通り。
ここで一工夫致し、立ちから胡坐へと座るアニメーションをば制作致しスクリプトを組んだのでござる。
よって、タッチ致せばよいこらしょっと胡坐を組むのじゃよ。
スクリプト下の通り。
編集メニューにて「誰に対してもコピーを許可」をチェック致しおるゆえ、右クリック~パイメニュー~コピーでインベントリに座布団が収納されるはずじゃよ。
ショップ看板下フロアーの登りボールをタッチ致してせっせと縄をよじ登り住居に入り、座布団をタッチ致して胡坐を組んで下され。
お土産は縄で編みしせんべい座布団しか御座らんで愛想もないがご勘弁下され。

//住居に座布団を置いたが、座るときにオリジナルアニメで座り開始。
//ビルトインの「地面に座り」アニメをポーザーで編集してアップ。
//アニメ後は最終フレームの胡坐ポーズを維持。(アニメーションアップ画面で設定)

key av;//座布団に座るアバター
string animation_name="zabuton_sit";
vector sit_pos = <0.0, 0.01, 0.7>; // 座り位置設定
vector sit_rot = <0.0, 0.01, 0.0>; // 座る角度設定
integer sit_on;//座り・立ち確認フラグ

default {

state_entry(){
llSetText("Touch & Sit!\nYou can get this cusion\nby copying from Pie_menu!!", <0,1,0>, 1.0);
llSitTarget(sit_pos, llEuler2Rot(sit_rot * DEG_TO_RAD));//座り位置設定
av =NULL_KEY;//アバターのUUID初期化
sit_on=0;
}

on_rez(integer i){//レズ時、state_entry()を実行してリセット
llResetScript();
}

changed(integer change){//誰か座るか立つかしたら
if (change & CHANGED_LINK){//sitはリンク扱い。リンク変更はアバターの座り・立ち
sit_on= !sit_on;//座りか立ちが発生する毎にフラグチェンジ
if(sit_on==1){//誰かが座った
av = llAvatarOnSitTarget();//アバターのUUID取得

llRequestPermissions(av, PERMISSION_TRIGGER_ANIMATION);//アニメパーミッション発動。
}else{//座っていたアバターが立った
llStopAnimation(animation_name);
llSetText("Touch & Sit!\nYou can get this cusion\nby copying from Pie_menu!!", <0,1,0>, 1.0);
av=NULL_KEY;
}
}
}

run_time_permissions(integer perm) {
llStartAnimation(animation_name);
llSetText("", <0,1,0>, 1.0);
}
}







  
Posted by rinsui Hax at 18:36Comments(0)TrackBack(0)SL スクリプト

2008年01月17日

アニメーションテクスチャが不具合原因じゃった!!




非ファントムの出入り口部を通り抜けて登っているの図

Runa&Rin Salerio店に浮かぶ巨大カンバンの中は拙者の住居なのじゃが、写真の如くロープをよじ登って床から入室するのじゃよ。
タッチにて登りを開始いたすスクリプトを入れたボールをショップ床に設置いたしテストを始めたときの事。
無事室内に登り入り成功と思いきや!
天井に頭が刺さって抜けなんだのじゃ・・・・
矢印キーを如何様に押しても天井より降りれず身動きが取れ申さん。
進退窮まり、インベントリのランドマークを取り出しテレポート致して脱出致したのじゃった。

たまたまルナ殿がショップに居られ、二人して頭を悩ますことになり申した。
「よじ登り」はボールに「座る」状態でアニメ致しおり、ボール位置をタイマーイベントにて上昇させることでアバター共々上昇してゆくので御座るが、部屋に入り「座り」を止めればアバターがボールから飛び跳ねるようにして「立つ」寸法。
さては、飛び跳ねて頭が天井に当たるが突き刺さり原因かとまずは「立つ」時間を早め申したがダメ。
次には天井を高く致し、頭が当たるはずも無し!
思いきや、又しても突き刺さり居った!!・・・・
う~む・・・むむ・む・・と行き詰まる拙者。

幸い、ルナどのはSLの事情に通じたお方にて、他のスクリプトが不具合原因となることを存じおり、「何かスクリプトを使ってるの?」とのご質問。
「アニメーションカンバンが御座る」と申せば「止めて頂戴!」とのお言葉。
アニメカンバンの編集画面コンテンツに存するスクリプトを開き、「停止」をクリック致せば、何と!見事に正常化したので御座った。万歳!!

めでたしめでたし!となるところじゃが、もう一つ課題があったのじゃ。
ロープにてよじ登る床の侵入口は部屋から出る際の降り口ともなるが、登りきて「立つ」とストンとその出入り口からショップへと落ちてしまうのじゃった。
う~む、アバターの衝突をば検出致しファントムと非ファントム属性をば出入り口に与えねばならんか?と思案致し居る間にルナ殿はそそくさと制作を始め出して御座る。
見れば2プリムからなる出入り口じゃった。(記事写真をご覧あれ)
三角部がファントムで降り口となり、もう一方のプリムは非ファントムで通り抜け不可となっておる。
登りくるときは非ファントム部に当たるのじゃが、何と通り抜けてくれるのじゃ!!
して、「立つ」で上に降り立ったときには通り抜けない!との按配良き動作。
思えば、テレポートハックにてオブジェクトに「座って」SIM内を自由にテレポート致せる原理が働きおるのじゃ。
テレポート時、非ファントムオブジェクトにぶつかるならテレポート出来ぬ道理ゆえ。
「リンさんは難しく考えすぎ!」とたしなめられ、続いては「私って頭やわらかいでしょ!?」のダメ押しに感服致した次第。

拙者の部屋(まだガランドウじゃが)は開放致しおるゆえ自由にお越し下され。







  
Posted by rinsui Hax at 15:14Comments(0)TrackBack(0)SL スクリプト

2007年12月12日

19表情チェンジャーHUDスクリプトでの日英同時両対応




19表情チェンジHUD販売アニメーションポスター用画像

19表情チェンジHUDをボタンクリックでの表情アニメだけでなく、チャットしながらでも表情変更アニメ入力致せればより便利でござろうと日本語への対応を果たし申した。
スクリプトでの日本語の使用についてはMakapu「lslで日本語を使う」にURLエンコード用のHPページへのリンクと共に説明されおるにて合点を得たのは既報の通り。

したところ、英語への対応をも致すべきじゃろうとの思いが湧きおったのじゃ。
英語は日本語の如き工夫なく使えるゆえ対応については日本語のURLエンコード処理を除けばよく簡単。
と思いきや、難題にぶつかり申した。
どちらでチャットされるかはオーナー殿次第じゃが、スクリプトのリッスンにて日本語と英語チャットを如何に判別致せばよいのじゃろう・・・・・・・?
斯様な知識・情報はあり申もうさず、Makapuのlsl関数・イベント一覧にもそれらしきは無し・・・

URLエンコード変換チェック表
変換前 バイト URLエンコード変換後  バイト  SL内integerキャスト結果
04  4 %ef%bc%90%ef%bc%94    18   0
16  4   %ef%bc%91%ef%bc%96    18  0
00   2   00            2    0
01   2   01            2    1
15   2   15            2    15
00  4   %ef%bc%90%ef%bc%90    18   0
01  4   %ef%bc%90%ef%bc%91    18   0
02  4   %ef%bc%90%ef%bc%92    18   0
16  4   %ef%bc%91%ef%bc%96    18   0
04   2   04           2    4     
16   2   16            2    16
ji    2    Ji            2    0
JI   2    JI            2    0
h5   2    h5           2    0
H5   2    H5           2    0
いえ   4   %e3%81%84%e3%81%88     18    0
家庭 4   %e5%ae%b6%e5%ba%ad     18    0
犬7   4   %e7%8a%ac%ef%bc%97     18    0
AB   4   %ef%bc%a1%ef%bc%a2     18    0 

経過はさておき上のURLエンコード変換チェック表をご覧あれ。
HUDへのチャット入力による表情アニメ指示は、チャット最後の01~19(HUD各ボタン名最後の数字)2文字入力によるのじゃが、表は半全角入り乱れて踊っておる。
じゃなく、日本語と英語で2文字入力した場合の変換前バイト数・URLエンコード結果・変換後バイト数・変換文字をSL内スクリプトにてinteger(整数)キャスト(変換)した結果なのじゃ。
チャットより取り出した最後2文字のバイト数は日本語4バイト、英語は2バイト故、これにて判別できぬかと勘考致したが2文字を代入致した変数のバイト数を取得する関数が見当たらなんだ。
SL内で整数にキャストした結果は、英語では使えそうじゃが日本語では全て0になっており判別不可能じゃ。

じゃが、ハタとURLエンコード変換結果を利用する法に気づき申した!
英語では数字もしくはアルファベットに変換されおるが、日本語は全て%で始まっており申す。
よって、変換文字の最初の一文字が%かどうかで判別可能であったのじゃ。
下はチャットをHUD本体(ルート)のスクリプトにてリッスン致しおる部分でござる。

listen(integer channel, string name, key id, string message){

index_msg=llGetSubString(message,-2,-1);//受信したmessageの最後2文字目を取得、-1は最後の文字
urlenco=llEscapeURL(index_msg);//日本語入力されたチャットのインデクスをURLエンコードして扱えるように
urlenco_1=llGetSubString(urlenco,0,0);//URLエンコード結果1文字目を取得

if(urlenco_1!="%"){
english_or_not=1;//英語フラグ設定
llStopAnimation(hyoujou_name);//現在表情アニメをまずストップ
llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION);//アニメパーミッション発動

}else if(urlenco_1=="%"){
english_or_not=0;//日本語フラグ設定
llStopAnimation(hyoujou_name);//現在表情アニメをまずストップ
llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION);//アニメパーミッション発動してイベント内で分岐
}

}

オーナー殿のチャットはlistenイベント引数のstring messageに入っておるが、始めに表情アニメを指定致すチャット最後の2文字を
index_msg=llGetSubString(message,-2,-1);にて取り出しindex_msgに代入しており申す。
それをURLエンコード致した結果をurlencoに代入致し、最初の1文字目をurlenco_1に入れ申した。
次のif文にてurlenco_1が%かどうかの判定にて英語もしくは日本語フラグを設定しておるのじゃ。
最後に表情アニメのためにパーミッションを発動いたし居るが、表情アニメを実行致す段ではフラグにより日本語と英語を大きく分岐致す寸法。

例の如くルナ殿に見て戴いた処、チャットに数字が入るのはどうかしら?絵文字は使えないの??
と指摘があり申したが、絵文字までの対応は致しかね、代わりに数字を望まぬオーナー殿が代わりの2文字を指定致せるようカスタマイズ詳細説明ノートカードを添付致すことにし申した。

既に各店には記事画像の販売用ポスターを設置致しおるが、このポスターはアニメ致す19の表情とデフォルトを併せ20の表情が順次常時されるアニメポスターでござる。
中々に面白ろきゆえ、このポスターに19表情チェンジHUDとノートカードが入った状態にて購入致せるよう設定しており申す。
是非ご覧あれ。
  
Posted by rinsui Hax at 14:37Comments(0)TrackBack(0)SL スクリプト

2007年12月08日

表情チェンジャーHUDスクリプトでの日本語使用




製作中のRuna & Rinブランド記念19表情チェンジHUD

日本語の扱いとURLエンコード結果の大文字化
Runa &Rinブランドロゴが決定致し、何ぞ記念の商品が欲しいぞよとビルトインで19ある表情をボタンクリックで表情アニメさせるHUDを制作致したら、日本語でのチャット入力時に表情アニメさせる機能が欲しくなり申した。
チャット文字に合わせて口パクさせるのは現状ではチト難しい故、チャット入力の最後部2文字に00~18の19表情対応指定用文字を入力致す方式を考え申した。
”あ、それいいね。05”、”なに言ってるの?16”のようにチャットの最後に、各HUDボタンに名前と共に表示されおる数字を入力致せば対応するボタンの表情アニメがなされる寸法。
これならセリフ毎に自由に表情を割り当てることが可能じゃし、セリフがなくとも”17”、”05”、”11”等と表情アニメだけ行うも自由。

これを実現すべく、リッスン致したチャットの最後の2文字を取り出してアニメーションパーミッションを発動致す部分が下のスクリプト

listen(integer channel, string name, key id, string message){

index_msg=llGetSubString(message,-2,-1);
//受信したmessageの最後2文字目を取得、-1は最後の文字

urlenco=llEscapeURL(index_msg);
//日本語入力されたチャットのインデクス(2文字数字)をURLエンコードして扱えるように
//llOwnerSay(urlenco);//check
llStopAnimation(hyoujou_name);//現在表情アニメをまずストップ
llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION);
//アニメパーミッション発動
}

スクリプト内では日本語を直接扱えない故、取り出したチャット最後2文字を代入致したindex_msgをllEscapeURL(index_msg)にてURLエンコーディング致してurlenco(string型)に代入しており申す。
URLエンコーデングはMakapu紹介されおるこのHPで行い申した。
変換入力欄下の文字コードではプルダウンメニューよりUTF-8を選んでくだされ。
例えば02をURLエンコード致すと%ef%bc%90%ef%bc%92の文字列が返るのじゃ。
つまりurlencoが%ef%bc%90%ef%bc%92なら02のことじゃから、
if(urlenco=="%ef%bc%90%ef%bc%92")のように判定致して02時の処理を実行させることが出来申す。
斯様の発想でパーミッション取得時に発されるイベントにて各表情アニメーションを実行いたすスクリプト部が下の通り

run_time_permissions(integer perm) {

if (perm & PERMISSION_TRIGGER_ANIMATION){

if(urlenco=="%ef%bc%90%ef%bc%90"){//右側は00のURLエンコーディング結果
hyoujou_index=0;//表情リストインデクスの0を指定
hyoujou_name=llList2String(hyoujou, hyoujou_index);//1番目の選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name); //表情アニメーションスタート
}else if(urlenco=="%ef%bc%90%ef%bc%91"){
hyoujou_index=1;
hyoujou_name=llList2String(hyoujou, hyoujou_index);
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
・・・・・・・・・・・・・
以下18まで続く

日本語でのチャット入力最後の2文字を判定致して表情アニメ致す外は先に制作致したボタンのみのHUDと同じ処理ゆえ問題なく動くはず・・・・・・

が、動かない!!・・・・・?????
スクリプトをじっくり見返すも不審な点は見当たり申さぬが何故・・・・!!??
ともかく確認じゃと上例ではコメントアウトしおる
llOwnerSay(urlenco);//check
llOwnerSay(hyoujou_name);//check
の二つをスクリプト挿入致したところ、一番目のurlencoの数字は思惑通りチャット欄に現れたが2番目のチャットは出てこなんだのじゃ。
表情リストより実行される表情アニメ名が選択されておらん・・・・
???????????
念のため、if(urlenco=="%ef%bc%90%ef%bc%90")でのurlencoをチャットでチェックとif文内に
llOwnerSay(urlenco);//check
を追加致したら %EB%BC%90%EF%BC%90 とチャットされたのじゃ。
アルファベットが大文字になりおるが原因かと
if(urlenco=="%EF%BC%90%EF%BC%90")
のように修正致したら見事表情アニメが実行され申した!!

これにて日本語チャット入力に表情アニメ機能を付加致せて目出度し目出度し!!
じゃが、拙者の脳裏をふとある思いが掠め申した。
英語でのチャット入力にも対応できればいいな・・・・
日本語と英語同時対応ならなお更いい・・・な・・・

これで次なる奮闘に突入!!・・・
現在取り組み中ゆえ解決次第報告するでござるよ。
  
Posted by rinsui Hax at 19:34Comments(0)TrackBack(0)SL スクリプト

2007年11月04日

Paytelが自動返金機能付きに変身!!




ようやく人肌感が出てきた制作中スキンにて(Diamond_smile装着にて)

変身と言えば拙者のシェイプ・スキン制作。
ご覧の通り制作再開致して完成が近づきつつあるようじゃ。

本題に入り申す。
先般Paytel(Pay & teleport)の紹介を致し、入金時を入金後REZされ申すテレポーターに再タッチによるテレポートなる簡易な使用法ゆえ、入金後30秒のタイムアウトによる返金事態はめったに起こるまいと、万が一返金が発生致せばNOTE CARDを表示致すことで済ませており申した。
その仕様にて販売致し申したが、万が一とはいえ返金対処に入金者とPaytelオーナー殿の手を煩わすことが気掛かりになり自動返金機能を追加いたすこととし申した。
入金後テレポートなされずタイムアウト致せばテレポータの消滅前にその旨を設定チャンネル(テレポータと入金オブジェクト間で設けられているチャンネル)で発言し、入金オブジェクトが聞き取って返金処理を行う仕組み。
しかしこの時、入金者がテレポートする前に次の入金者が登場して先の入金者がタイムアウト致した場合を想定されたし。
入金オブジェクトには入金時に入金者のUUIDが変数に代入保存され申すが、次の入金者が登場いたせば前の入金者のUUIDが上書きされ、変数には後者のUUIDが保存されるのじゃ。
さすれば返金は後の入金者になされて困った事態に陥り申す。
もちろん、これはUUIDの保存にリストを試用するなど、スクリプトの書き様にて対処いたせることじゃがリストの処理やREZさえるテレポータの位置調整など等解決すべき問題が山積みで大変じゃ。
そこで、テレポータの使用は順次使用に致し申した。
つまり、先の入金者がテレポートもしくは返金処理が終わるまで次の入金者が登場しても返金とIM(インスタントメッセージ。前の利用者が終わるまで待ってねのメッセージ。)致すのじゃ。
このために、タイムアウト時だけでなくテレポート終了時にもテレポータより入金オブジェクトへその旨発言致し、入金オブジェクトが入金後テレポート致すまでの状態を把握できるように致した次第。

更に、テレポータがファントム(すり抜けOK)で入金オブジェクトを覆ってREZされる故、入金者自身が入金オブジェクトに再タッチにより多重入金することは無いものの、オーナー殿がPaytelを複数設置し或いは同じSIM内の他のオーナー殿がPaytelを設置致し居れば、あるテレポータの発言を全ての入金オブジェクトが聞き取ることになり返金先が大混乱いたすではないか!!と気付き申した。
これは大変・・・
これを避けるには入金オブジェクトにて自身への発言と判別致せる仕組みが必要じゃ。
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
入金時に入金者のUUIDを収得致せるが、テレポータREZ時にそのUUIDをテレポータに渡し、テレポータから入金オブジェクトへの発言内容にそのUUIDを含ませて判別する仕組みと致した。
これなら確実に入金オブジェクトとテレポータ発言の対応が図れるじゃろう。


スクリプトの修正を終えての実働テスト。
まずはテレポートチェック。
入金後現われた半透明テレポータにタッチ致せば見事瞬時に上空へ移動いたした。
店の屋根に落ち、すたこら2階へと舞い戻り此度は返金チェック。
チェック用にテレポート後テレポータが消滅前に”finished”とllOwner()にて
発言するように書き申したがチャットに発言が現れなかったのが気掛かりじゃた。
再度入金致してテレポートすることなく待つことしばし・・・・
と思いきや、入金いたすと「少し待って・・・」のメッセージがチャットに現れたではござらぬか!
入金オブジェクトをリセット致し再々チェック致せば同様の結果じゃった・・・
スクリプトを見直せばテレポータの発言内容に間違いがあり申した。
それを直すも発言を聞き取れず・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

もしや!?
700m上空からの発言を聞き取れないのでは?
と思いつき、テレポート後の上空ではなく入金者がテレポータにsitしてテレポート致す直前に発言を移動致してチェック。
おお、見事テレポート確認用の"finish"チャットが現れたるを上空で確認し、引き続き入金後タイムアウトによる返金に臨めば・・・・・
成功!!
念のため、繰り返してOK!!!
ふ~っ、無事終了じゃ。
店に販売しおったポスターの中身をば入れ替え完了。

Paytelはテレポート先や利用料等、オーナー殿独自の設定必要事項があるゆえモデファイ可能でござる。
先般掲載致した詳細な説明書も修正致し同梱致しおるのでスクリプトに関心ある御仁は購入致されたし。


  
Posted by rinsui Hax at 22:35Comments(0)TrackBack(0)SL スクリプト

2007年11月01日

忍法雲隠れDEMO完成への道のり




完成致した忍法雲隠れを世に広める(販売する)にあたり体験版を制作致したところ気付いた点がござった。
正規版ではインベントリよりninpou_kumogakure_plimとHUDを装着し、球形HUDへのタッチにて雲隠れと出現を繰り返すのじゃが、体験版では店に浮かんでおる忍法体験用球体にお客様がタッチ致せばninpou_taiken_plimが球体よりREZされると共にアタッチ承認のダイアログが表示され、承認されれば自動的に雲隠れと出現を行ってninpou_taiken_plimがデタッチ~消滅されるよう仕組み申した。
ところがこれには大きな落とし穴があり申した。
自身で試して成功致したので店に設置致したが、その後ひょんな拍子にて妻のfanyan Loonにて試したれば何とninpou_kumogakure_plimが装着されない致命的な不具合じゃ。
それが記事写真で、fanyan Loonはアニメしおる(アタッチされないためアニメパーミッションもダイアログ表示されてしもうた)がninpou_kumogakure_plimより発せられるパーティクルが体験球体上部より発せられておろう。
あ、記事写真を変更致したので想像してくだされ・・
思案に暮れ申したが、MIZ殿リファレンス(llAttachToAvatar)を見ればなんの事はなし。
アバターへのアタッチはオブジェクトオーナーのみ有効とのことにて、このパターンではアタッチ不可なのじゃった・・・
REZ~アタッチ方式ではダメで、タッチ致した御仁にninpou_kumogakure_plimをプレゼント致し、利用者にてインベントリより装着して頂くよう変更が必要。
これにて体験ボールタッチにてアタッチのダイアログ表示に承認すれば自動的に雲隠れと登場がなされる簡便さを諦めざるをえなくなり申した。

時はさかのぼり、この体験版の前には正規版と同じ作りで3回の使用制限を設け、体験版購入ポスターより0L&にて購入致せるように作成しており申した。
そのパターンでは、3回の試用を終えればデタッチ~ダイされてninpou_kumoakure_plimが消滅して終了となるのじゃ。
確かに装着されおるninpou_kumogakure_plimは自動的に(パーミッション取得ダイアログが表示されることなく)デタッチの承認が取れ消滅するのじゃが、インベントリには未だninpou_kumogakure_plimが存しておるのじゃった。
このこと自体はSLの仕様なのじゃが、問題は引き続き装着して試用出来ること。
夜中に試用版制作を思いつき一日没頭して仕上げた結末がこれで先の再チョンボへ続くのじゃ・・・

時は流れ本日、MIZ殿ブログの「デモ商品を作ろう」を読み返し見れば、ずばりアタッチメントの使用回数&時間制限例にて、それによれば制限超過後アタッチ致せばデタッチ~ダイとなり、念入りにもオブジェクトとしての利用対策にREZ致せばDieなされる徹底振り。
つまり、インベントリには残るもアタッチ試用は出来なくなるのじゃ。

どこを間違ったのじゃろう?
拙者のスクリプトの横にMIZ殿サンプルスクリプトをコピペ致し見比べつつ思案致すことしばし。
・・・・・・・・・・・っ!!!!
お~っ、判り申した!!

 on_rez(integer p){
    rez_count --; // rezされるたびに残りrez回数を減算
    if (rez_count < 0) { // 使用回数が0以下になったらステートdeadに遷移
      state dead;
      return;
    }
    settext();
  }
}

上のMIZ殿サンプルの如く、回数制限用変数をREZされる毎にカウントされるべきところ、拙者はアタッチ時の忍法回数制限に目がそらされたのかREZ時のカウントを忘れ忍法時のイベント内(run_time_permissions(integer p))でのみカウントしておったのじゃった。
これではアタッチ時の忍法制限はできてもアタッチ制限はできぬ道理じゃ。

DEMO版を0L$販売致さずビデオストリーミングを掲載致したは斯様な経緯があってのこと。
ようよう解決致した故、目出度く無料体験版を用意致し申した。
アタッチ回数は一回切りじゃが回数制限なく忍法雲隠れ致せ、体験頂くには不足なしと存知申す。
店にて写真のポスタータッチ~0L&にて購入して下され。
HUDを添付しninpou_kumogakure_attach_DEMOを装着致してHUDをタッチ致す毎に雲隠れ・出現を繰り返すぞよ。
商品用のNOTE CARDを掲載しおくが、読んでの通り場所によっては妙な具合に透明化され或いは透明化しないアタッチメントのあるを承知願いたし。

使用説明 for use

1・kumogakure_plimを装着しHUDを添付して下さい。
  Attach kumogakure_plim and ninpou_kumogakure_HUD.

2・HUDをタッチする度に忍法雲隠れと出現を繰り返します。
  Touch ninpou_kumogakure_HUD ,then your avator alternately disappear and appear by ninpou_kumogakure.

3.HUDを長押しするとHUDが黒くなりkumogakure_plimがデタッチされ消滅します。
  HUDをタッチすると色が変わりますが忍法は使えません。
  kumogakure_plimを装着すれば忍法を使えるようになります。
  Long touch ninpou_kumogakure_HUD,then kumogakure_plim dettach and die.
  As you touch ninpou_kumogakure_HUD,HUD's color will change but you can't ninpou_kumogakure.
Please attach kumogakure_plim ,then you can ninpou_kumogakure again.

4./5die と,5チャンネルでdieと発言することでもアタッチしているkumogakure_plimを消滅させることができます。
  Then you chat 5CH "die"(/5die),kumogakure_plim will equally dettach and die.

5・アタッチによりましては忍法で消えないものがあります。
  Ther are some attachment which do not disappear by ninpou_kumogakure.
  
Posted by rinsui Hax at 23:50Comments(0)TrackBack(0)SL スクリプト

2007年10月16日

ご無沙汰で御座ったでご質問





長らくご無沙汰致したが、実は妻との船旅であったのじゃ。
Liberty of the Seasという現在のところ世界最大の客船で、さすがに大きくゴージャスな船であり申したが、フロリダ州はマイアミより出港いたしてキューバ周りのカリブ海をグルリ7泊8日にてハイチ・ジャマイカ・ケイマン島・メキシコと寄港しつつ西周りに巡る旅じゃった。(アメリカ行き帰りの宿泊があり全10泊11日)
毎夕のディナーは一流シェフによるコース料理の食べ放題、朝昼はビュッフェにてこれ又食べ放題、更には24時間のカフェ・軽食食べ放題で他にも様々のショップ・BARありで行く前から肥るは必定と覚悟しており申した。
船内にはアスレチックジムとサウナがあり、せっせと汗を流し申した結果1.6kg増量でまずまずの成果ありでござろうか。(3kgは肥ると予想しており申した)
最新映画の上映(60席のスクリーンルーム)もあり4本観たでござるよ。
カジノはもちろん、ステージでは本格的な歌と踊りのショーにプロスケーターによるアイスショーまであり至れり尽くせりじゃ。
http://fun.blogonline.ru/30397.html(船内外写真集あり)とhttp://www.freedomoftheseas.com/(長大な紹介FLASHムービーあり)をご覧頂ければ様子を了解頂けよう。
初の船旅であり申したが、通常のツアー旅行とは違いのんびりとホテル生活の如く旅行致すは良いものでござった。
これからリピーターになるじゃろうが、今回はパソコンの持参もなく後半には若干の手持ち無沙汰をも感じたが、制作環境を持ち出せば更なる長期旅行をも快適に過ごせるであろう。
ただ、客室空調の乾燥が強く、妻は喉を患ってござるのじゃ。
添乗員殿にバスタオルを濡らして部屋にぶら下げての対策を伝授頂き改善され申したが、妻は未だ声が復せず風邪に陥る狭間をさ迷ってござる。
次回より喉の消毒薬をば持参致すを忘れてはならぬと了解致した次第。

さて、自宅に戻りこれまでの情報をチェック致しおると、SLよりのメールにて「テレポータ」制作についての相談がござった。
上空200mの制限についてはMIZ殿と拙者の記事にて解決できたが、更に上空20000mなどへもテレポート致したいが768m以上にテレポートできぬとの相談とテレポート先をテレポータの現在位置上空に自動設定致せるようにスクリプト致したいとのことじゃった。

はじめの上空制限の突破については拙者も情報に触れたことがない故、「SLでの制限で不可能なのか、可能としてそれを可能にするスクリプトの書き方を知らない」ので先方にて調べて頂きたい。
もし拙者にて判ればお知らせいたすが約定はできぬ旨お伝え致したのじゃ。
この件をご存知の御仁、是非コメント頂けますようお願い致す次第。

他方については、

もう一方の現在位置によるテレポート先設定につきましては下記のように修正しましたので差し替えてご使用下さい。
ポイントは取得した現在位置への高度z情報の設定法ですね。
ご覧のように変数のZ要素に800を足します。
テレポータが戻れるように足したあとで800を引いて元に戻しております。
(実際には上記の制限により768mまでしかテレポートしない)

vector orgPoint = llGetPos();//テレポート前に現在地取得
vector telPoint;//テレポート先位置
orgPoint.z+=800;//テレポート先の高さを現在地の800m上空に設定
telPoint=orgPoint;
orgPoint.z-=800;

斯様に返事を書き申した。
修正致したスクリプト全文を載せてノートカードにコピペ致し、検索より依頼者殿を検索致してアバター写真欄にノートカードをドラッグ致せば先方に渡すことが出来申した。
これも初めての事にて、試しみれば成功でなんとも便利と関心致した次第。
(SLログイン時、依頼者殿よりテレポータを拙者に渡すダイアログが現れたのもこの方法だったのじゃろう)

今回の旅では英会話習得と制作に励み脱寡作の決意が訪れ申した。
戻りてRuna殿と再会いたせし処、どなたかより拙者への仕事依頼が有るとのこと。
彼女経由故、仕切りは彼女に任せることに致したが、貯まりおる自作・新作にも励まねばならず忙しくなりそうじゃ。

  
Posted by rinsui Hax at 23:06Comments(0)TrackBack(0)SL スクリプト

2007年10月04日

パーティクル実験&作成HUDの宿題は斯様でござる




明日より15日まで暫らく更新できなくなり申すが、拙者が取り組みおるパーティクル実験&作成HUDの仕様をば取り扱い説明書(NOTE CARD)の準備がてらお披露目いたし申す。
まずはREZボタンにてパーティクルを発生させるプリムをREZ致し、数多あるHUDのボタンにてパラメータを設定しゆくのじゃが、全29ものパーティクルパラメータの意味が分らなくともオンオフ切り替え(使用機能を決めるマスクパラメータ)とダイアログ(パラメータ設定値)にて簡易に設定値の選択設定がなせ、それをいじくれば直ぐにパラメータの意味と設定値による変わりようを把握致せよう。
更に緻密に設定致すなら、チャットによる直接入力にて自在にパラメータ設定できる仕様。
オリジナルテクスチャの適用と共に、調整したパーティクルパターンの登録と適用も致せ、誠に
簡易かつ自在なHUDなのじゃ。
一通りのスクリプトを書き終え、テスト用HUDにスクリプトを仕込んで実働テストさせる段階じゃが、これからが大変。
本日もHUD部品にスクリプトを仕込みおったが、エラーの原因が分からずじまいじゃった!・・・
すでに頭が混ぐらがっておるのに、10日以上もの間隙が入らば忘却が加勢いたして沈没するやも知れぬ。
その懸念もあり、仕様のポイントを書き記した次第。
復帰いたさば大急ぎで仕上げに掛かる故、無事成功のご祈念の程御加勢あれ。

・ダイアログによるプロパティ選択設定
 パラメータボタンを長押しするとダイアログが現れてプロパティ選択可。
 マスクボタンではタッチ毎にオンオフ切り替え

・チャット入力による自由なプロパティ値設定
 パラメータボタンをタッチしてオンになるとチャット入力でのプロパティ入力可。
 0chなのでそのままプロパティ入力OKだが、一般チャットと判別するために
 先頭にpを入力後指定された形式(ボタン上部に例示あり)でプロパティ入力。

・パーテクルパターンのメモリボタンへの登録とパーテクルプリムへの適用
 メモリアップ(メモリボタンへのパーティクルパターン情報登録)・ダウン
 (パーティクルプリムへのメモリボタン登録パターンを適用)を行うにはメモリ
 フラグボタンが該当モードであるときに使用するメモリボタンを押すことで
 行います。
 メモリフラグボタンはタッチする毎にオフ・アップ・ダウンが切り替わります。
 パーティクルパターンが登録されているメモリボタンにアップしますと新たな
 パターンで上書きされます。

・12のプリセットパーティクルパターン使用
 プリセットメモリボタンを押すと、ダイアログで12のパーティクルパターンを
 選択してパーティクルプリムに適用できます。

・パーティクルプリムの名前変更
 nameボタンを押してチャット入力しますとパーティクルボタンの名前を変更
 することが出来ます。
 ボタンを押して12秒以内に、変更する名前を直接入力(0chで通常チャット
 ネル使用)してください。

・パーティクルプリムの完成
 プロパティ調整を終えましたらコンプリートボタンを押してください。
 パーティクルプリムの通信が削除されますので、以後プロパティの変更が出来なく
 なります。
 修正が必要なときはREZボタンを押してはじめから調整し直してください。

・パーティクルへのテクスチャ適用
 テクスチャボタンを長押しするとテクスチャ選択ダイアログが現れますので
 登録されている12のテクスチャ(テクスチャ無しを含む)から選択して適用
 できます。

・パーティクルへのオリジナルテクスチャの適用
 調整中(コンプリートボタンを押していない)パーティクルプリムに適用したい
 テクスチャをドラッグ&ドロップしてコンテンツに入れた後、テクスチャボタンを
 タッチして(ダイアログが現れない状態)適用するテクスチャ名をチャット入力
 (0chの通常チャットを使っているので名前だけを入力)すると適用されます。
 名前を間違えたり、テクスチャが入っていなかったりしますとテクスチャ無し
 となります。

・パーティクルが飛んでいくターゲットの設定
 ターゲットにするオブジェクトに、同梱されているtarget_plimを使用するか、
 自身で用意した
 オブジェクトをターゲットにする場合はtarget_plimコンテンツ内にあるスクリプトを
 コピーして自身のオブジェクトのコンテンツ内でスクリプトに貼り付けて下さい。
 ターゲットをインベントリからドロップしてREZされている状態で、HUDの
 param_targetボタンを押して青色の時にターゲットオブジェクトをタッチすると
 HUDにターゲットの設定が行われます。(既にあれば上書きされます)
 パーティクルが実際にターゲットに向かうのはパラメータボタンのターゲットライナーマスク
 又はターゲットポスマスクがオンの時です。
 ターゲットライナーマスクは一直線に、ターゲットポスマスクではホーミングミサイルの
 ように飛んでいきます。
  
Posted by rinsui Hax at 02:07Comments(0)TrackBack(0)SL スクリプト

2007年09月28日

パーテクル実験・作成HUDに取り組んでござる




マンガスキンでRunarin殿クラブ舞踏会での裸踊りに興じてきた拙者

SLショップでの売り上げにてLive6(音源・音楽作成ソフト)購入を高らかに宣言致し申したが、早速パーティクル実験・作成HUD制作に取り組み出したでござる。
Diamond Smileのキラリにてパーテクルを使用いたし、カスタマイズするための自分用HUDも制作いたした故、概要は把握いたしおる次第。
その折は一部のパラメータしか搭載いたさなんだが、全てのパラメータを調整できるように致し、簡便にパーティクル実験と制作がいたせれば何かと使いでもあろうかと思ってのこと。
勿論、商品としての制作じゃが、これは自分でも欲しいHUD、マシニマ制作にも重宝致そう。

仕様をチェック致せば、パラメータ用に29ものボタンが入用でござった。
更に制作致したパーティクルパラメータを登録するに10のメモリボタンを設け、パーティクルを発生いたすプリムのREZボタンに完成致した際のコンプリートボタン、そしてメモリ機能のOFF・UP・DOWN切り替えボタンが必要で、計42ものボタンを要する大そうなHUDでござる。
パーテクルに適用いたすテクスチャも数種用意せねばなり申さぬ。

パーティクルのカスタマイズはかように数も多く、スクリプトを一々開き変更しての調整は手間暇がかかり大変じゃ。
かようなHUDにてボタン操作とダイアログ選択、或いはキー入力にてパラメータを次々と変更致してリアルタイムに調整できるは誠に助かり申そう。
完成すればREZ致したプリムに名前を付けてTAKE致し、そのまま使える仕様じゃ。

手間の掛かる作業じゃがスクリプト書き様の目途は付いてござるゆえ何とかなり申そう。
これが完成いたさば次なるお役立ち制作目論見があるのじゃが、それは又後程!
  
Posted by rinsui Hax at 00:29Comments(0)TrackBack(0)SL スクリプト

2007年09月25日

口パクテスト用スクリプトに成功も、未だ山高し!




散々に難儀致しおったクチパクテスト用スクリプをついに完成致し、早速実用致せる口パクパターンを組むべく操作致し申した。
下にスクリプトを掲載致したので感心のある御仁はご覧・実験頂ければ結構でござるが、このスクリプトは拙者自身の実験用に書きしものにてキーボードでのチャット入力で使用致すもの故、少々とっつき難いやも知れぬがご勘弁。
適当なプリムにスクリプトを丸ごとコピペ致して一旦右クリックパイメニューよりインベントリにTake致し、インベントリにてオブジェクト右クリックにて適当にアタッチ設定いたして装着いたせば使え申す。
使用致すには2種のモードがあり、一つは初めてアタッチ致しデフォルトステートに入れば稼動致しおるモードでキーボードにてその都度口パクパターンを指定致して動きを見るモードでござる。
スクリプト冒頭に list hyoujou_anim なるSLに組み込まれおる19の表情アニメ名をリスト化致し、それぞれの名の右にインデクスをコメントにて記しおるが、そのインデクスをチャットで自由に連続入力いたして口パク実行リストを指定いたすのじゃ。
このモードでは10チャンネルを使いおる故、/10 4,5,12,10,18,4,6,7,3(10チャンネル指定の後スペース。以後同様) のようにはじめに10チャンネルを指定して引き続き整数にてインデクスをカンマで区切りながら入力致せば自動的に口パク実行リストが作成・実行される仕組みじゃ。
表情アニメを順番に再生致すのみでは口パクにならぬゆえ、各アニメを0.3秒や0.5秒或いは0.8秒と短く区切って再生致すのじゃが、その表情アニメ間隔秒数を指定いたすには同じく10チャンネルにて 
/10 z0.3 のようにzを入力後指定秒数を致すのじゃ。
初期設定は float henkou=0.5;にて0.5秒でござるよ。
確認用に随所にチャットメッセージを組み込みおるゆえ様々なメセージ確認頂けよう。

いまひとつのモードは実際の口パク使用を想定いたし、オーナーのチャット発言文字数より口パクの長さを自動設定致し、これまた指定いたした口パクパターンにて自動口パク致すモード。
このモードに入るには 10/c5,6,4,10,4,8,0,13,(インデクス上限は18まで)の如く c の後に表情アニメリストインデクス指定致して入るのじゃ。
インデクス指定は後に設定・変更致せる故 c のみにてモード変更致すだけでも宜しい。
このモードではオーナーの会話をリッスン致すのに0チャンネルを利用致しおる故、先のモードのように /10のチャンネル指定は不要で、いきなりチャットいたせばよいのじゃ。
普通にチャット致せば設定されおる口パク実行リストが発言文字数により適当な回数繰り返され申す。
表情インデクスをモードへ入るときに設定せず、或いは変更致すには r5,7,4,10,14,0,3,6,5, のように始めにrを指定してインデクスを入力致せばよし。
何度でも自由に変更してみられよ。
インデクス数の制限もなし、連続していも可能のなんでもありでござる。
表情アニメ間秒数を変更致すには z0.6 のようにz入力後実数指定。
デフォルトモードへ戻るには d 一文字のみの入力でござる。 

かように口パクパターン作成致すべくスクリプトが完成致したが、問題は表情アニメーションでござった。
試していただければ分り申すが、ナカナカに自然な口パクになりもうさんのじゃ。
記事写真のように妙な表情が連続しては日常会話に相応しからんでござる。
表情アニメの最初から一部を切り取って繋いでおるわけじゃが、口パクに適当な切り取りがなされおるわけでないということ。
表情アニメよりふさわしい箇所を切り出せれば良いのじゃが、今のところその法を知り申さんで如何ともなし難し。
まだ、テストを始めたばかりゆえ今暫らく組み合わせようを模索致す所存じゃ。

//10/z0.7 で表情アニメ間隔秒数変更
//10/c3,5,6,7, でチャット反応モードに変わって実行口パクリスト作成
//チャット反応モード時は0chリッスンのため即入力に反応
//0ch時 d 一文字入力でデフォルトステートに帰る
//0ch時 r5,6,4,3,7,9,12,15,・・で口パク実行リスト変更更新
//0ch時 z0.3 で表情アニメ間隔秒数変更
//自動ループ口パクではなくチャットで表情指定(/10 7,6,1,9,3等)
//10CHチャットでの表情アニメの数字による入力はスペースで区切る
//表情アニメ間スピード変更入力は始めの一文字をz入力して続けて実数入力

list hyoujou_anim=[
"express_afraid_emote",//chat_num 0
"express_anger_emote",//chat_num 1
"express_bored_emote",//chat_num 2
"express_cry_emote",//chat_num 3
"express_disdain",//chat_num 4
"express_embarrassed_emote",//chat_num 5
"express_frown",//chat_num 6
"express_kiss",//chat_num 7
"express_laugh_emote",//chat_num 8
"express_open_mouth",//chat_num 9
"express_repulsed_emote",//chat_num 10
"express_sad_emote",//chat_num 11
"express_shrug_emote",//chat_num 12
"express_smile",//chat_num 13
"express_surprise_emote",//chat_num 14
"express_tongue_out",//chat_num 15
"express_toothsmile",//chat_num 16
"express_wink_emote",//chat_num 17
"express_worry_emote"//chat_num 18
];

float henkou=0.5;
integer command_channel=10;
string first_str="";
integer handle;

kuchipaku(string hyoujou,float henkou){//表情アニメ自作関数
llStartAnimation(hyoujou);
llSleep(henkou);
llStopAnimation(hyoujou);
}

list msg_to_list;//チャットを口パクアニメリストで指定するインデクスの並び順を作る
list kuchipaku_now;//口パク実行用の表情アニメリスト
list kuchipaku_index;//msgより作成の口パク用表情アニメ名整数型インデクスリスト
list new_list;//口パク実行インデクスリストへ入れるための表情アニメ名インデクス
list new_name;//口パク実行表情名リストに入れるための表情アニメ名
string hyoujou_now;// hyoujou_animリストからインデクスにより取り出された実行リスト挿入用表情名
list hyoujou_now_list;
integer anim_index;//リスト化されたmsgからfor文で順番に表情アニメリストのインデクスを取り出す
integer i;//anim_length
integer j;
integer k;
integer l;
integer m;

integer msg_length;//チャット文字数
integer repeat;//口パクリスト繰り返し回数
//最終回口パク時実行表情アニメ個数(余り)~余り実行なしで簡易化
integer jikkou_list_length;//使用する口パクパターンの表情アニメ数
float kuchipaku_time;//口パクリスト一回を実行するのに要する時間
float msg_time;//msgを口パクするのに必要な時間
list jikkou_kuchipaku;
//使用HUDの固定口パクパターンを収納、パターン数字より組み立て
integer handle_chat;//オーナーチャットリッスン用
integer list_times;
//msgを口パクするのに口パク実行リストを繰り返す回数
float kurikaesi;
string msg_chat;
//msg1文字目を除いた文字列、口パク実行リスト用インデクス作成に使用

default {

state_entry(){
llListenRemove(handle_chat);
 handle = llListen(command_channel, "",llGetOwner(), "");
//チャットリッスン開始
llOwnerSay("Now default state");//for check
kuchipaku_index=[];
i=0;
j=0;
}

listen(integer ch, string nm, key id, string msg){
//HUDからのスピード変更対応要
first_str=llGetSubString(msg,0,0);//get first string of msg

if(first_str=="z"){//henkou set
henkou=(float) llGetSubString(msg,1,-1);
llOwnerSay(llGetSubString(msg,1,-1));

}else if(first_str=="c"){//for chat_kuchipaku start massage

kuchipaku_index=[];//口パク実行インデックスリスト更新
msg_chat=llGetSubString(msg,1,-1);ここではステート変更のみ
msg_to_list = llParseString2List(msg_chat, [","], []);
//msgを空文字で区分して文字型リスト化
i =llGetListLength(msg_to_list);//get hyoujou_anim_num

llOwnerSay("hyoujou length is"+(string)i);//for check
llOwnerSay((string)msg_to_list);//for check

for(j=0; j anim_index=llList2Integer(msg_to_list,j);//インデックス並び順リストを作成
new_list=[anim_index];//リストへ挿入準備
kuchipaku_index = llListInsertList(kuchipaku_index, new_list, -1);
//リストの最後にインデックス追加 整数型リスト
}
state chat_kuchipaku;

}else{

msg_to_list = llParseString2List(msg, [","], []);
//msgを空文字で区分して文字型リスト化
i =llGetListLength(msg_to_list);//get hyoujou_anim_num

llOwnerSay("hyoujou length is"+(string)i);//for check
   //llOwnerSay((string)msg_to_list);//for check

for(j=0; j anim_index=llList2Integer(msg_to_list,j);//インデックス並び順リストを作成
new_list=[anim_index];//リストへ挿入準備
kuchipaku_index = llListInsertList(kuchipaku_index, new_list, -1);
//リストの最後にインデックス追加 整数型リスト
}//for
state kuchipaku_go;
}//else
}//listen

}//default

state kuchipaku_go{

state_entry(){
llListenRemove(handle);
k=0;
l=0;
m=0;
kuchipaku_now=[];

for(k=0;k l=llList2Integer(kuchipaku_index,k);
//hyoujou_animリストでの表情インデックスを整数で取り出す
hyoujou_now=llList2String(hyoujou_anim,l);//実行する表情アニメ名を順次取得
hyoujou_now_list=[hyoujou_now];
kuchipaku_now=llListInsertList(kuchipaku_now,hyoujou_now_list,-1);
//実行する表情アニメ名を後ろに順次追加
llOwnerSay(hyoujou_now +""+"anim_name has got");//for check
}//for
llRequestPermissions(llGetOwner(),PERMISSION_TRIGGER_ANIMATION);
llOwnerSay("Now kuchipaku_go statas");//for check
}

run_time_permissions(integer perm) {
if(perm & PERMISSION_TRIGGER_ANIMATION){//口パク実行

while(m!=i){

hyoujou_now=llList2String(kuchipaku_now,m) ;
kuchipaku(hyoujou_now,henkou);//口パクループ実行
m++;
llOwnerSay(hyoujou_now+(string)henkou+" has done"+" timer "+(string)m+"/"+(string)i);
//for check what hyoujou and time runs

}//while
state default;
}//if
}//run_time
}//state

state chat_kuchipaku{

state_entry(){//実行口パクアニメリスト作成完成
llOwnerSay("Now chat_kuchipaku statas");//for check
llListenRemove(handle);
handle_chat = llListen(0, "",llGetOwner(), "");
//オーナーチャットリッスン開始
k=0;
l=0;//口パク実行リスト繰り返し回数チェック用
m=0;
jikkou_kuchipaku=[];

for(k=0;k //口パク実行用表情名リストjikkou_kuchipaku作成
hyoujou_now="";
hyoujou_now_list=[];
l=llList2Integer(kuchipaku_index,k);
//hyoujou_animリストでの表情インデックスを整数で取り出す
hyoujou_now=llList2String(hyoujou_anim,l);
//実行する表情アニメ名を順次取得
hyoujou_now_list=[hyoujou_now];
//表情名を実行リストに追加するために一旦リスト化
jikkou_kuchipaku=llListInsertList(jikkou_kuchipaku,hyoujou_now_list,-1);
//実行する表情アニメ名を後ろに順次追加
llOwnerSay(hyoujou_now +""+"anim_name has got");//for check
jikkou_list_length=llGetListLength(jikkou_kuchipaku);
//口パクで使用リストの表情アニメ数
}//for

}

listen(integer ch, string nm, key id, string msg){
//HUDからのスピード変更対応要

first_str=llGetSubString(msg,0,0);//get first string of msg
msg_length=llStringLength(msg);//msg文字数取得
msg_time=msg_length*0.2;
//msgを口パクするのに要する時間、1文字0.2秒

if((first_str=="d")&&(msg_length==1)){
//0ch時d入力だけでデフォルトに戻る
state default;

}else if(first_str=="z"){//henkou set
henkou=(float)llGetSubString(msg,1,-1);
llOwnerSay("henkou changed to "+llGetSubString(msg,1,-1));

}else if(first_str=="r"){//実行口パクリスト変更
kuchipaku_index=[];//口パク実行インデックスリスト更新
string msg_chat=llGetSubString(msg,1,-1);
msg_to_list = llParseString2List(msg_chat, [","], []);
//msgを空文字で区分して文字型リスト化
i =llGetListLength(msg_to_list);//get hyoujou_anim_num

llOwnerSay("hyoujou length is"+(string)i);//for check
//llOwnerSay((string)msg_to_list);//for check

for(j=0; j anim_index=llList2Integer(msg_to_list,j);
//インデックス並び順リストを作成
new_list=[anim_index];//リストへ挿入準備
kuchipaku_index = llListInsertList(kuchipaku_index, new_list, -1);
//リストの最後にインデックス追加 整数型リスト

k=0;
l=0;//口パク実行リスト繰り返し回数チェック用
m=0;
jikkou_kuchipaku=[];

for(k=0;k //口パク実行用表情名リストjikkou_kuchipaku作成

hyoujou_now="";
hyoujou_now_list=[];
l=llList2Integer(kuchipaku_index,k);
//hyoujou_animリストでの表情インデックスを整数で取り出す
hyoujou_now=llList2String(hyoujou_anim,l);//実行する表情アニメ名を順次取得
hyoujou_now_list=[hyoujou_now];
//表情名を実行リストに追加するために一旦リスト化
jikkou_kuchipaku=llListInsertList(jikkou_kuchipaku,hyoujou_now_list,-1);
//実行する表情アニメ名を後ろに順次追加
jikkou_list_length=llGetListLength(jikkou_kuchipaku);
//口パクで使用リストの表情アニメ数
}//for

}
llOwnerSay("jikkou_kuchipaku="+(string)jikkou_kuchipaku);//for check
}else{

llRequestPermissions(llGetOwner(),PERMISSION_TRIGGER_ANIMATION);
}
}

run_time_permissions(integer perm) {

if(perm & PERMISSION_TRIGGER_ANIMATION){//口パク実行
l=0;
kuchipaku_time=jikkou_list_length*henkou;
//実行口パクリストを一回アニメするのに要する時間
kurikaesi=msg_time/kuchipaku_time;
list_times=(integer)llCeil(kurikaesi);
//切り上げ、実行口パクリストを繰り返す回数、1~
llOwnerSay("jikkou_kuchipaku plays "+ (string)list_times +"times");
//実行リスト繰り返し回数チェック

while(l!=list_times){

for(m=0;m //実行口パクリスト一回実行
hyoujou_now=llList2String(jikkou_kuchipaku,m) ;
kuchipaku(hyoujou_now,henkou);
//口パクループ実行

}//for
l++;//実行口パクリスト実行カウント
llOwnerSay("jikkou_kuchipaku_list has done "+(string)l+"times/"+(string)list_times);
}//while
}//if
}
}









  
Posted by rinsui Hax at 00:34Comments(0)TrackBack(0)SL スクリプト

2007年09月24日

試作スキンで口パクテストでござる




Runarin殿より整形を命じられ、先方はシェイプ・拙者はスキンを制作致しおるが、写真は以前始めて制作致したスキンに手を加えたものでござる。
シェイプもRunarin殿試作の「nakai」を着用致しおり顔の変わりおるがお分かりじゃろう。
耳穴の風囲気が出ており申すが、これはグラデーションにてテクスチャに穴を描いてあるによるのじゃ。
拙者はFLASHでテクスチャを描いてござるが、グラデーションでの塗りと編集機能の使いでがよろしゅうござるよ。
肌がベタ塗りでマネキンの如くなっては興ざめ致そうから、FLASHで作成致した肌の下地となる無地の画像をフリーソフトのJTrimに読み込み、効果にてノイズを附加いたして地肌感をい出したつもりじゃ。
肌下・上肌ともに透明度を設定いたして重ね、頃あいな混ざり具合を調合致す手の込みようぞ。
唇や眉の輪郭をうまくぼかすに、それらの塗りをシンボル化致しスクリプトにて(拙者のFLASHはbasicにて描画パネルでのぼかし等の機能が省略されおる・・)ぼかしをかけたのじゃが、一種のぼかし設定しかできなんで眉や唇・ほほ等の部位によるぼかしの使い分けができなんだのが残念。
やりようがあるやも知れぬが本日はわからなんだのじゃ。
どうしようもなければ手間をかける他なし。
部位ごとに別作業にて保存致し、一同に読み込んで合成することになろう。(大変・・)

写真左にズラリとチャットが出現しおるは口パクテスト用のアタッチメント実験いたしおる故。
ここ3日間、中断致しおった口パクアタッチメント&HUDのスクリプトに掛かり出したのじゃが、本日ようやくにして口パクパターンを作成致すテスト用のスクリプトがうまく動いてくれたのじゃ。
ここまでに6パターンものスクリプトを書き直し致しての末。
動かん動かんで頭を抱え込んでおったがついに動き出し感激致し申した。
チャットが出ておるは、テスト中にどこで不具合が発生しおるか分るようにポイントポイントにてllOwnerSay();を設置致しおることにより申す。
ここでは何の表情アニメが実行されおるかが表示されおるのじゃが、多数の表情アニメを0.3秒ごとに切り替えおるようすなのじゃ。
切り替え秒数が長ければ口パクになり申さぬ故、短く設定いたすのじゃが、只今は未だ口パクに適当な表情アニメの組み合わせと切り替え秒数を掴んでおらず、これからの作業にて組み上げるのでござる。
19ある全ての表情アニメをリスト化致しおり、インデックス番号をチャットにて/10 3,6,7,9,10,14,3,2,0,18,5,4,7の如く入力致せば連続してアニメ致す仕組みじゃ。
切り替え秒数もチャットにて変更いたせ申す。
今回は口パクパターンを組むために拙者用に書きしスクリプト故チャット入力を利用致しおるが、製品版ではHUDを用意いたし、タッチでの口パクスタートとHUDの別ステートにてオーナーのチャットに合わせて自動的に口パク致す機能を提供致す所存。
ようやく足がかりが出来申したが、チャットに併せての口パクの大山を超えねばなり申さぬ。
拙者の修行は長そうじゃ。


  
Posted by rinsui Hax at 01:14Comments(0)TrackBack(0)SL スクリプト

2007年09月22日

クラブスタッフへのチップポスター制作にて寄付便乗!!




チップ機能が追加されテキストが上に表示されているマンガ放映

さてまたRunarin殿よりご要望じゃ。
題の如く、高級クラブ 舞踏会スタッフに飾りおるスタッフ肖像画にチップ機能を付けて欲しいとのこと。
チップはスタッフに入ることとトータルでのチップ額が表示されること2点がご要望。
先般のテレポにて入金の扱いは経験致し、チップならば返金処理もなき故そう困難はなかろうと推量いたした。
まずはテレポスクリプトを見返し入金処理をばチェック。
アニメ同様パーミッションを定数「PERMISSION_DEBIT」にて取得致すは変わらず。
編集画面にてポスターオブジェクトのタッチ動作を「オブジェクトへ支払い(pay)」に致すも同じ。
この設定にて、お客様がタッチ致せばチップ額を決めていただくダイアログが現れてくれ申す。
ダイアログの金額表示設定は

llSetPayPrice(1000, [100, 200,300,500]);

この設定では、定額設定致す4つのボタンにそれぞれ100・200・300・400L$を表示させ(表示させない場合はそれぞれにPAY_HIDEと設定いたす)、最初の1000はお客様が自由に数字を入力変更致せる金額ボックスであるが高級クラブ故1000L&の表示にして置き申した。

チップがスタッフへ直接入金されるように致すにはポスターをスタッフの所有に致してクラブに設置致せばよかろうが、Runarin殿自ら設置致せるようRunarin殿に入金されしチップがすぐさまスタッフに入金されるように致した。
ダイアログによりチップが払われればmoneyイベントが発生致すが、そこにて
llGiveMoney(staff, amount);
の引数staffにスタッフアバターのUUIDを指定致せばOKじゃ。

そこで、スタッフの名前よりUUIDを取得する関数を探し申したところ「無い」とのこと。
MIZ殿リファレンスのllHTTPRequestにその情報と、アバターの名前よりUUIDを取得致すユーザー関数が紹介されおった故それを使い取得することに致したのじゃ。
その関数はチャットの1チャンネルにアバターの名前を入力致せばサーバーデータベースに問い合わせてUUIDがチャットとして表示されるというものでござった。
プリムにスクリプトをばそのままコピペ致すだけで準備OK。
/1 rinsui Hax とチャット入力致せば即座に拙者のUUIDが表示され感動者じゃった。
これにて問題クリア致したが、何とRunarin殿にチャット頂いて控えし3名のスタッフ名のうち2名を書き間違いしおったらしく「そんな名はない」とのことじゃった・・・・

仕上げに入金後にIMにてお礼申し上げるよう完成致したのが下のスクリプトでござる。

integer befor_tip;
integer total_tip;
key staff="ここに該当スタッフアバターのUUID";

default{

state_entry(){
 //llSetTexture("Runarin_teleport_start",ALL_SIDES);//スタッフ写真はテクスチャ設定で済み
llRequestPermissions(llGetOwner(), PERMISSION_DEBIT);//for money pay to staff
llSetText("Please touch and tip!"+ "\nbefore tip is "+(string)(befor_tip)+"L$"+ " \ntotal tip is "+(string)total_tip+"L$"+"!!"+"\nRUNA mama",<0, 1, 1>, 1 );

}

run_time_permissions(integer perm) {//設置時にオーナーの出金承諾
    if (perm & PERMISSION_DEBIT){
      state pay_chip;
    } else {
      llRequestPermissions(llGetOwner(), PERMISSION_DEBIT);
    }
  }
}

state pay_chip{//チップあれば即スタッフへ入金

state_entry(){
llSetPayPrice(1000, [100, 200,300,500]);

}

touch_start(integer detected){//チップ客あり
llSetPayPrice(1000, [100, 200,300,500]);
}

money(key id, integer amount){//チップ入金~スタッフへ入金

befor_tip=amount;
total_tip+=amount;

llSetText("Please touch and tip!"+ "\nbefore tip is "+(string)(befor_tip)+"L$"+ " \ntotal tip is "+(string)total_tip+"L$"+"!!"+"\nRUNA MAMA",<0, 1, 1>, 1 );
llInstantMessage(id,"Thanks for the tip! I really appreciate it.");//お礼IM
llGiveMoney(staff, amount);//これでスタッフに返金

  }
}

これにて御仁も寄付に励めるであろう。
スタッフへの入金は不要でござれば
llGiveMoney(staff, amount);//これでスタッフに返金
これをばコメントアウト或いは消去すればよし。
オブジェクトの上に表示される文字はご自由に変えてくだされよ。

state_entry()内にもllSetPayPrice(1000, [100, 200,300,500]);を入れダブりおるが、これは利用中にダイアログの金額設定を変更いたしてのリセットが反映されるようにでござる。
テレポでも入れており申したが、これは不要ではと削除いたして作成しおったところ、ダイアログ設定を変更致し、次いでスクリプト編集画面にてリセットをなしても数字が変わらんで必要性が分った次第。(なければ再REZが必要)

拙者もこれを機にショップにて無料上映いたしおるマンガにチップ機能を加え申した。
チップオブジェクトを透明に致しマンガを覆うように設置するだけで有り難き機能アップじゃ。
是非お試し下され!!(笑)


  
Posted by rinsui Hax at 17:39Comments(0)TrackBack(0)SL スクリプト