やっと、壁ずりさせることに成功しました。しかし実際のゲームでは、これだけではまだ不十分です。
ゲームのステージマップでは、凹凸な壁が存在するため、この他にも細かな処理が必要となります。
☆ 壁ずり処理のながれ
1. 移動先での当たり判定
2. 精度による誤差
3. すり抜け防止
4. フィードバックの問題
5. 簡単なトリック
以下で、これらを掻い摘んで解説します。
1.移動先での当たり判定

A,B : 壁の線分
p1 : プレイヤー現在値(今は過去値)
p2 : プレイヤー未来値(今は過去値)
p3 : プレイヤーの移動元(今はプレイヤーの現在値にあたる)
p4 : プレイヤーの移動先(今はプレイヤーの未来値にあたる)
壁ずりをしたのだから、プレイヤーは壁を沿うようにp3からp4に移動したことになります。
移動したと言う事は移動先に壁があるかも知れません。
ここでp3p4を使って再度壁の当たり判定をする必要が出てきます。
2.精度による誤差

p3 : プレイヤーの現在値
n : 壁の法線ベクトル
(ちなみに、この図は超スーパー拡大図です。)
再度当たり判定を始めるのですが、ここで問題が出てくるのです。
現在値p3が壁のライン上にある事で、どうも計算した時に精度誤差から、
壁が検出できずに壁を突き抜けてしまう時があるのです。
これを防ぐため壁の法線ベクトルnの方向に、限りなく近く手前にp3を戻してあげます。
3. すり抜け防止
p1 : プレイヤー現在値1
p2 : プレイヤー未来値1
p3 : プレイヤー現在値2
p4 : プレイヤー未来値2
p5 : プレイヤー現在値3
p6 : プレイヤー未来値3
ABC : 壁線分
精度による誤差も解消したので、p3p4を使って再度当たり判定を始めます。
ここで壁が検出されなければ何も問題はないのですが、もし壁が検出され
同様に壁ずりの処理をしてしまうと、図のような問題が起きてしまいます。
説明すると、まずプレイヤーp1p2が壁線分ABと壁ずりをします。
プレイヤーはp3p4となり、再度当たり判定をし壁線分BCが検出され、同様に壁ずりをします。
するとプレイヤーはp6の位置に移動してしまい、壁をすり抜けてしまうのです。
再度プレイヤーp5p6でも同じ結果を繰り返すだけなので、それを止めてあげます。
プレイヤー線分p3p4と壁線分BCの交点p5を用い、p4をp5の位置でストップさせます。
なので、壁ずりをした移動先に壁があった場合はその交点の位置で止めればいいのです。
またここでもライン上の問題が起きるので、同じように手前に戻してあげます。
4.フィードバックの問題
90度以下の壁だと、手前に戻された時に
越えてはいけない壁まで越えてしまう。
90度以上なら、手前に戻されても大丈夫。
(ちなみに、この図は超スーパー拡大図です。)
精度による誤差で、プレイヤーを壁の少し手前に戻しましたよね。
なんとこれが原因で、90度以下のライン角度だと手前に戻されたときに、
越えてはならない壁までも一緒に通り越してしまうのです。
ではどうすればいいのでしょうか?このままでは永久に壁の当たり判定が出来ません。
どうするかと言うと、90度以下のライン角度を作らなければいいのです。
5.簡単なトリック
(ちなみに、この図は超スーパー拡大図です。)
90度以下のライン角度が作れないと言う事は、壁の形が限定され思い通りに作れない事になります。
90度以下の壁を作りたい場合は、次のように90度以下の壁が出来ないように工夫してやります。
この場合、描画用のデータと当たり判定用のデータは別個に用意しているので、
当たり判定のデータだけを工夫してあげます。そうすれば描画部分にはまったく問題なく
見た目にはちゃんと鋭角の壁が表現出来ます。
|
|