0

私はプログラミングの初心者で、最近プロセッシングを始めました。私のコードでは、衝突関数はタッチブール値を true に設定しますが、それを配列することにより、最終配列に対してのみ true をテストし、その前の配列に対しては true をテストしません。ここでどこが間違っていますか?私の質問が十分に明確であることを願っています。

編集:

申し訳ありませんが、もう一度やり直してください。私の問題は、衝突関数を適切に配列する方法を見つけることだと思います。配列内の衝突に [i] を追加できないようです。現時点では、コードは機能しますが、最後の配列に対してのみ true をテストし、その前の配列に対しては true をテストしません。

配列コード:

for(int i = 0 ; i < lineDiv; i++){ 
collide(xPts[i], yPts[i], vecPoints.xPos, vecPoints.yPos, myDeflector.Thk, vecPoints.d);

衝突機能:

void collide(float pt1x, float pt1y, float pt2x, float pt2y, int size1, int size2){
if (pt1x + size1/2 >= pt2x - size2/2 && 
pt1x - size1/2 <= pt2x + size2/2 && 
pt1y + size1/2 >= pt2y - size2/2 && 
pt1y - size1/2 <= pt2y + size2/2) {
touch = true;
}
else{
touch=false;
}
4

2 に答える 2

1

「タッチ」変数はグローバルです。collide() 関数を呼び出すたびに、以前に設定されていたものが上書きされます。おそらく、collide() を呼び出した後に touch が true かどうかをテストしてから、for ループを終了したいだけでしょうか?

または、グローバルを避けて、collide() が touch ブール値を返すようにすることもできます。

于 2013-01-08T19:53:48.450 に答える
0

あなたがしたいことは、ループを実行し、配列のその要素で関数を実行し、それらのいずれかが真であれば値を返すことです。これは私の最善の推測です。質問を編集して、何をしようとしているのかを明確にすることをお勧めします。したがって、次のように仮定します。

1)メソッドを関数に変更します

boolean collide(float pt1x, float pt1y, float pt2x, float pt2y, int size1, int size2){
if (pt1x + size1/2 >= pt2x - size2/2 && 
pt1x - size1/2 <= pt2x + size2/2 && 
pt1y + size1/2 >= pt2y - size2/2 && 
pt1y - size1/2 <= pt2y + size2/2) {
return true;
}
else{
return false;
}

2) ループとその呼び出し方法を変更する

touch = false;  // if you don't set this to false before the loop, it will be the last value taken
for(int i = 0 ; i < lineDiv; i++){ 
     if (collide(xPts[i], yPts[i], vecPoints.xPos, vecPoints.yPos, myDeflector.Thk, vecPoints.d)) touch = true;

アクションの前に、配列を反復処理し、処理中に touch が true と false の間を循環する可能性があります (データを引き出す可能性が高いため)。そのデータを配列のような別の構造にパックしない限り、それと一緒に何でも。

したがって、「タッチ」は false に設定され、関数呼び出しが true を返すと true に変更されます。すべてが false の場合、false のままになります。

注: xPts.length() または yPts.length() と lineDiv のいずれかを使用することを検討してください。これにより、xPts と yPts の要素数が同じであると仮定すると、範囲外の配列例外の可能性が減少します。

于 2013-01-10T21:09:41.963 に答える