2016-05-05 37 views
0

我有這個奇怪的例子,橢圓網格全部互相摺疊併產生一種爆炸性碰撞,這是一種有趣的效果,但不是我想要的。我真的只是希望小橢圓的平滑過渡越來越大,因爲它們靠近屏幕的中心,然後慢慢過渡而不是創建「爆炸」。我不知道爲什麼會出現這種情況。有什麼建議麼?處理窗口在橢圓碰撞時變成白色(短暫)

我試圖截圖,但捕獲爆炸相當困難。基本上,如果你能想象所有8個橢圓進入一箇中心點,然後迅速增長,從而使窗口的其餘部分成爲白色。

Ellipse Explosion

ArrayList<RotatingEllipse> ellipses = new ArrayList<RotatingEllipse>(); 

float updateSize = 1; 
float minSize = 1; 
float maxSize = 10; 
float sizeSpeed = 0.015; 



void setup() { 
    size(500, 500); 
    noStroke(); 
    smooth(); 

    ellipses.add(new RotatingEllipse(width*.25, height*.25)); 
    ellipses.add(new RotatingEllipse(width*.75, height*.25)); 
    ellipses.add(new RotatingEllipse(width*.75, height*.75)); 
    ellipses.add(new RotatingEllipse(width*.25, height*.75)); 

    ellipses.add(new RotatingEllipse(width/2, height*.25)); 
    ellipses.add(new RotatingEllipse(width/2, height*.75)); 

    ellipses.add(new RotatingEllipse(width*.25, height/2)); 
    ellipses.add(new RotatingEllipse(width*.75, height/2)); 
} 

void draw() { 
    background(#202020); 


    for (RotatingEllipse e : ellipses) { 
    e.stepAndDraw(); 

    updateSize = map(sin(frameCount * sizeSpeed), -1.0, 1.0, minSize, maxSize); 

    } 
} 

class RotatingEllipse { 

    float rotateAroundX; 
    float rotateAroundY; 
    float distanceFromRotatingPoint; 
    float angle; 

    public RotatingEllipse(float startX, float startY) { 

    rotateAroundX = (width/2 + startX)/2; 
    rotateAroundY = (height/2 + startY)/2; 

    distanceFromRotatingPoint = dist(startX, startY, rotateAroundX, rotateAroundY); 

    angle = atan2(startY-height/2, startX-width/2); 
    } 

    public void stepAndDraw() { 

    angle += PI/128; 

    float x = rotateAroundX + cos(angle)*distanceFromRotatingPoint; 
    float y = rotateAroundY + sin(angle)*distanceFromRotatingPoint; 

    float distance = dist(x, y, width/2, height/2); 
    float diameter = 50*(200-distance)/500; 
    float m = map (updateSize, 0, distance, 1, diameter); 

    ellipse(x, y, m, m); 
    } 
} 

回答

0

你使用請注意的m值:

float m = map (updateSize, 0, distance, 1, diameter); 
println(m); 
ellipse(x, y, m, m); 

如果打印出來m,你會看到這樣的事情:

60.552975 
85.61453 
85.42698 
85.440994 
85.46013 
120.79626 
120.83713 
120.847946 
120.81186 
4292781.0 
4282823.5 
611831.94 
234653.25 
1730522.2 
448653.88 
336490.44 
2018942.4 
85.23538 
85.03087 
85.0165 
84.99791 
120.24554 
120.20372 
120.19415 
120.23001 
42.533062 

你正在製作橢圓巨大,它填滿了屏幕,這就是爲什麼整個屏幕變成白色的原因。

您需要重構代碼以消除這些巨大的值。我真的不明白你想要做什麼updateSizemap()函數,這看起來過於複雜。但是您將不得不修改該代碼,以免產生如此大的值。

您也可以使用if語句來限制值,但我認爲真正的答案是簡化您的邏輯來改變大小。

+0

最初,我沒有updateSize,並且相對於每個橢圓自己的中心點的距離增加了大小。但是,這會導致屏幕中心每個對角線橢圓上的大小發生變化。因此,我回想起依靠屏幕中心創建橢圓大小的原始代碼。我會重新考慮代碼。謝謝 –