dポイントプレゼントキャンペーン実施中!

プログラム初心者です。
VB.netでの質問です。

例えば,100個のボール(の絵をしたPictureBox)を
たくさん配置して適当な規則で動かせます。
(ここまではできます)
次にいずれかの2つ(少なくとも2つ)のボールが
衝突した(距離がある値より小さくなった)ときに,互いに跳ね返る様にしたいとき,
どのようなコードを書けばよいのでしょうか?

例えば配列を使って,

0.1秒に一回(timerつかって)
for i=1 to 100
for j=1 to 100-i
if (i)番目のボールが(i+j)番目のボールと衝突
している then
跳ね返る
   end if
next
next

なんてことやったら無駄が多すぎますよね?
なんか全てのボールに同一の名前をつけて,
1つの判定で全判定したことにするようには
できないでしょうか?
無理でしたら,せめてもう少し無駄のない方法
を教えてください。お願いします。

A 回答 (4件)

>無理でしたら,せめてもう少し無駄のない方法


>を教えてください。お願いします。
四角形として当たり判定をしたあと、当たっていれば、円として判定しそれでも当たっていれば"当たっている"と判定する方法くらいしか思いつかないですね。

また、
>例えば,100個のボール(の絵をしたPictureBox)を
>たくさん配置して適当な規則で動かせます。
PictureBoxに1つ1つのキャラクタを割り当てるのは効率が悪すぎます。(メモリーをとても消費します)
PictureBox1つにGraphicsクラスで描画する方法が現実的です。
それに、PictureBoxは長方形なので、円形のキャラクタは透過処理ができないために不便です。なので、Graphicsクラスで描画する方法をお勧めします。

蛇足ですが、キャラクタの削除などを行う場合はIndexの最大値から0へForを回す必要があります。こうしないとForのカウンタ変数が配列の最大Index数を超えてしまうがあるからです。
たとえばこのようにします。
For i As Integer = 99 to 0
For j As Integer = i to 0

End For
End For
これは配列のLength(要素数)が100であると仮定した時のものです。
ご参考までに。
    • good
    • 0

>「オーバーフローしてしまいました。


と出るんですけど,何か別の問題があるんでしょうか?

これに関しては、エラーが発生している処理を見ないとなんとも言えませんねぇ。
    • good
    • 0

>また,一般的によく使われている


>「無駄の切り詰め方」というのがありましたら,
>方針だけで結構ですのでお教え頂けませんでしょうか?

一般的には、不要な組み合わせや、ありえない組み合わせのチェックをしないですね。
あとは、コストがかかる演算を避ける。

不要な組み合わせという例では、iとjを比較して、jとiを比較するとか。

ありえない組み合わせという例では、iとiを比較とか。

コストがかかる演算を避けるという例ですと、遠く離れた円は接しているかの判定をしない

という感じですかね?
    • good
    • 0

>なんてことやったら無駄が多すぎますよね?



必要な判定でしたらしょうがないですね。

>なんか全てのボールに同一の名前をつけて,
>1つの判定で全判定したことにするようには
>できないでしょうか?

結局ループで全ての組み合わせを判定することになるので
意味ないかなぁ?

>無理でしたら,せめてもう少し無駄のない方法
を教えてください。お願いします。

基本的に、書かれたコードは問題ないと思います。
必要な処理でしょう。

ただし、
「(i)番目のボールが(i+j)番目のボールと衝突
している」の判定を以下に効率よく行うかですね。

2つの円の中心と中心の距離が、2つの円の半径の和に等しいというのが判定方法になるかと思いますが、こんな大変な計算を全ての円どうしでやる必要はないですよね。

x軸やy軸方向に、2つの円の半径の和を超えて離れた円同士なら絶対に接しないですよね。

というところで無駄を切り詰めていくしかないかと。

この回答への補足

回答ありがとうございます。

やっぱりこういう方法しかないんでしょうか。。
このやりかたですと,ボールの数が40個程度で
「オーバーフローしてしまいました。」
と出るんですけど,何か別の問題があるんでしょうか?

また,一般的によく使われている
「無駄の切り詰め方」というのがありましたら,
方針だけで結構ですのでお教え頂けませんでしょうか?

補足日時:2004/03/28 18:13
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!