回答編集履歴
1
投稿ミス
answer
CHANGED
@@ -4,6 +4,16 @@
|
|
4
4
|
Pad pad = new Pad();
|
5
5
|
```
|
6
6
|
|
7
|
-
Padのメソッド内からはballにもアクセスできる(つまりballの位置にもアクセスできる)のでそれにより衝突判定に必要な情報を得ることができます。
|
7
|
+
Padのメソッド内からはballにもアクセスできる(つまりballの位置にもアクセスできる)のでそれにより衝突判定に必要な情報を得ることができます。同様にBallのメソッドからpadにアクセスできますので、衝突判定はBallのmoveでもできます。どちらがよいかは実際に書いてみてご自分で判断する方が学習効果が高いと思います。
|
8
8
|
|
9
|
-
|
9
|
+
なお衝突判定は「BallとPadの垂直方向の位置関係、水平方向の位置関係」で決まりますが、Ball, Padいずれも移動速度が1以上なので、ある程度の幅を持たせて判定する必要があることに注意してください。またBallは斜めに移動しているので、例えば
|
10
|
+
|
11
|
+
水平方向の位置(x):100、速度:5
|
12
|
+
垂直方向の位置(y):200、速度:4
|
13
|
+
|
14
|
+
だとすれば次の瞬間にはx=105,y=204になるわけですが、もしPadの垂直位置y=202だとしたらその位置でのBallの位置はx=102.5になるといったことも考慮する必要があろうかと思います。
|
15
|
+
|
16
|
+
---
|
17
|
+
余談ですが・・・
|
18
|
+
awtのコンポーネントCanvasはダブルバッファリング機構を持ってません。しかしswingのコンポーネントはデフォルトでダブルバッファんリングを持っています。おそらくWindowsでもMacintoshでもLinuxでもデフォルトでダブルバッファんリングが有効になっている気がします。このためBlockCanvasをCanvas(=awtコンポーネント)からJComponent(=swingコンポーネント)に変えるだけで、現在実装しているダブルバッファリングは必要なくなり単純にJComponent#paintComponentでそのまま描画しても画面のちらつきはなくなります。
|
19
|
+
課題の条件に「自前でダブルバッファリングせよ」というのが入っているなら今のままにする必要がありますが、そうでないならJComponentの派生クラスとした方がプログラムがすっきりします。
|