質問内容
質問を評価する
(0ポイント)
|
直径20pxの円2つの移動と衝突判定を行っています。 初期位置はどちらもランダムで、x・yの移動はどちらも+1ずつ移動させています。 壁(画面の端)との判定はうまくいっている(ようにみえる)のですが、円同士がぶつかったかどうかの判定が思うように行きません。 2つの円の中心の距離を測り、2つの円の半径の合計より短ければ衝突しているはずなので、互いの移動の向きを反転させています。 2つの円の中心の距離は三平方の定理を用いて計算しているつもりです。 壁との判定もそうですが、現状の移動速度ではそこまで問題にならないでしょうけれど、移動の向きを反転させた後に衝突判定に引っかからなくなるまで連続して移動させるようにしています。 円同士の判定のところでその移動をさせようとすると、プログラムが固まってしまいます。 その移動の部分をコメントアウトすれば固まることはないのですが、そもそも見た目が円同士ぶつかったから移動の向きが反転したというように見えません。 プログラムが固まってしまうときの画面を見てみると、明らかに円同士がぶつかっていませんでした。 これら衝突判定は他の言語で私が実際に使ったことのある方法で、その言語では問題はありませんでした。 何が原因なのでしょうか? 移動と判定の部分のソースを提示します。 以下の部分は1ループごとに実行されます。 for(int n=0;n<num+1;n++){ pos_x[n]+=speed_x[n]; pos_y[n]+=speed_y[n]; if(wall[n]==true){ if(pos_x[n]<10 || pos_x[n]>490){ 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<num+1;m++){ if(m!=n){ if(Math.sqrt(Math.pow((pos_x[n]-pos_x[m]),2)+Math.pow((pos_x[n]-pos_x[m]),2))<(size[n]+size[m])){ speed_x[n]*=-1; speed_y[n]*=-1; while(Math.sqrt(Math.pow((pos_x[n]-pos_x[m]),2)+Math.pow((pos_x[n]-pos_x[m]),2))<(size[n]+size[m])){ pos_x[n]+=speed_x[n]; pos_y[n]+=speed_y[n]; pos_x[m]+=speed_x[m]; pos_y[m]+=speed_y[m]; } } } } } }
|