質問: 直径20pxの円2つの移動と衝突判定を行っています。 初期位置はどちらもランダムで、x・yの移動はどちらも+1ずつ移動させています。 壁(画面の端)との判定はうまくいっている(ようにみえる)のですが、円同士がぶつかったかどうかの判定が思うように行きません。 2つの円の中心の距離を測り、2つの円の半径の合計より短ければ衝突しているはずなので、互いの移動の向きを反転させています。 2つの円の中心の距離は三平方の定理を用いて計算しているつもりです。 壁との判定もそうですが、現状の移動速度ではそこまで問題にならないでしょうけれど、移動の向きを反転させた後に衝突判定に引っかからなくなるまで連続して移動させるようにしています。 円同士の判定のところでその移動をさせようとすると、プログラムが固まってしまいます。 その移動の部分をコメントアウトすれば固まることはないのですが、そもそも見た目が円同士ぶつかったから移動の向きが反転したというように見えません。 プログラムが固まってしまうときの画面を見てみると、明らかに円同士がぶつかっていませんでした。 これら衝突判定は他の言語で私が実際に使ったことのある方法で、その言語では問題はありませんでした。 何が原因なのでしょうか? 移動と判定の部分のソースを提示します。 以下の部分は1ループごとに実行されます。 for(int n=0;n490){ speed_x[n]*=-1; while(pos_x[n]<10 || pos_x[n]>490){ pos_x[n]+=speed_x[n]; } } if(pos_y[n]<10 || pos_y[n]>490){ speed_y[n]*=-1; while(pos_y[n]<10 || pos_y[n]>490){ pos_y[n]+=speed_y[n]; } } } else{ } if(collision[n]==true){ for(int m=0;m
回答: 円が3つある状況をいろいろと観察してみました。 円1と円2が衝突するときは何も問題ないのですが、円3がどちらかと衝突した後でプログラムが応答しなくなるようです。 ボタンで円を追加したり削除したりできる仕様なのですが、それが影響しているのでしょうか? 円を2つ追加し、衝突しなさそうなら2つ目を削除して追加しなおし。 衝突するようならそのまま3つ目を追加。 これも衝突しなさそうなら3つ目を削除して追加しなおし。 というようにして3つの円がそれぞれ何かしらの円と衝突しそうな状況を作って観察しています。