ゲーム開発30:坂道との当たり判定

坂道との当たり判定だいぶ間があいたけど、いくつかの処理を追加しました。

マップチップをシンプルに
ドット絵をあれこれいじくり回してたけど、結局シンプルな形にしてしまいました。地味だけど仕方ない。そのうちマップチップを増やして、奥行きを表現したいです。

縦スクロール対応
今までは横スクロールしかしませんでしたが、マップエディタ導入を機にマップサイズを可変にし、縦にもスクロール出来るようにしました。横と違い、staticな変数を持って、ゆっくりスクロールするようにしてます。縦が激しいと酔う。

坂道に対応
坂道を上り降り出来るようになりました。方法は線分の交差判定を使ってます。キャラクタの足元を横一直線の線分とし、坂道の線分との重なりで当たり判定を取っています。この方法なら複雑な地形も簡単に作れるなぁ。実装はネット上にあったコードを参考に組んでます。

処理落ち(汗)
大した事してないはずなのに処理落ち(フレームスキップ)が起きてました。ちなみに50fpsだと大丈夫なのに、60fpsだと処理落ち。もしかしたら単にフレームレートの計算ミスの可能性もあるけど、何にしても原因を特定しなきゃなぁ。

引き続き坂道の処理を作ります。実はまだちょっと挙動がおかしい。

//-----------------------------------------------------------------------------
// 交差判定
BOOL CField::CrossLine(POINT p1, POINT p2, POINT q1, POINT q2)
{
 float A, B, C, D;
 BOOL ret=TRUE;

 A=(float)(p2.y-p1.y);
 B=(float)(p1.x-p2.x);
 C=-(A*p1.x+B*p1.y);
 D=(A*q1.x+B*q1.y+C)*(A*q2.x+B*q2.y+C);

 if (D>0) {
  ret=FALSE;
 }
 else {
  A=(float)(q2.y-q1.y);
  B=(float)(q1.x-q2.x);
  C=-(A*q1.x+B*q1.y);
  D=(A*p1.x+B*p1.y+C)*(A*p2.x+B*p2.y+C);

  if (D>0) {
   ret=FALSE;
  }
 }
 return ret;
}

コメントを残す

メールアドレスが公開されることはありません。