处理 - 颜色循环

时间:2015-09-16 10:04:49

标签: java colors processing rgb

我试图创建一个窗口,当你点击一次时会发生一个变色循环:

代码:

package declaringvariables;

import processing.core.PApplet;


public class DeclaringVariables extends PApplet {

    public void setup() {

        width = 800;
        height = 600;
        size(width,height);
    }

    boolean down = false;
    float R = 255;
    float G = 255;
    float B = 0;
    float incremento = +1;
    float mincol = 0, maxcol = 255;

    public void draw() {

        background (1,255,1);

        if(down) {
            println("\nFramecount: "+frameCount);
            println("The current framerate is: "+frameRate);
            background(R,G,B);
            R += incremento;
            if (R > maxcol) incremento = -1;
            else if (R > mincol) incremento = random(2);
                B += incremento;
            if (B > maxcol) incremento = -1;
            else if (B < mincol) incremento = +5;
                G += incremento;
            if (G > maxcol) incremento = -1;
            else if (G < mincol) incremento = +10;
            frameRate(150);
            }
        }


    public void mousePressed() {
        down = true;
    }
}

因为它现在有点工作,我点击它开始改变颜色,直到它变为绿色(1,255,1)RGB,然后它停止。我需要它循环,所以它是一个不断变化的背景。

我想过制作某种&#34; if语句&#34;,当它变成绿色时重置背景。还有一个while循环,但它都降低了我的帧率并且没有使它工作。

行结束时,我希望我的if(down = true)语句在单击后重复自我。

提前谢谢你:)

2 个答案:

答案 0 :(得分:1)

首先:你真的是指if(down = true)吗?这将指定true为down,而不仅仅测试它是否为true。我建议你改用if(down)

为了循环颜色,您可以使用模数(%)。这样,一旦你超过255,就从0开始。

答案 1 :(得分:0)

除了主要的颜色插值问题外,很少有东西可以改进:

  1. 在调用size(800,600);之前调用width,height更好,而不是直接访问size()(在幕后做了很多事情)
  2. 您可以在setup()中设置一次frameRate,而不是在draw()
  3. 中反复设置
  4. 如果值的行为不符合预期,最好将它们打印到控制台或在屏幕上显示,以便观察它们的行为方式
  5. 与您的问题相关的更紧密:

    1. 您使用3个值的单个增量,但希望3个值独立增加:您应该使用3个增量变量来保持每个颜色通道值独立
    2. 您应该在将增量应用到颜色通道之前检查并调整增量
    3. 以下是代码中的三点:

      public void setup() {
      
          size(800,600);
      }
      
      boolean down = false;
      float R = 255;
      float G = 255;
      float B = 0;
      float incrementoR = +1;
      float incrementoG = +1;
      float incrementoB = +1;
      float mincol = 0, maxcol = 255;
      
      public void draw() {
      
          background (1,255,1);
      
          if(down) {
      
              println("\nFramecount: "+frameCount);
              println("The current framerate is: "+frameRate);
              background(R,G,B);
              R += incrementoR;
              if (R > maxcol) incrementoR = -1;
              else if (R > mincol) incrementoR = random(2);
                  B += incrementoB;
              if (B > maxcol) incrementoG = -1;
              else if (B < mincol) incrementoG = +5;
                  G += incrementoG;
              if (G > maxcol) incrementoB = -1;
              else if (G < mincol) incrementoB = +10;
              frameRate(150);
              }
      
           fill(127);   
           text("R:"+(int)R+"\tG:"+(int)G+"\tB:"+(int)B,15,15);
      
          }
      
      
      public void mousePressed() {
          down = true;
      }
      

      您会注意到值超出0-255范围的速度非常快。 这是调整的代码,首先更新增量,然后是值。 此外,这是在绘制之前完成的,否则您将始终绘制先前的R,G,B值:

      public void setup() {
      
        size(800,600);
        frameRate(150);
      
      }
      
      boolean down = false;
      float R = 255;
      float G = 255;
      float B = 0;
      float incrementoR = +1;
      float incrementoG = +1;
      float incrementoB = +1;
      float mincol = 0, maxcol = 255;
      
      public void draw() {
      
          background (1,255,1);
      
          if(down) {
      
              //update increments prior to applying them
              if(R > maxcol) incrementoR = -1;
              if(R < mincol) incrementoR = random(2);
      
              if(G > maxcol) incrementoG = -1;  
              if(G < mincol) incrementoG = +5;
      
              if(B > maxcol) incrementoB = -1; 
              if(B < mincol) incrementoB = +10;
      
              //apply increments
              R += incrementoR;
              G += incrementoG;
              B += incrementoB;
      
              println("\nFramecount: "+frameCount);
              println("The current framerate is: "+frameRate);
              background(R,G,B);
              }
      
           fill(127);   
           text("R:"+(int)R+"\tG:"+(int)G+"\tB:"+(int)B,15,15);
      
          }
      
      
      public void mousePressed() {
          down = true;
      }
      

      如果你想更多地玩颜色,你还应该结帐lerpColor()colorMode(),玩起来很有趣。