「サイコロ」と「コイントス」っす

ぺんぎん

2009年04月26日 00:41


2009-04-25のスクリプターズ・カフェっす。
お題を持っていったっす。
「サイコロ」と「コイントス」についてっす。
どうもぺんぎんっす( ◎v◎ )


やってるのは、
1.サイコロを投げ上げる(サイコロは物理っす)
2.止まったら結果をSay&Die
これだけっす。

問題になってるのは「止まったら」の部分っす。
調べてもらえれば分かるんっすけど、
ピッタリなイベントがないっす。
[速度と角速度が一定値を下回った]という判定をしないとダメっす。

これまで使用していたのはcollisionland_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が届かないっていうことっす。
物理プリムが上空から落ちてくるのも問題っすけど・・・


っていうのをタイニー制作教室を覗きながら妄想してたっす。
たぶんこんな感じっすよね?
スクリプト