スポンサーサイト

--年--月--日
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

XNA:壁に沿って移動

2007年12月19日
最近は細かい部分の作り込みが主な作業です。
6項目ほど思いついたので、毎度のごとくヌメヌメと作業しています。

その中でも「コレはやっとかんとマズイやろ~(汁」という項目が1つ
壁に当たったら、壁に沿って移動する。いわゆる「壁ズリ」というやつです。
これが有るのと無いのとでは、ゲームプレイ中の操作ストレスが大きく違うと思います。
実はこの作業で数日悩みまくりました。

当初は、「壁に当たったら、壁の法線情報を元に反射ベクトルを与える」という方法を考えていたのですが、どうも上手くいかず(単に計算が間違っていた?)断念。
諦めて寝ようと布団に潜った後に、「当たる方向軸には移動させない」というシンプルで簡単な方法を思いついたので、早速やってみました。

簡単に説明すると
1、通常通りIntersectで当たり判定を行う
2、当たっていたら、もう一度X移動量だけを加算した未来位置でIntersectさせる。当たって   いなければX移動量を加算
3、2と同じく今度はZ移動値だけ加算してIntersect。当たっていなければZ移動値を加算

この方法だと、壁に当たる方向には移動しないので、スムーズな壁ズリができます(ガクガクした壁ズリにならない)
思惑通り、ナイスでグゥレイトで美しい壁ズリが実装できました。あ”~スッキリした^^
スポンサーサイト
Comment
No title
ソースギボンヌ
Re: ソースキボンヌ
> ソースギボンヌ

・変数
bbox ←障害物のBoundingBox構造体
node.coli_cercle.Center ← タンクのコリジョンの中心(タンクは円コリジョンです)
node.oldpos ←タンク移動前の位置(Vector3)
node.pos ←タンク移動後の位置(Vector3)

//障害物とタンクのコリジョンテスト
if (node.coli_cercle.Intersects(bbox) == true) {
//移動前位置からX移動量のみ加算してコリジョンテストを行う。当たっていたらX移動量をマイナスして元の位置に戻す。
node.coli_cercle.Center = new Vector3(node.oldpos.X + (node.pos.X - node.oldpos.X), node.oldpos.Y, node.oldpos.Z);
if (node.coli_cercle.Intersects(bbox) == true) {
node.pos.X -= (node.pos.X - node.oldpos.X);
}

//移動前位置からZ移動量のみ加算してコリジョンテストを行う。当たっていたらZ移動量をマイナスして元の位置に戻す
node.coli_cercle.Center = new Vector3(node.oldpos.X, node.oldpos.Y, node.oldpos.Z + (node.pos.Z - node.oldpos.Z));
if (node.coli_cercle.Intersects(bbox) == true) {
node.pos.Z -= (node.pos.Z - node.oldpos.Z);
}
}

・XZ平面での計算なので、Y軸(高さ)は無視しています。
・1フレーム前の位置情報(node.oldpos)が必要なので、必ず毎フレームごとにキャラクタの位置情報を「移動前位置」として保持しましょう。
・このソースをコピペしてもそちら側のゲームエンジンにマッチするはずは無いので、「エラーが出る」などのご質問にはお答えできません。ソースを見て計算アルゴリズムを参考にしていただいて「気合で」そちら側のゲームエンジンに実装してください。

管理者のみに表示

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。