OKWAVEパソコン版の推奨環境変更のお知らせ
  • 締切済み

ボールの衝突 (VB.net)

プログラム初心者です。 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つの判定で全判定したことにするようには できないでしょうか? 無理でしたら,せめてもう少し無駄のない方法 を教えてください。お願いします。

みんなの回答

  • KOBA789
  • ベストアンサー率0% (0/0)
回答No.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であると仮定した時のものです。 ご参考までに。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>「オーバーフローしてしまいました。」 と出るんですけど,何か別の問題があるんでしょうか? これに関しては、エラーが発生している処理を見ないとなんとも言えませんねぇ。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>また,一般的によく使われている >「無駄の切り詰め方」というのがありましたら, >方針だけで結構ですのでお教え頂けませんでしょうか? 一般的には、不要な組み合わせや、ありえない組み合わせのチェックをしないですね。 あとは、コストがかかる演算を避ける。 不要な組み合わせという例では、iとjを比較して、jとiを比較するとか。 ありえない組み合わせという例では、iとiを比較とか。 コストがかかる演算を避けるという例ですと、遠く離れた円は接しているかの判定をしない という感じですかね?

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>なんてことやったら無駄が多すぎますよね? 必要な判定でしたらしょうがないですね。 >なんか全てのボールに同一の名前をつけて, >1つの判定で全判定したことにするようには >できないでしょうか? 結局ループで全ての組み合わせを判定することになるので 意味ないかなぁ? >無理でしたら,せめてもう少し無駄のない方法 を教えてください。お願いします。 基本的に、書かれたコードは問題ないと思います。 必要な処理でしょう。 ただし、 「(i)番目のボールが(i+j)番目のボールと衝突 している」の判定を以下に効率よく行うかですね。 2つの円の中心と中心の距離が、2つの円の半径の和に等しいというのが判定方法になるかと思いますが、こんな大変な計算を全ての円どうしでやる必要はないですよね。 x軸やy軸方向に、2つの円の半径の和を超えて離れた円同士なら絶対に接しないですよね。 というところで無駄を切り詰めていくしかないかと。

nyonta
質問者

補足

回答ありがとうございます。 やっぱりこういう方法しかないんでしょうか。。 このやりかたですと,ボールの数が40個程度で 「オーバーフローしてしまいました。」 と出るんですけど,何か別の問題があるんでしょうか? また,一般的によく使われている 「無駄の切り詰め方」というのがありましたら, 方針だけで結構ですのでお教え頂けませんでしょうか?

関連するQ&A

専門家に質問してみよう