2016-09-20 67 views
1

我想淡入淡出背景进入不同的颜色。我决定尝试绘制一个矩形而不是使用背景,但是我的粒子越来越小,因为背景没有被绘制。如何解决这个问题的建议?颜色改变处理w/out影响粒子的背景

// main tab 
ArrayList<ParticleSystem> systems; 

PVector windRight = new PVector(0.1,0); 
PVector sortaSpeed = new PVector(-0.1,0); 
PVector gravity = new PVector(0,0.05); 

boolean wR = false; 
boolean sP = false; 
boolean cS = false; 

int limit = 8; 

int alpha = 10; 
color[] colorArray = {color(0,0,0,alpha),color(16, 37, 43,alpha),color(51, 10, 10,alpha),color(126, 255, 0,alpha)}; 
int currentColor; 
int nextColor; 

boolean change = false; 

void setup() { 
    size(640,480); 
    systems = new ArrayList<ParticleSystem>(); 
    smooth(); 
    noStroke(); 
    currentColor = 0; 
    for(int i = 0; i < limit; i++){ 
    systems.add(new ParticleSystem(random(100,200),10,new PVector(random(100,500),-5))); //random(480) 
    } 
    background(0); 
} 

void draw() { 
    //rect(0, 0, 2000, 2000); 
    fill(colorArray[currentColor]); 
    rect(0, 0, width*2, height*2); 
    //background(colorArray[currentColor]); 
    if(change){ 
     currentColor = nextColor; 
     change = false; 

    } 

    if(!systems.isEmpty()){ 
     for (int i =0; i < systems.size(); i++){ 
     ParticleSystem ps = systems.get(i); 
     ps.applyForce(gravity); 
     ps.run(); 
     if(wR){ 
      ps.applyForce(windRight); 
     } 
     if(sP){ 
      ps.applyForce(sortaSpeed); 
     } 
     } 
    } 
} 

void keyPressed() { 

    if(key == 'w'){ 
    wR = true; 
    print("w"); 
    } 
    if(key == 'a'){ 
    print('a'); 
    sP = true; 
    } 
} 

void keyReleased(){ 
    if(key == 'w'){ 
    wR = false; 
    } else if(key == 'a'){ 
    sP = false; 
    } else if(key == 's'){ 
    if(key == 's'){ 
     change = true; 
     println("currentColor: "+currentColor); 
     int newColor = currentColor; 
     while (newColor == currentColor) 
     newColor=(int) random(colorArray.length); 
     nextColor = newColor; 
    } 


    } // end of cS 
} 

回答

0

在未来,请尝试发布的MCVE。现在我们无法运行您的代码,因为它包含编译器错误。无论如何,我们不需要看到你的整个草图,只是一个小例子而已。

但是,您的问题是由于您尝试在背景中使用Alpha值导致的。这对background()函数不起作用,因为该函数会忽略alpha值,并且它不会与rect()函数一起工作,因为那样您将不会清除旧帧 - 您将通过透明矩形看到它们。

取而代之,您可以使用lerpColor()函数来计算从一种颜色到另一种颜色的转换。

这里是一个随机颜色之间过渡的例子:

color fromColor = getRandomColor(); 
color toColor = getRandomColor(); 

float currentLerpValue = 0; 
float lerpStep = .01; 

void draw() { 

    color currentColor = lerpColor(fromColor, toColor, currentLerpValue); 

    currentLerpValue += lerpStep; 
    if (currentLerpValue >= 1) { 
    fromColor = currentColor; 
    toColor= getRandomColor(); 
    currentLerpValue = 0; 
    } 

    background(currentColor); 
} 

color getRandomColor() { 
    return color(random(255), random(255), random(255)); 
}