2017-05-27 13 views
1

与えられた数のボール(その下のサンプルコードで)が異なるスピードで画面を前後に移動する小さなプログラムを作成しようとしています。フェーズ(開始オフセット)。 これは多くのコードで達成されています。私は、マウスのクリックを使ってボールを(一度に1つずつ)選択できるようにしたいですが。 私は "HIT !!!"という言葉を使用しました。ボールがクリックされたことをコンソールで示す。処理:forループでif条件でグローバル配列を使用するときに問題が発生する

私の問題は、以下のコードを実行すると「ヒット」しか得られないということです。私がトップボールをクリックするとコンソールに表示されます。これは、最初の要素y [0]がclick_Y変数と一致するときです。私は、y [1] & y [2]の付近をクリックすると一致するはずであると確信していますが(明らかに間違っています)。

私は本当にこれらの助けに感謝します。私が画面を空白で見つめているところまできています。ありがとう。

int  noCircles; // the number of items in the array (# of circles) 
float[] y;  // y-position of each circle (fixed) 
float[] speed; // speed of each circle 
float[] phase; // phase of each circle 

float red = 120; 
float green = 120; 
float blue = 120; 

float click_X; 
float click_Y; 
void setup() { 
    size(500, 500); 

    noCircles = 3; 

    // allocate space for each array 
    y = new float[noCircles]; 
    speed = new float[noCircles]; 
    phase = new float[noCircles]; 

// calculate the vertical gap between each circle based on the total number 
// of circles 
    float gap = height/(noCircles + 1); 

    //setup an initial value for each item in the array 
    for (int i=0; i<noCircles; i++) { 
    y[i] = gap * (i + 1); 
    // y is constant for each so can be calculated once 
    speed[i] = random(10); 
    phase[i] = random(TWO_PI); 
    } 
} 
void draw() { 
    background(155); 

    for (int i=0; i<noCircles; i++) { 
    // calculate the x-position of each ball based on the speed, phase and 
    //current frame 
    float x = width/2 + sin(radians(frameCount*speed[i]) + phase[i])* 200; 
    if (dist(x, y[i], click_X, click_Y) <= 20){ 
     println("HIT!!!!!!!!!!!!!!!!!!"); 
    } 
    ellipse(x, y[i], 20, 20); 
    click_X = 0; 
    click_Y = 0; 
    } 
} 
void mousePressed() { 
    println("You clicked******************************************"); 
    click_X = mouseX; 
    click_Y = mouseY; 
    println("click_X =" + click_X); 
    println("click_Y =" + click_Y); 
} 

答えて

1

これらの問題は、プログラムのdebuggingによって最もよく解決されます。手でコードをトレースしてから、すでに追加した以上のprint文を追加してください。そうでない場合は、デバッガの使用を心配しないでください。

各ボールの位置に対するマウスの位置を確認するには、click_Xclick_Yの変数を使用しています。 draw()機能のforループをトレースします。最初の反復の終わりにはどうなりますか?

click_Xclick_Yの値をリセットします。だからあなたは他のサークルのヒットを検出していないのです。

何かヒットした場合にのみ、これらの変数をリセットするようにコードをリファクタリングすることはできますが、実際はそれらをすべて使用することをやめます。

マウスを押したときだけ確認したいので、これらの変数を使用していると思いますか?そのためにはmousePressed変数を使用してください。次に、mouseXmouseY変数を直接使用することができます。

次に、あなたのif文は次のようになります。

if (mousePressed && dist(x, y[i], mouseX, mouseY) <= 20) { 
    println("HIT: " + i); 
} 

はまた、このように別々のアレイを使用することで、並列配列と呼ばれ、入るために悪い癖一般的です。代わりにclassesを使用してください。

+0

返信いただきありがとうございます。はい、私はClick_XとClick_Yをリセットする傾斜がありました。私はそれらの行をコメントアウトしました。これらの変数をリセットせずに、ボールがポイントを通過するたびに複数の「HIT」を取得するようにしていましたが、私はクリック当たり1ヒットしか望みませんでした。あなたが言っているように、私はこれに対処する別の方法を見つける必要があります。非常に健全な助言をありがとう! – HiSulu

+0

私は 'click_X = 0;'行を移動しました。 'click_Y = 0;'コード内のいくつかの行を削除してforループの外にあるようにしますが、ボールが直接ヒットしなかったとしてもヒットしないようにリセットされます。これはおそらくベストプラクティスではないことは分かっています。しかし、それは私にいくつかの救済と今呼吸室を与えてくれました。私はリファクタリングします。再度ありがとうKevin! – HiSulu

+0

@ HiSulu私はこれらの変数を完全に取り除くことをお勧めしました。削除するだけです。私が投稿した 'if'ステートメントは、あなたが何をすべきか正確に示しています。 –

関連する問題