2017-10-04 2 views
0

J'utilise Processing; J'ai une balle qui rebondit quand elle frappe la frontière et change sa couleur au hasard. Maintenant j'ai besoin que cette balle change de couleur à chaque rebond. Je n'arrive pas à comprendre comment le faire.Changer de couleur tous les 3 rebonds

Voici mon code actuel:

float xPos;// x-position 
float vx;// speed in x-direction 
float yPos;// y-position 
float vy;// speed in y-direction 
float r; 
float g; 
float b; 

void setup() 
{ 
    size(400, 300); 
    fill(255, 177, 8); 
    textSize(48); 

    // Initialise xPos to center of sketch 
    xPos = width/2; 
    // Set speed in x-direction to -2 (moving left) 
    vx = -2; 
    yPos = height/2; 
    vy = -1; 
} 

void draw() 
{ 
    r = random(255); 
    b = random(255); 
    g = random(255); 

    background(64); 

    yPos = yPos + vy; 
    // Change x-position on each redraw 
    xPos = xPos + vx; 

    ellipse(xPos, yPos, 50, 50); 
    if (xPos <= 0) 
    { 
     vx = 2; 
     fill(r, g, b); 
    } else if (xPos >= 400) 
    { 
     vx = -2; 
     fill(r, g, b); 
    } 
    if (yPos <= 0) 
    { 
     vy = 1; 
     fill(r, g, b); 
    } else if (yPos >= 300) 
    { 
     vy = -1; 
     fill(r, g, b); 
    }  
} 
+1

Bienvenue sur SO. S'il vous plaît visitez [aide] et lisez [demander]. Sans voir votre code, comment pouvons-nous répondre? –

+0

Eh bien, vous maintenez un compteur comme 'int counter = 0' ou quelque chose comme ça que vous augmentez chaque fois qu'il rebondit (' counter ++; '). Quand il atteint '3' comme' counter == 3' vous changez la couleur, utilisez donc une instruction 'if'. Après cela, vous réinitialisez le compteur: 'counter = 0'. Afin de vous aider davantage **, vous devez nous fournir ** les parties pertinentes de votre ** code **. – Zabuza

+0

Cela ressemble à quelque chose que vous pouvez réaliser en utilisant l'opérateur de module (%), exemple: https://stackoverflow.com/questions/9008522/insert-tr-after-every-third-loop –

Répondre

1

Il est assez facile. Vous maintenez un compteur qui compte le quantité de rebonds. Par conséquent, vous augmentez le compteur de un après chaque rebond. S'il atteint 3, vous changez la couleur. Après cela, vous réinitialisez le compteur et répétez.


ajouter Par conséquent, cette variable de membre à votre classe (comme vous l'avez déjà fait avec xPos et d'autres):

private int bounceCounter = 0; 

qui introduit la bounceCounter variable qui contient initialement 0 en tant que valeur.

Voici la méthode modifiée draw avec des changements et des commentaires mis en évidence:

void draw() { 
    // New color to use if ball bounces 
    r = random(255); 
    b = random(255); 
    g = random(255); 

    background(64); 

    yPos = yPos + vy; 
    // Change x-position on each redraw 
    xPos = xPos + vx; 

    ellipse(xPos, yPos, 50, 50); 

    // Variable indicating whether the ball bounced or not 
    boolean bounced = false; 

    // Out of bounds: left 
    if (xPos <= 0) { 
     vx = 2; 
     bounced = true; 
    // Out of bounds: right 
    } else if (xPos >= 400) { 
     vx = -2; 
     bounced = true; 
    } 

    // Out of bounds: bottom 
    if (yPos <= 0) { 
     vy = 1; 
     bounced = true; 
    // Out of bounds: top 
    } else if (yPos >= 300) { 
     vy = -1; 
     bounced = true; 
    } 

    // React to bounce if bounced 
    if (bounced) { 
     // Increase bounce-counter by one 
     bounceCounter++; 

     // Third bounce occurred 
     if (bounceCounter == 3) { 
      // Change the color 
      fill(r, g, b); 

      // Reset the counter 
      bounceCounter = 0; 
     } 
    } 
}