またもや引越しです。
今回の引越しは、このブログに何か問題があるということではなくて、引越し先に、スクリプトをきれいに書いてくれる機能がある!という単純な理由です。
引越し先はこちら
http://www4.atword.jp/lovemax/
(今システムを修理中のようです…2013/9/16)
(サービス終了になるそうです…2014/4/30)
2012/06/16
むふふなHUD
むふふ商品を使うときに、チャットでタイプするのが面倒なら、HUD(ヘッドアップディスプレイ)を使ってマウスのクリック(タッチ)だけですます方法もあります。
写真のようなものを装着すると、画面上中央のように見えます。
そのマークをタッチするというのは、装着したオブジェクトをタッチしているわけです。
HUDのスクリプトでは、タッチした面の面番号に割当てたマークを、専用のチャンネルでむふふ商品に伝えます。
default {
touch_start(integer num_detected) {
string mark = llList2String( Marks,
llDetectedTouchFace(0) );
// タッチした面に対応するマーク
string message = (string)llGetOwner()+":"+mark;
// 所有者キーと一緒に送る(万一の混線防止)
llWhisper( HUDchannel, message );
}
}
むふふ商品側では、それを聞いて、角度を変えたり変形させたりするわけです。実際のスクリプトはチャットも聞きますが、ここでは省略しています。
default {
state_entry() {
llListen( HUDchannel, HUDname, NULL_KEY, "" );
// HUD専用チャンネルで連絡を待つ
}
listen( integer channel, string name, key id, string message ) {
string s;
integer n = 1;
if ( channel == HudChannel ) { // HUDチャンネルから聞こえた
list info = llParseString2List( message, [":"], [] );
if ( llGetOwner() != llList2Key(info,0) ) return; // 混線防止
s = llGetSubString(llList2String(info,1),0,0);
}
// (角度変更部分も省略)
else if ( s == "*" ) { // 「*」マークなら
llMessageLinked(LINK_THIS,Transform, // 変形スクリプトに連絡
"Transform:" + (string)TransSteps, NULL_KEY);
}
}
}
2012/06/15
むふふな変身
むふふな商品には2種類あって、男性用と女性用です。
めんどくさいのは男性用で、元気なときと休憩のときでは、形がかなり違うので、「変身」させなければなりません。
例によって写真はお人形?で代用してます。
この変身の命令は、チャットで「/8*」のように言いますが、本体スクリプトがチャットを聞き、変身専用のスクリプトに「Transform:10」のような連絡を送り、変身はこの専用スクリプトが行います。
変身スクリプトには、あらかじめ元気なとき(オン)と休憩中(オフ)の各プリムパーツの位置・大きさ・角度などのパラメータが記録されています。
オンとオフの数字の切り替えが「変身」というわけですが、実際には一気に替えるのではなく、何段階かのステップを踏んで少しづつ変えます。
こうすると見た目には、にょきーっと立ち上がったり、ふにゃ~としぼんだり、アニメーションのように見えるのですね。
変身スクリプト(全部は長いので、かなり省略しています)
list Params = [
<3.8,0,-2.4>,<6,6,5>,<0,40,0>, <7,0,-0.2>,<15,6,5.5>,<0,0,0>, // 体
<4.5,0,-4>,<6,5,6.5>,<0,0,90>, <12,0,0>,<7,8,6>,<0,0,90> // 頭
]; // オフのときの位置・大きさ・角度、オンのときの位置・大きさ・角度
stepForm( float step ) { // 変身中の各段階の形
list rules;
integer link = 2;
for ( ; link<=3; ++link ) { // リンクしている各部品に
rules = [PRIM_POSITION, stepParams(link,step,0) * Ratio]; // 各数字の設定
rules += [PRIM_SIZE, stepParams(link,step,1) * Ratio];
rules += [PRIM_ROT_LOCAL, llEuler2Rot(stepParams(link,step,2)*DEG_TO_RAD)];
llSetLinkPrimitiveParamsFast(link,rules); // 各部品にパラメータを設定
}
}
transForm(integer n) { // n段階で変身
integer i = 1;
float step;
for ( ; i<=n; ++i ) {
if (Active == 1) step = (float)i/(float)n; // オフ→オンのとき
else step = (float)(n-i)/(float)n; // オン→オフのとき
stepForm( step ); // 変身中の各段階の形
}
}
default {
link_message(integer from, integer script, string msg, key id) {
list info = llParseString2List( msg, [":"], [] );
if ( llList2String(info,0) == "Transform" ) { // 「変身」の連絡を受ける
integer n = (integer)llList2String(info,1); // 変身の段階数
if (Active == 1) Active = 0; // オン/オフの切り替え
else Active = 1;
transForm(n); // n段階で変身
}
}
}
2012/06/14
むふふな角度調整
さて、そもそものはじまりのアダルト用品ですが、むふふな時に一番大事なのは角度調整だと思います。
角度ぴったりだと、らぶらぶ度もぐんとアップしますね。
写真は、本物では刺激が強すぎるかもしれないので、お人形?で代用してます。
左がもとの状態だとすると、右のは30度ほど傾いてます。
角度を調整するためには、チャットで「/8++」のように言います。
「/8」はチャンネル指定、「+」「-」が5度きざみの角度指定で「++」なら10度アップになります。
「/8.」でもとに戻ります。
スクリプトでは
default {築地のお店はこちら(SLurl)
state_entry() {
llListen( ChatChannel, "", llGetOwner(), "" );
// 指定チャンネルで所有者の命令を聞く
llSetRot(llAxisAngle2Rot(Axis,Angle*DEG_TO_RAD));
// 回転軸と角度で回転を設定
}
listen( integer channel, string name, key id, string message ) {
string s = llGetSubString(message,0,0); // 先頭の文字
integer n = llStringLength(message); // 文字列の長さ
if ( s == "+" || s == "-" ) { // 先頭が「+」「-」なら
if ( s == "+" ) Angle += Step * n; // 角度を変更
else Angle -= Step * n;
llSetRot(llAxisAngle2Rot(Axis,Angle*DEG_TO_RAD)); // 回転を設定
}
else if ( s == "." ) llResetScript(); // 「.」もとに戻る
}
}
http://slurl.com/secondlife/TSUKIJI/90/47/22/
ただし、むふふな商品は地上には置いてません。
上空のアダルト用品売場にあります。(テレポートで行けます)
または通販ショップからどうぞ。
https://marketplace.secondlife.com/stores/97156
2012/06/13
飛行船のプロペラの回転
飛行船のプロペラは、動きに合わせて回転するようになってます。
本体のスクリプトからリンクメッセージで連絡をもらって、回転の向きや速度を変えます。
飛行船アバターの場合は、アニメーション名を聞いて速度だけ変えてます。
(「飛行船アバターのAO」で説明しているスクリプトでは連絡の部分は省略しています)
飛行船アバターのプロペラのスクリプト
vector Axis = <1,0,0>; // 回転軸:X
float Fwd = -PI; // 左プロペラの回転、右はPI
default {
state_entry() {
llTargetOmega(ZERO_VECTOR,0,0);
}
link_message(integer from, integer int, string msg, key id) {
// 再生中のアニメーション名を聞く
float spin;
if (msg == "hover") spin = Fwd * 0.5; // 回転速度を変える
else if (msg == "walk") spin = Fwd;
else if (msg == "fly") spin = Fwd * 2;
else llResetScript();
llTargetOmega(Axis, spin, 1); // 軸の周りを回転
}
}
2012/06/12
飛行船アバターのAO
飛行船アバターを作ったきっかけは、写真の初期アバターです。
人格なしのアカウントのつもりだったので、どうせなら、とまったく人に見えないのを選んだわけですが(ほかに動物やロボット、車型もありました)、人型でも初期アバターに不満がでてくるように、他人の作った姿のままでいるのは抵抗あったので、自分で作り直しました。
アダルト商品取り扱いなので、ちょっとワイルド風味に海賊ぽいマークをつけて、その流れで人型の服装も海賊コスプレなわけです。
(商品の飛行船は、海賊マークなしです。)
アバターのアニメーションも自前のに変えました。
といっても、ふわふわ高さを変えたりする程度ですが、手足のない飛行船に細かいアニメーションは必要ないので都合よいです。
下のスクリプトは、アニメーションを自分のに変更する、つまりAO(アニメーションオーバーライド)ですね。
default {LSLポータルのllGetAnimation()のところに組込アニメーションの説明と簡単なAOのサンプルがあります。
attach(key id) {
if (id) { // 装着されたらアニメーション変更の許可を依頼
llRequestPermissions(id, PERMISSION_TRIGGER_ANIMATION);
Id = id;
}
else { // とり外されたら今のアニメーションを止める
if (Anim) llStopAnimation(Anim);
llResetScript();
}
}
run_time_permissions(integer perm) { // 継続的に
if (perm & PERMISSION_TRIGGER_ANIMATION) llSetTimerEvent(0.2);
}
timer() {
string anim = llGetAnimation(Id); // 再生中のアニメーションを調べる
if (anim == "Walking") anim = "walk"; // 組込アニメーションを自分のに変更
else if (anim == "Running" || anim == "Flying") anim = "fly";
else anim = "hover";
if (Anim == anim) return; // 前と同じなら 戻る
if (Anim) llStopAnimation(Anim); // 前のアニメーションを止める
llStartAnimation(anim); // 新しいアニメーションを始める
Anim = anim;
}
}
http://wiki.secondlife.com/wiki/LlGetAnimation/ja
2012/06/11
オンライン伝言板
築地のお店にオンライン伝言板を置いています。
タッチしてチャットで何か言うと、私がオンラインのときに伝言として送ります。
何も用事はなくても、ひやかしでもいいので、何か送ってみてください。
「ブログ見たよ」でもいいので^^
スクリプトでは、タッチした人の伝言が聞こえたらそれを記録して、私がオンラインかどうか問合せ、オンラインだったら伝言を送ります。
一定時間たっても何も聞こえないときは、聞くのをやめます。
問合せてもしオフラインだったら何もしないのですが、一定時間ごとにオンラインかどうか問合せするので、オンラインになった時にまとめて送るしくみになってます。
実際のスクリプトは、オンライン/オフラインの表示など、もっといろんなこともしてますが、伝言を聞いて送る部分はこんな感じです…。
default {
state_entry() {
Owner = llGetOwner();
llSetTimerEvent(StepTime);
}
touch_start(integer touch_num) { // 誰かがタッチしたら
llWhisper(0, "Say your message on chat.");
Handle = llListen(0, "", llDetectedKey(0), ""); // 伝言を待つ
llSetTimerEvent(StepTime);
}
listen(integer channel, string name, key id, string message) { // 伝言を聞いたら
llWhisper(0, "Thank you for your message.");
removeListen(); // 聞くのをやめる
Messages += name+": "+message; // 名前と伝言を記録
llRequestAgentData(Owner, DATA_ONLINE); // オンラインを問合せ
}
timer() { // 一定時間たったら
if (Handle) removeListen(); // 伝言待ちなら聞くのをやめる
llRequestAgentData(Owner, DATA_ONLINE); // オンラインを問合せ
}
dataserver(key query, string online) { // 問合せの答
if ((integer)online == TRUE && Messages != []) {
// 所有者がオンラインで、伝言があればIMを送る
llInstantMessage(Owner, llDumpList2String(Messages,"\n\t"));
llResetScript();
}
}
}
築地のお店
登録:
投稿 (Atom)






