2017-05-02 74 views
0

此代碼應該有一個橢圓,其後面有一個橢圓,後面的橢圓會減小並變得更白。它被稱爲「Smoke Trail」,這個代碼中的橢圓大部分都能正常工作。在代碼中有一個問題,其中一個橢圓畫出了軌跡,並沒有像所有其他橢圓一樣落後。我認爲這事做的第一個或最後一個橢圓形的環處理其餘部分的橢圓圖並不同步

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

請給出一個[最小,完整和可驗證的示例](http://stackoverflow.com/help/mcve)。 – pringi

回答

0

既然您把煙霧的舊實例,只是重置他們,你必須存儲你的社交圈的頂部。只需使用Integer即可。

int top = 0; 

現在你必須給每一個圈在陣列中的數...

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

現在你要改變你的列表的每次重置煙霧粒子就會在首位。

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

您的循環,現在應該到了頂部的一個條目的開始,向上走的路到數組的末尾,然後跳轉到第一項,並運行至頂部條目。由於您在執行「render();」時不允許更改頂部,因此您不能在「你必須添加一個函數「evaluate();」你在完成每個「render();」之後運行的。

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

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

現在你應該很好去。這裏是整個源如果我再次搞砸你了一點:https://pastebin.com/urzbzmEb


但我建議使用ArrayList的,而不是因爲Java是基於對象的,並有自己的垃圾收集器。 ArrayList中的好處在於,您每次都知道列表中的最後一個對象是頂部圓圈。 下面是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); 
    } 
    } 

}