しばらく遊んでみましたが、なかなかわかりません。
ミサイルを発射する戦車を作り、ミサイルが壁に当たったら跳ね返らせたいのですが、直角に跳ね返らせたいです。
今のところ障害物はありません。ミサイルはviewportRectangle
私が作ったものの外に出ると跳ね返ります。
私が探している解決策はかなり進んでいますか?
それを行うための比較的簡単な方法はありますか?
これを行う簡単な方法は、角度を計算する代わりにミサイルの速度を使用することだと思います。水平方向と垂直方向の動きを表すミサイルがあるxVelocity
とします。yVelocity
これらの速度は、左、右、上、または下を表すために正または負にすることができます。
yVelocity
ます。xVelocity
ます。これにより、反対軸の動きは同じに保たれます。
ChrisFの回答から画像を借りて、ミサイルが位置Iから始まったとしましょう。
と両方が正の場合(2DグラフィックスではxVelocity
、yVelocity
右と下が通常正です)、ミサイルは指定された方向に移動します。の値を割り当てましょう
xVelocity = 3
yVelocity = 4
ミサイルが位置Cで壁に当たったとき、ミサイルxVelocity
は変化しないyVelocity
はずですが、上方向に戻るように-4に反転する必要がありますが、右に進み続けます。
この方法の利点は、ミサイルのxPosition
、、、、およびを追跡するだけでよいことです。これらの4つのコンポーネントとゲームの更新レートだけを使用して、ミサイルは常に正しい位置に再描画されます。まっすぐな角度ではない、または移動しているより複雑な障害物に入ると、角度よりもXおよびYの速度で作業する方がはるかに簡単になります。yPosition
xVelocity
yVelocity
完全な粒子(および光)の場合、この図(commons.wikimedia.orgから)に示されているように、反射角は入射角に等しくなります。
リフレクションに関するウィキペディアのページは、それがどのように機能するかを説明するのに非常に優れています。
オブジェクトと障害物の弾力性と材質を考慮すると、少し複雑になりますが、ほとんどのアプリケーションではおそらくこれで十分です。
あなたが尋ねている特定の物理学の質問は別として、Wendy Stahler による本「Beginning Math and Physics for Game Programmers」をお勧めします。ゲーム/物理プログラミング プロジェクトに非常に役立つことがわかりました。
この本に付属するコードは C++ ですが、C# を知っていれば、変換は非常に簡単です。
良いものを持っている!
私はこの問題を抱えていました。私が見つけた唯一の方法は、衝突の軸を分離することでした!
それを試してみてください:
x += velocity * Math.cos(angle * Math.PI /180);
y += velocity * Math.sin(angle * Math.PI /180);
if (x < 0 || x > canvas.width) {
angle = 180 - angle;
}
else if (y < 0 ||y > canvas.height) {
angle = 360 - angle;
}
これがお役に立てば幸いです。
180-Xが増加しているときに上面でバウンスを操作しているだけでない限り、すべてのインスタンスでaが機能するわけではありません。
進むべき1つの方向は、XNAフォーラムまたはXNAサンプルコードを入手することです。これはC#であり、ゲームを構築するためのものです。XNAでゲームを構築したいと言っているわけではありませんが、これは優れたツールであり、無料です。
まったく複雑ではありません-擬似コード:
angleObjectHitWall = a;
bounceAngle = 180-a;
もちろん、これは非常に単純な計算であり、材料、重力、真っ直ぐでない壁などの要因を考慮し始めると、まったく関係ありません...
これは実際には物理学の質問なので、あなたが物理学者でない場合(そして、あなたがこの質問をしているので、私はあなたがそうではないと思います)、それを正しくするために多くの読書とブレインストーミングが必要になります。
このウィキペディアのエントリを読んで、質問の深さに関する基本的な考え方を理解することをお勧めします。
それを「もっともらしく見える」ようにしたいだけなら、私はそれについてあまり心配せず、トカゲのビルの答えを使用しますが、それを正しくしたいのであれば、かなりの冒険があります。これを怖がらせないでください!幸運を!