Car Show Applet Chapter 5, Excercise 5.12: // Car Show Applet // Eric B. // // July 20, 2000 // // Draws a car driving across the screen. In this case, a Saab 9^3. // It looks nice, but I don't think I'd ever buy one. Too much hassle! // // Assignment 5.12, p265 import java.awt.*; import java.applet.*; import java.awt.event.*; public class CarShow extends Applet implements Runnable { // Double buffering initialization private Dimension appletSize; private Image offscreenBuffer; public Graphics gOff, g; // Set up space for our images private Image carImage, carImage2, carLogo; // Set up space for the thread that will run to move the car private Thread carLoop; // Set up space for the car object public Car myCar; public void init() { // Set up the double buffering. g = getGraphics(); appletSize = getSize(); offscreenBuffer = createImage(appletSize.width, appletSize.height); gOff = offscreenBuffer.getGraphics(); // Load the images into memory. carImage = getImage(getDocumentBase(), "carGif.gif"); carImage2 = getImage(getDocumentBase(), "carGif_2.gif"); carLogo = getImage(getDocumentBase(), "carLogo.gif"); // Create our car object myCar = new Car(500, 40, carImage, carImage2); // Initialize the running thread and start carLoop = new Thread(this); carLoop.start(); } public void run() { // Notice that the below loop is always running - what we want while (true) { // Clear the drawing area gOff.setColor(Color.white); gOff.fillRect(0,0, 500, 500); // Draw the 9^3 logo gOff.drawImage(carLogo, 5, 5, null); // Display the car. It will move of its own volition. myCar.display(gOff); // Paint the current contents of the buffer paint(g); // This try / catch is necessary for the sleep function. try {carLoop.sleep(5);} catch (InterruptedException e) {} } } public void paint(Graphics g) { // Blit the buffer g.drawImage(offscreenBuffer, 0, 0, null); } } class Car { // Set up location information and the bitmaps we'll draw private int x, y; private Image carImage, carImage2; private int flipped = 0; // Construct our object public Car(int x, int y, Image carImage, Image carImage2) { this.x = x; this.y = y; this.carImage = carImage; this.carImage2 = carImage2; } public void display(Graphics g) { // Draw alternating images (flip between images every third frame) // The flipped was once a boolean, which is more elegant, but the // didn't look right flipped every other frame. // Not that it looks right now... Still pretty spiffy, though. if (flipped <= 2) { g.drawImage(carImage, x, y, null); flipped++; } else { g.drawImage(carImage2, x, y, null); flipped = 0; } x--; // Right to left if (x < -100) // If the car is off the screen on left, move to right x = 500; } } Click here for the CarShow Class File Click here for the Car Class File Catch The Creature Chapter 5, Excercise 5.8: // Catch The Creature Applet // Eric Boyd // // July 20, 2000 // // A little game where you try to click the creature. In this case // Micheal Stipe, lead singer of REM. (Hey, why not?) // // It displays the creature at random intervals in random places, with // random pauses in between. // // A hit count and attempt count is displayed. // // Assignment 5.8, p264 import java.awt.*; import java.applet.*; import java.awt.event.*; public class CatchTheCreature extends Applet implements Runnable, MouseListener { // Set up the playfield vars protected static int playAreaWidth = 300, playAreaHeight = 300; protected static int playAreaXStart = 50, playAreaYStart = 50; // Double buffering initialization private Dimension appletSize; private Image offscreenBuffer; public Graphics gOff, g; // Set up space for our images private Image creatureImage; // Set up space for the thread that will run to move the creature private Thread creatureLoop; // Set up space for the creature object public Creature myCreature; // Our clicked audio clip private AudioClip clicked; public void init() { // Set up the double buffering. g = getGraphics(); appletSize = getSize(); offscreenBuffer = createImage(appletSize.width, appletSize.height); gOff = offscreenBuffer.getGraphics(); // Load the images and audio into memory. creatureImage = getImage(getDocumentBase(), "creatureStipe.gif"); clicked = getAudioClip(getCodeBase(), "sound.au"); // Create our car object myCreature = new Creature(0, 0, creatureImage); // Initialize the running thread and start creatureLoop = new Thread(this); creatureLoop.start(); this.addMouseListener(this); } public void run() { int delay = 0; // Notice that the below loop is always running - What we want while (true) { // Come up with a random interval delay = (int)(Math.random() * 2000) + 500; // Come up with a new location myCreature.newLocation(); // Paint the current contents of the buffer paint(g); // This try / catch is necessary for the sleep function. try {creatureLoop.sleep(delay);} catch (InterruptedException e) {} // Toggle the creature's visibility if (myCreature.visible) { myCreature.visible = false; } else { myCreature.visible = true; myCreature.tryCount(); // If it appears, you have another chance } } } public void paint(Graphics g) { // Clear the drawing area gOff.setColor(Color.white); gOff.fillRect(0, 0, appletSize.width, appletSize.height); // Outline the playfield gOff.setColor(Color.black); gOff.drawRect(playAreaXStart, playAreaYStart, playAreaWidth, playAreaHeight); // Display the hitcount myCreature.displayCount(gOff); // Display the creature if it's visible if (myCreature.visible) myCreature.display(gOff); // Blit the buffer g.drawImage(offscreenBuffer, 0, 0, null); } public void mouseClicked(MouseEvent e) { // Check to see if the click is on the creature. Play the sound and repaint. if (myCreature.checkClick(e.getX(), e.getY())) { clicked.play(); paint(g); } } // Junk methods for interface compatibility public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} } class Creature { // Declare our vars private int x, y; private int hitCount = 0; private int tryCount = 0; private Image creatureImage; public boolean visible = true; // Construct the creature public Creature(int x, int y, Image creatureImage) { this.x = x; this.y = y; this.creatureImage = creatureImage; } public void display(Graphics g) { // Draw the image g.drawImage(creatureImage, CatchTheCreature.playAreaXStart+x, CatchTheCreature.playAreaXStart+y, null); } public void displayCount(Graphics g) { // Get rid of the standard font. Font stdFont = new Font("Verdana", Font.BOLD, 9); g.setFont(stdFont); // Draw the text g.setColor(Color.gray); g.drawString("Hits: " + hitCount, 50, 38); g.drawString("Tries: " + tryCount, 50, 48); } // Determine a random new location public void newLocation() { x = (int)(Math.random() * (CatchTheCreature.playAreaWidth-50)); y = (int)(Math.random() * (CatchTheCreature.playAreaHeight-50)); } // Check to see if the click was on the creature. // If so, hide the creature and increment the hitcounter. public boolean checkClick(int clickX, int clickY) { int checkX = clickX - CatchTheCreature.playAreaXStart; int checkY = clickY - CatchTheCreature.playAreaYStart; if (( checkX < x + 50) && ( checkX > x) && (checkY > y) && (checkY < y + 50) && (visible)) { hitCount++; visible = false; return true; } else { return false; } } // Increase the number of times displayed public void tryCount() {tryCount++;} }Click here for the Catch.. Class File Click here for the Creature Class File |