Slide Puzzle
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Rectangle;
/* SlidePuzzle, originally from VisualJ++ Developer's News, July 1997 */
public class SlidePuzzle extends Applet implements Runnable {
Thread m_SlidePuzzle = null;
private Graphics m_Graphics;
private Image logo;
private boolean m_fAllLoaded = false;
private Rectangle squares[];
private int order[];
private int x = 1;
private int y = 0;
public void init() {
//Define and populate Rectangle array
squares = new Rectangle[9];
squares[0] = new Rectangle(0, 0, 60, 60);
squares[1] = new Rectangle(0, 60, 60, 60);
squares[2] = new Rectangle(0, 120, 60, 60);
squares[3] = new Rectangle(60, 0, 60, 60);
squares[4] = new Rectangle(60, 60, 60, 60);
squares[5] = new Rectangle(60, 120, 60, 60);
squares[6] = new Rectangle(120, 0, 60, 60);
squares[7] = new Rectangle(120, 60, 60, 60);
squares[8] = new Rectangle(120, 120, 60, 60);
//Define and populate int array
order = new int[9];
order[0] = 6;
order[1] = 2;
order[2] = 8;
order[3] = 1;
order[4] = 0;
order[5] = 7;
order[6] = 5;
order[7] = 4;
order[8] = 3;
}
public void paint(Graphics g) {
if (m_fAllLoaded) {
Rectangle r = g.getClipRect();
g.clearRect(r.x, r.y, r.width, r.height);
g.drawImage(logo, 0, 0, null);
} else
g.drawString("Loading images...", 10, 20);
}
public void start() {
if (m_SlidePuzzle == null) {
m_SlidePuzzle = new Thread(this);
m_SlidePuzzle.start();
}
}
public void stop() {
if (m_SlidePuzzle != null) {
m_SlidePuzzle.stop();
m_SlidePuzzle = null;
}
}
public void run() {
if (!m_fAllLoaded) {
m_Graphics = getGraphics();
MediaTracker tracker = new MediaTracker(this);
logo = getImage(getDocumentBase(), "vjlogo.gif");
tracker.addImage(logo, 0);
try {
tracker.waitForAll();
m_fAllLoaded = !tracker.isErrorAny();
} catch (InterruptedException e) {
}
if (!m_fAllLoaded) {
stop();
m_Graphics.drawString("Error loading images!", 10, 40);
return;
}
}
//Clear the screen and draw first image
repaint();
//Move the squares
while (true) {
for (x = 1; x < 9; x++) {
//Slow down the animation
try {
Thread.sleep(350);
} catch (InterruptedException e) {
}
//Move square to next location
m_Graphics.copyArea(squares[order[x]].x, squares[order[x]].y,
60, 60, squares[order[x - 1]].x - squares[order[x]].x,
squares[order[x - 1]].y - squares[order[x]].y);
//Clear most recently copied square
m_Graphics.clearRect(squares[order[x]].x, squares[order[x]].y,
60, 60);
}
//Repaint original graphic after two cycles
y++;
if (y == 2) {
repaint();
y = 0;
}
}
}
}
Related examples in the same category