2017-05-27 1 views
1

J'essaie d'écrire un petit programme qui a un nombre donné de balles (dans l'exemple de code ci-dessous c'est 3) aller et venir sur l'écran à différentes vitesses et phases (décalage de départ). Ce résultat a été atteint dans le code. Bien que je veux être en mesure de sélectionner les balles (un à la fois) en utilisant un clic de souris. J'ai utilisé le mot "HIT !!!" pour signifier dans la console qu'une balle a été cliquée.traitement: problème d'utilisation du tableau global dans si la condition dans la boucle pour

Mon problème est que lorsque je cours le code ci-dessous, je reçois seulement un "HIT!" dans la console quand je clique sur la balle du haut. C'est alors que le premier élément y [0] correspond à la variable click_Y. Quand je suis sûr (mais évidemment erroné en quelque sorte) qu'il devrait y avoir des allumettes quand je clique dans le voisinage de y [1] & y [2].

Je serais vraiment reconnaissant pour toute aide avec ceux-ci. Comme c'est arrivé au point où je commence à regarder fixement à l'écran. Merci.

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); 
} 

Répondre

1

Des problèmes tels que ceux-ci sont mieux résolus par debugging votre programme. Commencez par tracer manuellement le code, puis ajoutez des instructions d'impression (plus que ce que vous avez déjà ajouté), et si cela ne fonctionne pas, n'ayez pas peur d'utiliser le débogueur.

Vous utilisez les variables click_X et click_Y pour vérifier la position de la souris par rapport à la position de chaque bille. Suivez la boucle for dans votre fonction draw(). Que se passe-t-il à la fin de la première itération?

Vous réinitialisez les valeurs click_X et click_Y. C'est pourquoi vous ne détectez aucun hit sur les autres cercles.

Vous pourriez probablement refactoriser votre code pour réinitialiser seulement ces variables si quelque chose a été touché, mais vraiment, je cesserais de les utiliser complètement.

Je devine que vous utilisez ces variables parce que vous voulez seulement vérifier quand la souris est pressée? Utilisez simplement la variable mousePressed pour cela. Ensuite, vous pouvez utiliser les variables mouseX et mouseY directement.

Ensuite, votre déclaration if ressemblerait à ceci:

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

Aussi, en utilisant des tableaux séparés comme celui-ci est appelé tableaux parallèles, et est en général une mauvaise habitude à prendre. Vous devriez probablement utiliser classes à la place.

+0

Merci pour la réponse. Oui, j'avais une certaine inclinaison en réinitialisant Click_X et Click_Y avait quelque chose à voir avec ça. J'avais commenté ces lignes. Bien que sans réinitialiser ces variables comme obtenait plusieurs "HIT" pour chaque fois qu'une balle traversait le point que j'avais cliqué, alors que je voulais seulement un coup par clic. Comme vous le dites si je dois trouver une autre façon de faire face à cela. Merci pour certains conseils très judicieux !! – HiSulu

+0

J'ai déplacé les lignes 'click_X = 0;' et 'click_Y = 0;' descendre quelques lignes dans le code afin qu'elles soient en dehors de la boucle for, mais elles sont toujours réinitialisées de sorte qu'elles ne "traînent" pas, causant des coups même si une balle n'a pas été touchée directement. Je sais que ce n'est probablement pas la meilleure pratique. Mais cela m'a donné un peu de répit et de respiration pour le moment. Je vais refactoriser. Merci encore Kevin! – HiSulu

+0

@HiSulu Je vous ai recommandé de vous débarrasser entièrement de ces variables. Il suffit de les supprimer. La déclaration 'if' que j'ai posté vous montre exactement ce qu'il faut faire à la place. –