【WPF練習14】壁崩し(5/9)
プロジェクトタイプ | C# WPFアプリケーション※ |
---|---|
プロジェクト名 | T10b |
ソリューション名 | PET10 |
ターゲットフレームワーク | .NET 6.0 (長期的なサポート) |
※ 「WPFアプリ(.NET Framework)」ではないので注意せよ!
注意
- 本ページの作業内容は 前のページまでの続き になっていることに注意せよ.
- 先に前のページまでをすべて読み,指示されている作業を済ませてから本ページを読むこと.
- プロジェクトの作成作業については準備を参照せよ.
14-5. 衝突判定と衝突応答
次にボールがブロックやプレイヤーにぶつかったときに跳ね返る処理を作ろう.このためにまず線分同士の
交差判定を行うメソッドが必要である.MainWindow
クラスに_に示す二つのメソッドを追記しよう.
perp()
メソッドは与えられたベクトルに垂直なベクトルをつくるヘルパーメソッド,
TestSegmentsIntersection()
メソッドは二つの線分の交差を判定するメソッドである.
これらのメソッドではコードを簡潔にするために,これまでの授業で説明していない文法要素が
いくつか含まれている.詳しくは以下のページを参考にするとよいだろう.
なおTestSegmentsIntersection()
メソッドで用いられている交差判定の数理については,
ここでは説明が長くなるため省略する.詳しくは以下の書籍を参考にするとよいだろう.
- 参考文献
- ゲームエンジンアーキテクチャ 第3版(ボーンデジタル)
- ゲームプログラミングのための3Dグラフィックス数学(ボーンデジタル)
|
|
このTestSegmentsIntersection()
メソッドを使って,ボールの元の位置(ballX
,ballY
)と
次の位置(nextBallX
,nextBallY
)とが作る線分(以下この線分を変位線分とよぶ)が,
ブロックやプレイヤーを表す四角形の四辺を跨ぐかどうかを判定することで衝突判定を行うことができる.
このためにはcanvas1
に含まれているすべての四角形(Rectangle
)をチェックする必要があるが,
今回は単純にすべてのブロックを逐次チェックする方法を用いることにする.本来であれば変位線分から
遠い四角形はチェックを省略することが可能であるが,ブロックはせいぜい数百個程度であるため
常にすべてをチェックしてもパフォーマンス上の問題にはなりにくいため,このような単純な方法を採用している.
MainWindow
クラスに_に示すQueryBySegment()
メソッドを追記する.
|
|
このQueryBySegment()
メソッドによって任意の線分と交差を持つ四角形を検索できるようになったので,
タイマー処理(Timer_Tick()
メソッド)でボールとブロックやプレイヤーとの交差判定を行い,
衝突時の応答処理を実装する.Timer_Tick()
メソッドに_に示す内容を追記する.
|
|
ここまで書けたら起動してみよう._に示すようにブロックにボールがぶつかると そのブロックが消滅して,かつボールが反射することが分かるだろう.またプレイヤーにぶつかった場合も 反射することが分かるはずである.
これでおおむね壁崩しとしての動作はできたが,ゲームの終了処理を作っていないため, ボールが画面下に落下しても相変わらず反射し続けてしまうし,またすべてのブロックを破壊した あともボールは動き続けてしまう.次節ではこの終了処理を実装してみよう.