我是处理新手,我正在创建一个草图,其中600px x 600px画布中填充了来自orange[]
调色板的50px随机颜色。块的随机形成需要位于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);
}
}
}
}
答案 0 :(得分: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
时,您将获得一个超出范围的数组索引异常。从那里开始修复你的代码。
答案 1 :(得分: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或更多。多少钱?
这就是我们陷入困境的地方,因为您的代码中没有任何内容告诉我们width
和height
的声明位置。我们只知道s
是50。
但是你有这些变量,wide
和tall
,每个等于600.我会猜测并估计代码中的某个地方width = wide
和height = tall
。
所以(width/s)+(height/s) = (600/50) + (600/50) = 12 + 12 = 24
就是这样。 varCreator
从0到24(包括在内),因此你用完了数组的边界。