着地判定とか(1)

さて、まだまだ続く判定話としましては、アクションゲームとかの着地判定を考えてみたいと思います。着地はキャラを常に落下させておいて、キャラの足元の判定と地面の判定がぶつかったら、地面にメリ込んだと判断し、地面の上までキャラを持ち上げる処理を書くとよいでしょう。とりあえずそこのところの処理を。

// キャラを持ち上げる
void OnGraund(POINT* MyPos, AtariRect* GraundRect)
{
  // MyPos : 自機の座標
  // GroundRect : 地面の判定

  const int SenoTakasa = 16; // キャラの背の高さ(地面からキャラクタ座標までの長さ)

  MyPos->y = GroundRect->top - SenoTakasa;
}

地面にメリ込んだかどうかに、いつもの矩形(キャラの足)-矩形(地面)の判定を使ってやればいいのですね。フローのイメージは以下みたいな感じです。

CHanteiList ListJimen;

MainLoop
{

  foreach( 地面オブジェクト )
  {
    ListJimen.SetHantei( 地面判定 );
  }

  // 自機を動かす
  {
    if( ListJimen.IsAtari( 自機の足判定 ) )
    {
      OnGraund( 自機の座標, 接触した地面の判定 );
    }
  }

  JimenList.Reflesh();
}

こんな感じでOK。地面オブジェクトには、地形だけでなく、敵キャラなんかも範疇に入れられます。敵キャラの動作部分で判定の登録などを行えば、乗ることのできる敵キャラとかもつくれます。ついでに云えば、敵キャラの接地判定も同じリストを使えばできそうですね。

なんですが、なんですが、「敵キャラの上に敵が乗る」とかやろうとすると、自体は色々と面倒になってくるのです。つづきはまた。