-2

我是处理新手,正在创建一个草图,其中一个 600 像素 x 600 像素的画布填充了我orange[]调色板中随机颜色的 50 像素矩形。块的随机形成需要位于draw()函数内部,以便在我稍后放入的一些条件下正确操作。

我得到的错误是ArrayIndexOutOfBoundsException: 12在这一行:

randomSize[varCreator] = sIncrement[int(random(0,sIncrement.length-1))];

我似乎无法弄清楚为什么会发生此错误。我已经研究过相关的问题,也许只是因为我太新了,但我无法弄清楚:

int x; //x coordinate
int y; //y coordinat
int s = 50; //rect size
int wide = 600; //canvas width
int tall = 600; //canvas height
int[] sIncrement = new int[12];//{s, s*2, s*3, s*4, s*5, s*6};

//colors
int[] oranges = {
  #773600, #5f3613, #552700, #9c5215, #9c5c26
};
int[] blues = {
  #004848, #0c3939, #003333, #107979, #1e7979
};
int[] palette = oranges;//holds current color pallete

//random
int fillColor = palette[int(random(0, palette.length))]; //random starting fill color
int changeColor = palette[int(random(0, palette.length))]; //random new color
int[] randomSize = new int[sIncrement.length]; //array of lots of random s values to place newly color changed blocks


//setup
void setup(){
  size(wide, tall);
  background(255);
  noStroke();
  frameRate(24);

  /*fills sIncrement array with incrementing s values (i.e. if s = 50 then array 
   contains 50, 100, 150, etc...) from 0 to canvas width for use in a conditional statement*/
  for(int i = 0; i <= sIncrement.length-1; i++){
    sIncrement[i] = s*i;
  }

 //creates multiple randomSize variables for if() x or y == randomSize[varCreator] 
 for(int varCreator = 0; varCreator <= (width/s)+(height/s); varCreator++){
   randomSize[varCreator] = sIncrement[int(random(0,sIncrement.length-1))];
 }
}

//draw
void draw(){
  fill(fillColor); //selects random color from palette

  //draws grid colored boxes with s size
  for (y = 0; y <= height; y+= s) {
    for (x = 0; x <= width; x+= s) {
      if(x == sIncrement[randomSize[1]] && y == sIncrement[randomSize[3]]){
        fill(changeColor); //selects random color from palette
        rect(x, y, s, s);
      }

      else{
      fill(fillColor);
     // fill(palette[int(random(0, palette.length))]); //selects random color from palette
      rect(x, y, s, s);
      }
    }
  }
}
4

2 回答 2

1

跟踪你的代码你有这个:

int[] sIncrement = new int[12];                    // sIncrement initialized with size 12
int[] randomSize = new int[sIncrement.length];     // randomSize initialized with size 12
for(... ; varCreator <= (width/s)+(height/s); ...) // varcreator <= 24!
randomSize[varCreator] = ...                       // Problem line

varcreator >= 12你得到一个数组索引越界异常。从那里开始并修复您的代码。

于 2013-02-11T03:17:23.933 回答
1

您正在访问数组的元素randomSize。这个数组有多长?让我们看看它的声明:

int[] randomSize = new int[sIncrement.length];

因此,它与数组的长度相同sIncrement。如果我们早一点看:

int[] sIncrement = new int[12];

的长度sIncrement,因此 的长度randomSize为 12。

在这段代码中:

for(int varCreator = 0; varCreator <= (width/s)+(height/s); varCreator++){
    randomSize[varCreator] = sIncrement[int(random(0,sIncrement.length-1))];
}

用于访问数组元素的索引randomSize在变量varCreator中,从 0 到(width/s)+(height/s). 由于 的长度randomSize是 12,所以只能使用 0 到 11 的索引来访问元素,否则会报错。

所以,如果(width/s)+(height/s)不应该是 12 或更多。这个多少钱 ?

这就是我们陷入困境的地方,因为您的代码中没有任何内容告诉我们在哪里声明widthheight声明。我们只知道s是50。

但是你有这些变量widetall,每个都等于 600。我将大胆猜测并估计在你的代码中的某个地方你有width = wideheight = tall

所以(width/s)+(height/s) = (600/50) + (600/50) = 12 + 12 = 24

就是这样。varCreator从 0 到 24(包括在内),因此您超出了数组的范围。

于 2013-02-11T03:20:24.617 回答