// Puzzle // Autor: Jorge Cardoso // Data: 24 Outubro 2005 // Versão 0.5 /* A imagem inteira */ PImage imgInteira; /* A imagem em blocos */ PImage blocos[]; /* As posicoes de cada bloco no ecrã. TODO: Gerar as posicoes aleatoriamente */ int posicoes[][] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, -1}}; /* Inicialização */ void setup() { size(400, 300); framerate(10); /* carregar a imagem original */ imgInteira = loadImage("muffin.jpg"); /* criar os blocos */ blocos = new PImage[12]; /* TODO: colocar isto num ciclo! */ blocos[0] = new PImage(100, 100); blocos[0].copy(imgInteira, 0, 0, 100, 100, 0, 0, 100, 100); blocos[1] = new PImage(100, 100); blocos[1].copy(imgInteira, 100, 0, 100, 100, 0, 0, 100, 100); blocos[2] = new PImage(100, 100); blocos[2].copy(imgInteira, 200, 0, 100, 100, 0, 0, 100, 100); blocos[3] = new PImage(100, 100); blocos[3].copy(imgInteira, 300, 0, 100, 100, 0, 0, 100, 100); blocos[4] = new PImage(100, 100); blocos[4].copy(imgInteira, 0, 100, 100, 100, 0, 0, 100, 100); blocos[5] = new PImage(100, 100); blocos[5].copy(imgInteira, 100, 100, 100, 100, 0, 0, 100, 100); blocos[6] = new PImage(100, 100); blocos[6].copy(imgInteira, 200, 100, 100, 100, 0, 0, 100, 100); blocos[7] = new PImage(100, 100); blocos[7].copy(imgInteira, 300, 100, 100, 100, 0, 0, 100, 100); blocos[8] = new PImage(100, 100); blocos[8].copy(imgInteira, 0, 200, 100, 100, 0, 0, 100, 100); blocos[9] = new PImage(100, 100); blocos[9].copy(imgInteira, 100, 200, 100, 100, 0, 0, 100, 100); blocos[10] = new PImage(100, 100); blocos[10].copy(imgInteira, 200, 200, 100, 100, 0, 0, 100, 100); blocos[11] = new PImage(100, 100); blocos[11].copy(imgInteira, 300, 200, 100, 100, 0, 0, 100, 100); } void draw() { background(0); /* desenhar os blocos nas posicoes correspondentes */ for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { if (posicoes[i][j] >= 0) { //rotate(radians(45)); image(blocos[posicoes[i][j]], j*100, i*100); //rotate(-radians(45)); } } } /* desenhar a grelha */ stroke(255); // cor branca para a linha // linhas verticais for (int i = 0; i < 400; i = i + 100) { line(i, 0, i, 300); } // linhas horizontais for (int i = 0; i < 300; i = i + 100) { line(0, i, 400, i); } /* Se o utilizador pressionar a tecla 'o', mostramos a imagem original */ if(keyPressed) { if (key == 'o' || key == 'O') { image(imgInteira, 0, 0); } } } void mousePressed() { /* determinar em que bloco o rato foi pressionado. Basta fazer a divisão inteira por 100..*/ int blocoX = mouseX/100; int blocoY = mouseY/100; /* procurar o bloco vazio à volta do bloco pressionado e se o encontrarmos, trocar os blocos */ // procurar no bloco à esquerda if (blocoX > 0) { if (posicoes[blocoY][blocoX-1] == -1) { posicoes[blocoY][blocoX-1] = posicoes[blocoY][blocoX]; posicoes[blocoY][blocoX] = -1; return; } } // procurar no bloco à direita if (blocoX < 3) { if (posicoes[blocoY][blocoX+1] == -1) { posicoes[blocoY][blocoX+1] = posicoes[blocoY][blocoX]; posicoes[blocoY][blocoX] = -1; return; } } // procurar no bloco acima if (blocoY > 0) { if (posicoes[blocoY-1][blocoX] == -1) { posicoes[blocoY-1][blocoX] = posicoes[blocoY][blocoX]; posicoes[blocoY][blocoX] = -1; return; } } // procurar no bloco abaixo if (blocoY < 2) { if (posicoes[blocoY+1][blocoX] == -1) { posicoes[blocoY+1][blocoX] = posicoes[blocoY][blocoX]; posicoes[blocoY][blocoX] = -1; return; } } }