2008年03月14日
【中級】センサースクリプトに挑戦
こんばんは、ジョビンです。
あしあとをたどってみたら MasterPoppy Amat さんという方が
センサースクリプトを公開されていました。
http://masterpoppy.slmame.com/e172204.html
なるほどなるほど。
こうやって方角を検知するんですね。
トラックバック歓迎とのことでしたので、
私もセンサーに挑戦してみました!
はじめましてのご挨拶にトラックバック。
ちなみに、決してどっちのスクリが正解とかそういうことを言いたいわけではありません。
私は、スクリプトを公開することはとてもいいことだと思っています。
スクリプター同士が、お互いの手法を見ながら学びあうのは、さらにすばらしいことだと思っています。
ですから、MasterPoppy さんから学ばせていただいたジョビンが
お返しに公開するエントリーです。
やってるもの同士お互いに刺激が受けられますし、
同じものを違う角度から見るとまた理解が深まるでしょう。
この記事を見られる方々に、そのように受け取っていただければ幸いです。
テストはしていないので、動作は保障しません。
動かした方、結果を教えていただければ幸いです。
実はこの記事は一週間前に公開したんですが
帰宅後インで実験したらひどい結果になったので
あわてて非公開にしたんでした^^;
違いはこの行だけです。
分解して順番に見ていきましょう。
この行は 元のソースのままです。
値は - PI ~ PI になります
こうすると - 0.5 ~ 0.5
になります。
ここまでは大丈夫でしょうか?
これで、 0~8 になりました
これを %8 で0~7にして
リストのインデックスとして使っています
if 文で 1から順番に8回比べるより、
こっちのほうが短くかけます。
このリストの使い方は、たいへん応用が利くし
計算の回数を減らすことのできるテクニックなので、
ぜひ紹介したいとおもいこのエントリーを書きました。
以上 センサー ジョビン風でした。
MasterPoppy Amat さん ありがとう!
あしあとをたどってみたら MasterPoppy Amat さんという方が
センサースクリプトを公開されていました。
http://masterpoppy.slmame.com/e172204.html
なるほどなるほど。
こうやって方角を検知するんですね。
トラックバック歓迎とのことでしたので、
私もセンサーに挑戦してみました!
はじめましてのご挨拶にトラックバック。
ちなみに、決してどっちのスクリが正解とかそういうことを言いたいわけではありません。
私は、スクリプトを公開することはとてもいいことだと思っています。
スクリプター同士が、お互いの手法を見ながら学びあうのは、さらにすばらしいことだと思っています。
ですから、MasterPoppy さんから学ばせていただいたジョビンが
お返しに公開するエントリーです。
やってるもの同士お互いに刺激が受けられますし、
同じものを違う角度から見るとまた理解が深まるでしょう。
この記事を見られる方々に、そのように受け取っていただければ幸いです。
// Work Space
vector direc_v;
integer dirc_idx;
string Text;
string line;
integer dist;
// Constant Value
list dirc_list = ["W","SW","S","SE","E","NE","N","NW"];
float RAD_TO_IDX;
default
{
on_rez(integer n){ llSetText("",<0,0,0>,1.0); llResetScript(); }
state_entry()
{
RAD_TO_IDX = 8 / (TWO_PI);
llSensorRepeat("", "", AGENT, 500, TWO_PI, 3.0);
}
sensor(integer num)
{
Text = "";
integer i;
for(i=0; i{
direc_v = llDetectedPos(i) - llGetPos();
dirc_idx = llRound(llAtan2(direc_v.y,direc_v.x)/TWO_PI*8+4); // dirc_idx = 0 ~ 7
dist = llRound(llVecMag(direc_v));
line += llDetectedName(i);
line += "[";
line += (string)dist+"m ";
line += llList2String(dirc_list,dirc_idx%8);
line += "]";
Text += line + "\n";
}
llSetText(Text, <1.0,1.0,1.0>, 1.0);
}
no_sensor()
{
llSetText("NO AVATAR", <0.8,0.5,0.5>, 1.0);
}
changed(integer c)
{
if(c & CHANGED_TELEPORT)
llSetText("",<0.0,0.0,0.0>,1.0);
}
}
動かした方、結果を教えていただければ幸いです。
実はこの記事は一週間前に公開したんですが
帰宅後インで実験したらひどい結果になったので
あわてて非公開にしたんでした^^;
ポイント
dirc_idx = llRound(llAtan2(direc_v.y,direc_v.x)/TWO_PI*8+4); // dirc_idx = 0 ~ 7
違いはこの行だけです。
分解して順番に見ていきましょう。
llAtan2(direc_v.y,direc_v.x)
この行は 元のソースのままです。
値は - PI ~ PI になります
llAtan2(direc_v.y,direc_v.x)/TWO_PI
こうすると - 0.5 ~ 0.5
になります。
ここまでは大丈夫でしょうか?
llAtan2(direc_v.y,direc_v.x)/TWO_PI*8+4
これで、 0~8 になりました
これを %8 で0~7にして
リストのインデックスとして使っています
line += llList2String(dirc_list,dirc_idx%8);
if 文で 1から順番に8回比べるより、
こっちのほうが短くかけます。
このリストの使い方は、たいへん応用が利くし
計算の回数を減らすことのできるテクニックなので、
ぜひ紹介したいとおもいこのエントリーを書きました。
お礼
以上 センサー ジョビン風でした。
MasterPoppy Amat さん ありがとう!