2007年04月23日
【asa】ネタ製作とその実現2 代替手段に学ぶ
えー、実は、このblogでは「目指せハンカチ王子」ってことで野球のピッチャーをモチーフにしました。
が、実際には違うものをネタとして仕込んでいる最中だったりします。
ま、一部の方々にはバレバレですが、ここではヒミツってことにしておきますw
で、そのネタの骨子は「野球のピッチャー」に似ています。
これ、結構色々試すもどうもうまくいかなかったりしていました。
が、wahiさんからの一言を受けて視点を変えたら、アッサリ解決しました。
どこで悩んでいたかというと、野球の例で言えばボールを飛ばすところです。
wahiさんから言われたひとことは「銃に似てる」でした。
この助言には2つの大きな意味がありました。
1.LSLのWikiにスクリプト例が存在し、流用可能なこと
2.モノがまっすぐに飛んで行くスクリプト例として適していること
実際、LSLを使ってモノを飛ばす方法には何通りか考えられるのですが、今回の件では銃弾を動作させるスクリプトが良い題材になった、ということです。
前回、
llStartAnimation("pitching");
llSleep(2.5);
こんなことを書きました。
ここから、LSL Wikiに掲載されている銃弾のスクリプト例を参考にして追加すると以下のような感じ。
llStartAnimation("pitching");
llSleep(2.5);
// 自分の身長(idはattachイベントハンドラの引数等で得られるAvatarのid)
vector size = llGetAgentSize(id);
// rezする高さ調整用の係数
vector offset = <0, 0, 0.84>;
// 身長の半分に係数(0.84)を掛け合わせた高さ。
offset.z *= size.z / 2.0;
// 自分の位置と身体の向きの取得。
rotation rot = llGetRot();
// 自分の向き(方角)を基準にした場合のX方向(前方)の方角を、絶対的な方角に変換
vector dir = llRot2Fwd(rot);
// rezする位置を、現在の位置に身長に応じたオフセット分とオブジェクト1基準分ずらした所に設定
vector pos = llGetPos() + offset + (dir * 1.0);
// "ball"という名のobjectを、位置pos, 動作はdir(基準)の7倍の値でX方向に飛ばす。向きは元のオブジェクトと同じ(rot)。
// というような意味。
llRezObject("ball", pos, dir * 7.0, rot, 0);
// ...
おっと。上の例は「飛ばす玉」ではなく「持つ玉」に実装する内容です。attach()イベントあたりで実装することになるでしょう。
ここでは「飛ばす玉」をどこかに出現(rez)させそれを前方に飛ばす、というところを実現しています。
それと、前回もそうですが、今回も、コピペでそのままうごく例を載せていないのはわざとですw
スクリプト例をblogに公開するならコピペで動くものを載せますが、説明の一部なのであえてこのような形にしていますので、あしからず。
さて「飛ばす玉」。
SLでは、どこかにふっ飛ばした玉は、なにも処置していないとロストボールになります。
自動でロストボールを返却してくる設定(auto return)を施している土地もありますが、基本放置されます。
放置されてると、その土地の持てるプリム数を喰い尽くすことにもなるので迷惑をかけますし、土地の所有者にreturnさせる手間をかけさせることになります。
場合によっては放置された土地の所有者に通報(Report abuse)されることも考えられなくもありません。
なので、飛ばしモノについては自滅処理の作り込みをしておくのが良いです。
基本的に飛ばすものについては「このオブジェクトは●秒後に自動消滅する」という作り込みをしておくのが吉。
またSLのオブジェクトにはTemp-on-rezという属性があります。
詳細は後述しますが、このてのものにはこの属性を付けておくのが吉です。
まず、オブジェクトの自己消滅は、llDie()というFunctionで実現します。
玉がrezされて30秒後にllDie()でオブジェクトを自己消滅させる、というような実装をしておきます。
方法は、llSleep()で待たせるとか、llSetTimerEvent()とtimer()イベントを使う形ですね。
飛んでる間にもなにか動作させたい(変化球とか消える魔球とか)する場合、llSleep()では都合が悪い(飛ばしながらの処理ができない)ので、llSetTimerEvent()/timer()イベントを使うほうが良いかもしれません。
次にTemp-on-rez属性。一時Rezとでもいいましょうか。
この属性をプリミティブ、オブジェクトに与えておくと、一定期間後に勝手に消えます(何秒後だったかな?)。
更にこの属性が付いている場合には、Rezされた土地のプリミティブを消費しません(これが大きなメリットです)。
属性は、EditメニューからObjectタブのTemporaryというところにチェックすればOKですが、これを定常的に付けてると、地面にdropしてEditしている時、油断すると勝手に消えてしまいます(笑)。
なので、いじる時はまずTemporaryのチェックを外すこと、保存してインベントリに戻す時にはチェックすること、が必要です。
また、この属性は、LSLからも与えることができるので、動的に行う方法もあります。
ただこれを実施するためのFunction(llSetPrimitiveParams())は、ちょっと処理が重く、やや悩みの種でもあります。
llSetPrimitiveParams([PRIM_TEMP_ON_REZ, TRUE]);
えーと、またもや疲れてしまったので今日はここまで(笑)
実に中途半端なんだけど(爆)
が、実際には違うものをネタとして仕込んでいる最中だったりします。
ま、一部の方々にはバレバレですが、ここではヒミツってことにしておきますw
で、そのネタの骨子は「野球のピッチャー」に似ています。
これ、結構色々試すもどうもうまくいかなかったりしていました。
が、wahiさんからの一言を受けて視点を変えたら、アッサリ解決しました。
どこで悩んでいたかというと、野球の例で言えばボールを飛ばすところです。
wahiさんから言われたひとことは「銃に似てる」でした。
この助言には2つの大きな意味がありました。
1.LSLのWikiにスクリプト例が存在し、流用可能なこと
2.モノがまっすぐに飛んで行くスクリプト例として適していること
実際、LSLを使ってモノを飛ばす方法には何通りか考えられるのですが、今回の件では銃弾を動作させるスクリプトが良い題材になった、ということです。
前回、
llStartAnimation("pitching");
llSleep(2.5);
こんなことを書きました。
ここから、LSL Wikiに掲載されている銃弾のスクリプト例を参考にして追加すると以下のような感じ。
llStartAnimation("pitching");
llSleep(2.5);
// 自分の身長(idはattachイベントハンドラの引数等で得られるAvatarのid)
vector size = llGetAgentSize(id);
// rezする高さ調整用の係数
vector offset = <0, 0, 0.84>;
// 身長の半分に係数(0.84)を掛け合わせた高さ。
offset.z *= size.z / 2.0;
// 自分の位置と身体の向きの取得。
rotation rot = llGetRot();
// 自分の向き(方角)を基準にした場合のX方向(前方)の方角を、絶対的な方角に変換
vector dir = llRot2Fwd(rot);
// rezする位置を、現在の位置に身長に応じたオフセット分とオブジェクト1基準分ずらした所に設定
vector pos = llGetPos() + offset + (dir * 1.0);
// "ball"という名のobjectを、位置pos, 動作はdir(基準)の7倍の値でX方向に飛ばす。向きは元のオブジェクトと同じ(rot)。
// というような意味。
llRezObject("ball", pos, dir * 7.0, rot, 0);
// ...
おっと。上の例は「飛ばす玉」ではなく「持つ玉」に実装する内容です。attach()イベントあたりで実装することになるでしょう。
ここでは「飛ばす玉」をどこかに出現(rez)させそれを前方に飛ばす、というところを実現しています。
それと、前回もそうですが、今回も、コピペでそのままうごく例を載せていないのはわざとですw
スクリプト例をblogに公開するならコピペで動くものを載せますが、説明の一部なのであえてこのような形にしていますので、あしからず。
さて「飛ばす玉」。
SLでは、どこかにふっ飛ばした玉は、なにも処置していないとロストボールになります。
自動でロストボールを返却してくる設定(auto return)を施している土地もありますが、基本放置されます。
放置されてると、その土地の持てるプリム数を喰い尽くすことにもなるので迷惑をかけますし、土地の所有者にreturnさせる手間をかけさせることになります。
場合によっては放置された土地の所有者に通報(Report abuse)されることも考えられなくもありません。
なので、飛ばしモノについては自滅処理の作り込みをしておくのが良いです。
基本的に飛ばすものについては「このオブジェクトは●秒後に自動消滅する」という作り込みをしておくのが吉。
またSLのオブジェクトにはTemp-on-rezという属性があります。
詳細は後述しますが、このてのものにはこの属性を付けておくのが吉です。
まず、オブジェクトの自己消滅は、llDie()というFunctionで実現します。
玉がrezされて30秒後にllDie()でオブジェクトを自己消滅させる、というような実装をしておきます。
方法は、llSleep()で待たせるとか、llSetTimerEvent()とtimer()イベントを使う形ですね。
飛んでる間にもなにか動作させたい(変化球とか消える魔球とか)する場合、llSleep()では都合が悪い(飛ばしながらの処理ができない)ので、llSetTimerEvent()/timer()イベントを使うほうが良いかもしれません。
次にTemp-on-rez属性。一時Rezとでもいいましょうか。
この属性をプリミティブ、オブジェクトに与えておくと、一定期間後に勝手に消えます(何秒後だったかな?)。
更にこの属性が付いている場合には、Rezされた土地のプリミティブを消費しません(これが大きなメリットです)。
属性は、EditメニューからObjectタブのTemporaryというところにチェックすればOKですが、これを定常的に付けてると、地面にdropしてEditしている時、油断すると勝手に消えてしまいます(笑)。
なので、いじる時はまずTemporaryのチェックを外すこと、保存してインベントリに戻す時にはチェックすること、が必要です。
また、この属性は、LSLからも与えることができるので、動的に行う方法もあります。
ただこれを実施するためのFunction(llSetPrimitiveParams())は、ちょっと処理が重く、やや悩みの種でもあります。
llSetPrimitiveParams([PRIM_TEMP_ON_REZ, TRUE]);
えーと、またもや疲れてしまったので今日はここまで(笑)
実に中途半端なんだけど(爆)
【asa】おーねがいattach!attach!
【asa】 ランラン乱数で おみくじ!
【asa】スクリプトに日本語しゃべらせるアレの支援ツール
【asa】気まぐれLSL tips:ちゃんと座ってよ;;
【asa】ネタ製作とその実現3 ぱーみっしょん
【asa】ネタ製作とその実現1 目指せハンカチ王子
【asa】 ランラン乱数で おみくじ!
【asa】スクリプトに日本語しゃべらせるアレの支援ツール
【asa】気まぐれLSL tips:ちゃんと座ってよ;;
【asa】ネタ製作とその実現3 ぱーみっしょん
【asa】ネタ製作とその実現1 目指せハンカチ王子
Posted by mina Cookie at 18:39│Comments(3)
│学習
この記事へのコメント
おつかれ~(笑)。
続きも期待です。
続きも期待です。
Posted by せき at 2007年04月23日 21:23
どもですー。
次書くのがいつかは不明ですがw
次書くのがいつかは不明ですがw
Posted by asa at 2007年04月24日 09:48
一切勉強しない怠け者の俺には最適なシリーズですよ(笑)。
会議そっちのけで書くしかっ(笑)。
会議そっちのけで書くしかっ(笑)。
Posted by せき at 2007年04月24日 22:10
※このブログではブログの持ち主が承認した後、コメントが反映される設定です。