
プログラム初心者です。
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件)
- 最新から表示
- 回答順に表示
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であると仮定した時のものです。
ご参考までに。
No.3
- 回答日時:
>「オーバーフローしてしまいました。
」と出るんですけど,何か別の問題があるんでしょうか?
これに関しては、エラーが発生している処理を見ないとなんとも言えませんねぇ。
No.2
- 回答日時:
>また,一般的によく使われている
>「無駄の切り詰め方」というのがありましたら,
>方針だけで結構ですのでお教え頂けませんでしょうか?
一般的には、不要な組み合わせや、ありえない組み合わせのチェックをしないですね。
あとは、コストがかかる演算を避ける。
不要な組み合わせという例では、iとjを比較して、jとiを比較するとか。
ありえない組み合わせという例では、iとiを比較とか。
コストがかかる演算を避けるという例ですと、遠く離れた円は接しているかの判定をしない
という感じですかね?
No.1
- 回答日時:
>なんてことやったら無駄が多すぎますよね?
必要な判定でしたらしょうがないですね。
>なんか全てのボールに同一の名前をつけて,
>1つの判定で全判定したことにするようには
>できないでしょうか?
結局ループで全ての組み合わせを判定することになるので
意味ないかなぁ?
>無理でしたら,せめてもう少し無駄のない方法
を教えてください。お願いします。
基本的に、書かれたコードは問題ないと思います。
必要な処理でしょう。
ただし、
「(i)番目のボールが(i+j)番目のボールと衝突
している」の判定を以下に効率よく行うかですね。
2つの円の中心と中心の距離が、2つの円の半径の和に等しいというのが判定方法になるかと思いますが、こんな大変な計算を全ての円どうしでやる必要はないですよね。
x軸やy軸方向に、2つの円の半径の和を超えて離れた円同士なら絶対に接しないですよね。
というところで無駄を切り詰めていくしかないかと。
この回答への補足
回答ありがとうございます。
やっぱりこういう方法しかないんでしょうか。。
このやりかたですと,ボールの数が40個程度で
「オーバーフローしてしまいました。」
と出るんですけど,何か別の問題があるんでしょうか?
また,一般的によく使われている
「無駄の切り詰め方」というのがありましたら,
方針だけで結構ですのでお教え頂けませんでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数を動的に作るには?
-
パソコンキーボードで時分秒を...
-
VBで作った乱数を一度も重複さ...
-
IF関数でEmpty値を設定する方法。
-
重複なしでランダムに画像を表...
-
排列と配列の漢字の使い分けは
-
System.err. printlnとSystem.o...
-
InputStream.read()でタイムア...
-
VBSエラー"オブジェクト型の変...
-
javaのコンパイルエラーについ...
-
JSPやサーブレットでSystem.out...
-
JavaScriptの変数をjavaのメソ...
-
「配列定数は、イニシャライザ...
-
javaです
-
jspでの二次元配列
-
JButton-背景の透明化
-
C#で、あるクラスのメンバーす...
-
int型のゼロ埋め
-
createImage()を使い コンパイル
-
プログラミングの問題です。大...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
IF関数でEmpty値を設定する方法。
-
パソコンキーボードで時分秒を...
-
動的配列が存在(要素が有る)か...
-
VBAで配列の計算
-
VB.net 引数で配列変数を渡す際...
-
C言語 重複しない4ケタの乱数...
-
EXCEL VBA で、0から?1から?
-
変数を動的に作るには?
-
複数のテキストボックスに同じ...
-
配列の要素数を超えた参照のコ...
-
VBでbyte配列型のインスタンス...
-
10進数を4桁のバイト配列に格納...
-
ジャグ配列とは
-
ログデータを表示するグラフに...
-
ゲーム箱入り娘のつくりかた
-
遅延バインディングを使用でき...
-
VBで作った乱数を一度も重複さ...
-
C#の質問
-
このプログラムがわかりません
-
【MFC】GetCount()とGetSize()...
おすすめ情報