允许线条设置颜色最初是相同的

时间:2017-04-20 02:38:37

标签: java colors processing

我有这个程序可以完成我想要它做的大部分工作,除了一个问题,它真的很小。当最初出现颜色的行集和框时,它们都是初始化的白色。但是,当您通过单击框更改每个更改时,它们都会更改为单独的颜色。为了让它们全部改变为相同的颜色,你必须循环遍历它们。我希望所有颜色框从一开始就是相同的颜色,而不必循环,但我不确定为什么我设置的方式不允许这样做。我很感激任何纠正的建议。

final int arraySize = 4;
int counter;

Button[] b = new Button[arraySize];
int[] flag = new int[]{1, 1, 1, 1};
boolean[] show = new boolean[arraySize];
char[] keys = new char[]{'1', '2', '3', '4'};
color[] cols = new color[] {#F6546A, #FFC390, #FFF68F, #D3FFCE, #C6E2FF, #D2B4FF, #FFFFFF, };
color[] c = new color[]{#FFFFFF, #FFFFFF, #FFFFFF, #FFFFFF};

void setup() {
  size(800, 700);
  counter = 0;

  for (int i = 0; i < arraySize; i++) {
    b[i] = new Button(20, 160+(40*i), 20, 20);
  }
}

void draw(){
  background(0);
  for (int i = 0; i < arraySize; i++) {
    if (show[i]) {
      b[i].draw_button(c[i]);
    }
  }
}

void keyPressed() {
  for (int i = 0; i < arraySize; i++) {
    if (key == keys[i] && flag[i] == 1) {
      show[i] = true;
      flag[i] = flag[i]*-1;
    } else if (key == keys[i] && flag[i] == -1) {
      show[i] = false;
      flag[i] = flag[i]*-1;
    }
  }
}

void mouseClicked() {
  for (int i = 0; i < arraySize; i++) {
    if (b[i].mouse_is_over() == true ) {
      c[i] = cols[counter];
      counter++;
    }
    if (counter == cols.length) {
      counter = 0;
    }
  }
}

class Button{
  float x, y, w, h;

  Button(float xpos, float ypos, float width_, float height_){
    x = xpos; y = ypos;
    w = width_; h = height_;
  }

  void draw_button(color c){
    fill(c);
    stroke(255);
    rect(x, y, w, h);
  }

  boolean mouse_is_over(){
    return (mouseX > x && mouseX < (x+w) && mouseY > y && mouseY < (y+h));
  }
}

2 个答案:

答案 0 :(得分:0)

目前,您的counter变量位于Button个实例之外。因此,如果您点击第一个按钮,则counter变量会上升到1,您可以使用它来设置第一个按钮的颜色。然后,当您单击第二个按钮时,counter变量会上升到2,您可以使用它来设置第二个按钮的颜色。单击其他按钮时会发生同样的事情:单击一个按钮会影响所有其他按钮的下一个颜色。

如果您希望每个按钮都有自己的颜色序列,那么您希望每个Button实例都有自己的counter。换句话说,您可能希望将counter变量移到Button类中。

然后,只要您使用counter变量,就必须使用特定counter实例的Button变量。

当你遇到它时,你可能想要移动Button类中的一些其他变量。 c类可以是Button类中的单个变量,用于跟踪Button实例的当前颜色,或者您可以删除它,因为您可以使用{无论如何{1}}变量。同样,counter数组可能只是flag类中的boolean变量。

答案 1 :(得分:0)

@Kevin Workman

我意识到我实际上并不需要通过计数器,正如你所说的那样将它内化在课堂上。

final int arraySize = 4;

Button[] b = new Button[arraySize];
int[] flag = new int[]{1, 1, 1, 1};
boolean[] show = new boolean[arraySize];
char[] keys = new char[]{'1', '2', '3', '4'};


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

  for (int i = 0; i < arraySize; i++) {
    b[i] = new Button(20, 160+(40*i), 20, 20);
  }
}

void draw(){
  background(0);
  for (int i = 0; i < arraySize; i++) {
    if (show[i]) {
      b[i].draw_button();
    }
  }
}

void keyPressed() {
  for (int i = 0; i < arraySize; i++) {
    if (key == keys[i] && flag[i] == 1) {
      show[i] = true;
      flag[i] = flag[i]*-1;
    } else if (key == keys[i] && flag[i] == -1) {
      show[i] = false;
      flag[i] = flag[i]*-1;
    }
  }
}

void mouseClicked() {
  for (int i = 0; i < arraySize; i++) {
      b[i].mouse_is_over();
  }
}

class Button{
  color[] cols = new color[] {#FFFFFF, #F6546A, #FFC390, #FFF68F, #D3FFCE, #C6E2FF, #D2B4FF,};
  float x, y, w, h;
  int counter;

  Button(float xpos, float ypos, float width_, float height_){
    x = xpos; y = ypos;
    w = width_; h = height_;
    counter = 0;
  }

  void draw_button(){
    fill(cols[counter]);
    stroke(255);
    rect(x, y, w, h);
  }

  void mouse_is_over(){
    if(mouseX > x && mouseX < (x+w) && mouseY > y && mouseY < (y+h)){
      counter++;
      counter = counter%cols.length;
    }
  }
}