int many = 10;
PShape[] a = new PShape[many];
void setup() {
size(1680, 1005, P3D);
make_shapes();
}
void make_shapes() {
for (int i = 0; i < many; i++) {
float variable = i*50;
a[i] = createShape();
a[i].beginShape();
a[i].fill(0, 0, 255);
a[i].stroke(255);
a[i].strokeWeight(0.25);
a[i].vertex(250+variable, 500+variable);
a[i].vertex(250+variable, 600+variable);
a[i].vertex(350+variable, 600+variable);
a[i].vertex(350+variable, 500+variable);
a[i].endShape(CLOSE);
}
}
void draw() {
background(0);
for (int i = 0; i < many; i++) shape(a[i]);
}
void keyPressed() {
if ( key == 'c' ) a[2].setFill(color(200, 200, 0));
}
-a- the main structure of making all shapes ( in a array or not ) at runtime
( 60 times per sec ) actually makes the createshape command useless.
-b- changing a shape and then create it again with the original color and show it
means you would never see it
-c- you forget the color() thing
here a example of a GRID made of ARRAY of CLASS
a old example i actually not checked, just to give you a idea.
// https://discourse.processing.org/t/scalable-grid-with-rectangles/7256
// https://discourse.processing.org/t/better-grid-performance/7314
// test FPS on RPI
// grid 8 FPS 59
// grid 100 FPS 6.7 ( disable rect get FPS 45 ) ( noSmooth FPS 9 )
// grid 100 FPS 5.4 ( size(1200,1200) )
// grid 500 FPS go down slowly ?
// test FX2D not run on RPI
// use backup memory array for resize/reinit grid but remember selected rects
int x = 12, y = x, w = 50, h = w, grid = 10, many = grid*grid;
boolean auto = false;//true;
boolean shownum = false; // key [n]
boolean showstroke = true;
boolean showFPS = true;
// color setup:
color bg = color(200, 200, 0);
color stk = color(0, 0, 200);
color fillsel = color(0, 200, 0);
color fillnsel= color(200, 0, 200);
Myrect[] myrects = new Myrect[many];
Mybackup[] myselects = new Mybackup[many]; // temporary memory
void setup() {
size(800, 520);
noSmooth();
set_grid(true); // init
println("use: mouse LEFT to select, mouse RIGHT to deselect");
println("key UP DOWN RIGHT LEFT for position");
println("key + - for grid size");
println("key n toggle shownumber");
}
void draw() {
background(bg);
fill(0);
if (showFPS ) text(nf(frameRate, 1, 1), 10, 10);
for (int i = 0; i < many; i++) myrects[i].drawit(); // draw each rect ( and check on mouse over + click )
}
class Mybackup {
boolean selected=false;
}
class Myrect {
int x, y, id;//, w, h; from global
boolean selected=false;
Myrect (int x, int y, int id) {
this.x = x;
this.y = y;
this.id = id;
}
void drawit() {
if ( showstroke ) stroke(stk);
else noStroke();
if ( selected ) fill(fillsel);
else fill(fillnsel);
rect(x, y, w, h);
fill(0); // black text
if (shownum) text(id, x+w/4, y+h/3);
sel();
}
boolean over() {
return( x < mouseX && mouseX < x+w && y < mouseY && mouseY < y+h );
}
void sel() {
if ( over() ) {
if ( selected && mousePressed && mouseButton == RIGHT) selected=false;
if ( !selected && mousePressed && mouseButton == LEFT) selected=true;
}
}
}
void set_wh() {
// use x,y,grid as master and auto adjust rectangles (w,h) to window:
println(" width= "+width+", height= "+height+", grid= "+grid);
w = ( width - 2 * x ) / grid;
println(" w= "+w+", x= "+x+", ( grid * w + 2 * x )= "+(grid*w+2*x));
h = ( height - 2 * y ) / grid;
println(" h= "+h+", y= "+y+", ( grid * h + 2 * y )= "+(grid*h+2*y));
}
void set_grid(boolean init) {
if ( auto ) set_wh();
if ( init ) for (int i = 0; i < many; i++) myselects[i]=new Mybackup(); // init backup memory
else for (int i = 0; i < many; i++) myselects[i].selected = myrects[i].selected; // backup
for (int i = 0; i < many; i++) myrects[i]=new Myrect(x+(i%grid)*w, y+(floor(i/grid))*h, i); // resize
if ( !init ) for (int i = 0; i < many; i++) myrects[i].selected = myselects[i].selected; // restore
}
void keyPressed() {
if ( keyCode == UP ) y--;
else if ( keyCode == DOWN ) y++;
else if ( keyCode == LEFT ) x--;
else if ( keyCode == RIGHT ) x++;
else if ( key == '+' ) w++;
else if ( key == '-' ) w--;
h=w;
auto = false; // confirm
set_grid(false);
if ( key == 'n' ) shownum = !shownum;
}