PImage[] imgs = new PImage[4]; // loaded images PImage img; // current image int curImg = 0; // current image PImage[] pieces; // the image fragmented into rectangles int nx=3, ny=5; // number of rectangles across and down int dx,dy; // rectangle sizes, computed from width,height and nx,ny int selX=-1,selY=-1; // if a piece has been selected, its x and y indices (-1 if none) boolean auto=false; // whether or not to auto swap pieces void setup() { size(300,450); noFill(); strokeWeight(3); for(int i = 0; i < imgs.length; i ++) imgs[i] = loadImage("img-"+(i+1)+".jpg"); img = imgs[curImg]; makePieces(); } void makePieces() { dx=floor(width/nx); dy=floor(height/ny); // Fragment the image into rectangles, and string them into a line // piece 0,0; piece 0,1; ...; piece 0,nx-1; piece 1,0; piece 1,1; ... pieces = new PImage[nx*ny]; int p=0; for (int j=0; j= 0 && selY >= 0) { stroke(255,0,0); rect(dx*selX,dy*selY,dx,dy); // -1 to make sure red can be seen } } // Mix up all the pieces void shuffle() { // Swap each piece with some piece later in the array for (int i=0; i= 0 && selY >= 0) { if (selX == px && selY == py) { // same one twice -- cancel selX = -1; selY = -1; } else { // second selection -- swap swapPieces(px+py*nx, selX+selY*nx); selX = -1; selY = -1; } } else { // first selection selX = px; selY = py; } } void keyPressed() { if(key == ' ') { curImg = (curImg+1)%imgs.length; img = imgs[curImg]; makePieces(); } else if (key == 'a') auto = !auto; else if (key == 's') shuffle(); } // START NO NOTES // code used to capture screenshots void keyReleased() { if(key == '`' && !online) save("sketch.png"); }