// class JavaSlot, written by Paul Buchheit, ptb@po.cwru.edu import java.applet.Applet; import java.awt.Graphics; import java.awt.Image; import java.awt.Event; // This is the final Java Slot machine. It is based off of the // second one and improves animation by doing the drawing within // the run() method instead of using repaint(). public class JavaSlot5 extends Applet implements Runnable { Image strip, body; // The slot machine body and wheel int wheelPosX = 22, wheelPosY = 22; // The positon of the wheel int wheelSize = 55; // The size of the wheel int nstripItems = 5; // How many items are on the wheel int stripLen = nstripItems * wheelSize; int currentWheelPos; // speaks for itself // about how far (in items) should the wheel spin before stopping int itemsToSpin; int delay; // The delay between wheel movements // max and min wheel movement during a single step of the wheel double maxSpeed = 20, minSpeed = 2; Thread spinning = null; public void init() { // Grabs the images from the server strip = getImage(getCodeBase(), "strip.gif"); body = getImage(getCodeBase(), "tux-body.gif"); // Reads values from the HTML file delay = readIntParam("delay", 10); itemsToSpin = readIntParam("itemsToSpin", 20); // sets the inital wheel position currentWheelPos = getNewItem() * wheelSize; } // Reads in the integer parameter "name" from the HTML, returns // defalutVal if a value is not specified int readIntParam(String name, int defaultVal) { String s = getParameter(name); if(s == null) { return(defaultVal); } else { return(Integer.valueOf(s).intValue()); } } // Randomly chooses a new item on wheel int getNewItem() { return((int)(Math.random() * nstripItems) % nstripItems); } // Calculates the next wheel position based on the current // position and the desired final position. // Not magic, meant to make the wheel slow down as is reaches its // destination. int findNextPos(int currentP, int finalP) { double speed = Math.cos(Math.PI / 2 * (double)currentP / (double)finalP); speed *= maxSpeed - minSpeed; speed += minSpeed; currentP += Math.round(speed); return(Math.min(currentP, finalP)); // Makes sure we don't go over } // Gets called when the spinning thread is started, spins the wheel public void run() { int nextItem = getNewItem(); // gets something to spin to int pos = currentWheelPos; int finalPos = (itemsToSpin + nextItem) * wheelSize; Graphics g = createForWheel(getGraphics()); while((spinning != null) && (pos != finalPos)) { pos = findNextPos(pos, finalPos); currentWheelPos = pos % stripLen; drawWheel(g, currentWheelPos); getToolkit().sync(); try { Thread.sleep(delay); } catch(InterruptedException e) { } } g.dispose(); spinning = null; } // This gets called when the mouse button is clicked inside // the applet, if the wheel is already spinning it will // ignore the click, otherwise it will start up a thread // that spins the wheel public boolean mouseDown(Event e, int x, int y) { if(spinning == null) { spinning = new Thread(this); spinning.start(); } return(true); } public void update(Graphics g) { paint(g); } // Draws the wheel turned to position "pos" using a Graphics // clipped for the wheel void drawWheel(Graphics g, int pos) { g.drawImage(strip, 0, -pos, this); // loops back if we are running off the end of the strip. if(pos > stripLen - wheelSize) g.drawImage(strip, 0, stripLen - pos, this); } // creates a new Graphics for drawing the wheel Graphics createForWheel(Graphics bodyG) { return bodyG.create(wheelPosX, wheelPosY, wheelSize, wheelSize); } // Draws the whole slot machine public void paint(Graphics g) { g.drawImage(body, 0, 0, this); Graphics clipG = createForWheel(g); drawWheel(clipG, currentWheelPos); clipG.dispose(); } }