ぺんぎん
2009年04月26日
00:41
2009-04-25のスクリプターズ・カフェっす。
お題を持っていったっす。
「サイコロ」と「コイントス」についてっす。
どうもぺんぎんっす( ◎v◎ )
やってるのは、
1.サイコロを投げ上げる(サイコロは物理っす)
2.止まったら結果をSay&Die
これだけっす。
問題になってるのは「止まったら」の部分っす。
調べてもらえれば分かるんっすけど、
ピッタリなイベントがないっす。
[速度と角速度が一定値を下回った]という判定をしないとダメっす。
これまで使用していたのはcollisionとland_collisionっす。
このイベント内で「止まった」かどうかの判定をしてたっす。
[何かに触れている]かつ[速度と角速度が一定値を下回った]っていう
モロに直接的な表現っす。
問題なのはいつ終わるか分からないってことっす。
何度も何度も判定処理が起こるっす。
ココをもうちょっと、何か・・・こう・・・スマートなやり方はないっすかね?
っと思ったわけっす。
で、っす。
timerを使ったらどう?という話になったっす。
頭の中でのイメージは、
//***********
// グローバル変数
//***********
vector 位置;
//*************
// state default
//*************
default
{
on_rez(integer start_param)
{
llSetTimerEvent(この時間までにcollisionしないとDie);
位置 = llGetPos();
}
collision_start(integer num_detected)
{
llSetTimerEvent(0.0);
state check;
}
land_collision_start(vector pos)
{
llSetTimerEvent(0.0);
state check;
}
timer()
{
llDie();
}
}
//************
// state check
//************
state check
{
state_entry()
{
llSetTimerEvent(最初の停止判定までの間隔);
}
timer()
{
if(位置とllGetPosとの距離が一定値以上)
{
llDie();
}
if(速度と角速度が一定値を下回った)
{
結果通知;
Dieも忘れないで;
}
else
{
llSetTimerEvent(停止判定の間隔);
}
}
}
グローバル変数に位置を持っているのは、
例えば、スカイボックスで投げて、転げ落ちたときのためっす。
ぴゅーっと落ちて、止まるのは地上っすからね。
そもそもSayが届かないっていうことっす。
物理プリムが上空から落ちてくるのも問題っすけど・・・
っていうのをタイニー制作教室を覗きながら妄想してたっす。
たぶんこんな感じっすよね?