2017-05-02 1 views
0

Ce code est supposé avoir une ellipse avec une "traînée" d'ellipses derrière elle qui diminue en taille et devient plus blanche. Il s'appelle "Smoke Trail" et les ellipses dans ce code fonctionnent correctement pour la plupart. Il y a un problème dans le code où l'une des ellipses dessine la piste et ne passe pas derrière, comme toutes les autres. Je pense qu'il a quelque chose à voir avec la première ou la dernière ellipse de la boucleTraitement de l'ellipse dessinant le reste et désynchronisé

int count = 75; 
int made = 0; 
Smokes[] arrSmokes = new Smokes[count]; 
void setup() 
{ 
    size(800, 800); 
} 

void draw() 
{ 
    background(255); 

    if(made < count) 
    { 
    arrSmokes[made] = new Smokes(); 
    made += 1; 
    } 
    for(int i = 0; i < made; i += 1) 
    { 
     arrSmokes[i].render(); 
    } 
} 

public class Smokes{ 
    int xCoord, yCoord; 
    float size; 

    Smokes() 
    { 
    xCoord = mouseX; 
    yCoord = mouseY; 
    size = 100; 
    } 

    void render() 
    { 
    noStroke(); 
    ellipse(xCoord, yCoord, size, size); 
    size -= 4; 

    if(size <= 0) 
    { 
     xCoord = mouseX; 
     yCoord = mouseY; 
     size = 100; 
    } 
    } 
} 
+0

Veuillez donner un [exemple minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve). – pringi

Répondre

0

Puisque vous gardez vos anciennes instances de fumée et il suffit de les réinitialiser vous devez stocker le haut de vos cercles. Utilisez simplement un entier pour cela.

int top = 0; 

Maintenant, vous devez donner tout cercle son numéro dans le tableau ...

if (made < count) { 
    arrSmokes[made] = new Smokes(made); 
    made ++; 
} 
/* 
... 
*/ 
int number; 
Smokes(int number) 
{ 
    this.number = number; 
    //Initialyze 
} 

Maintenant, vous devez changer le haut de votre liste chaque fois que vous réinitialiser la particule de fumée.

void reset() 
{ 
    xCoord = mouseX; 
    yCoord = mouseY; 
    c = 0; 
    size = 100; 
    top = number; 
} 

Votre boucle for devrait maintenant commencer à l'entrée d'un au-dessus du haut et aller le chemin jusqu'à la fin du tableau, puis passer à la première entrée et courir jusqu'à ce qu'il atteigne l'entrée supérieure.

for (int i = (top+1)%count; i != top; i = (i+1)%count) { 
    if (i >= made) continue; 
    arrSmokes[i].render(); 
} 

Étant donné que vous n'êtes pas autorisé à modifier le début lors de l'exécution de "render();" vous devez ajouter une fonction "evaluate();" que vous exécutez après avoir fait chaque "rendu()".

void evaluate() 
{ 
    c += 10.2; 
    size -= 4; 
    if (size <= 0) { 
    reset(); 
    } 
} 

void render() 
{ 
    noStroke(); 
    fill(c); 
    ellipse(xCoord, yCoord, size, size); 
} 

Maintenant, vous devriez être bon à faire. Voici la toute source de nouveau si je vous ai foiré un peu: https://pastebin.com/urzbzmEb


Mais je vous recommande d'utiliser un ArrayList à la place depuis Java est basé sur l'objet et a son propre garbage collector. La bonne chose à ArrayList est que vous savez à chaque fois que le dernier objet de la liste est le cercle supérieur. Voici à quoi cela ressemblerait avec une ArrayList.

ArrayList<Smokes> smokes = new ArrayList<Smokes>(); 

void setup() { 
    size(800, 800); 
} 

void draw() { 
    background(255); 
    smokes.add(new Smokes(mouseX, mouseY)); 
    for (int i = 0; i < smokes.size(); i ++) { 
    smokes.get(i).render(); 
    } 
} 

public class Smokes { 
    int xCoord, yCoord; 
    float size = 100, c = 0; 

    Smokes(int x, int y) { 
    xCoord = x; 
    yCoord = y; 
    } 

    void render() { 
    noStroke(); 
    fill(c); 
    ellipse(xCoord, yCoord, size, size); 
    c += 10.2; 
    size -= 4; 
    if (size <= 0) { 
     smokes.remove(this); 
    } 
    } 

}