/******************************************************************** * Author: Nicholas D. Exner * Created: July 21, 1998 * Updated: March 1, 2005 * * DISCLAIMER: All source, compiled code, and graphics copyright 1998-2005 * You are granted permission to use this code or parts of this code * for any purpose providing this copyright notice is retained and that * you give credit to the original author noted above. * * Applet tag(s): * * * * * ********************************************************************/ import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.applet.AudioClip; public class CliffApp extends Applet implements Runnable { Image backgroundImg; // backCliff; Image fallImg; Image characterImg[] = new Image[8]; AudioClip loseSnd; AudioClip winSnd; static int fps = 30, keyFrameFreq = 10; // Double buffering Global Variables Image offscreenImg; Graphics h; // Thread Global Variables Thread runner; boolean threadRun = true; int frameNumber = 0; Applet receiver = null; String receiverName = "receiverapp"; Button startB = new Button("Start"); Button stepB = new Button("Take Step"); int xpos=250, ypos=14; int characterImgIndex = 0; boolean trialComplete = false; //////// int winsNum=0; int losesNum=0; int forwardNum=0; int backNum=0; //////// public void loadMyMedia() { Graphics g = getGraphics(); g.drawString("Loading...",100,100); MediaTracker tracker = new MediaTracker(this); backgroundImg = getImage(getCodeBase(),"res/back.jpg"); tracker.addImage(backgroundImg,98); characterImg[0] = getImage(getCodeBase(),"res/0.gif"); tracker.addImage(characterImg[0],97); characterImg[1] = getImage(getCodeBase(),"res/1.gif"); tracker.addImage(characterImg[1],96); characterImg[2] = getImage(getCodeBase(),"res/2.gif"); tracker.addImage(characterImg[2],95); characterImg[3] = getImage(getCodeBase(),"res/3.gif"); tracker.addImage(characterImg[3],94); characterImg[4] = getImage(getCodeBase(),"res/4.gif"); tracker.addImage(characterImg[4],93); characterImg[5] = getImage(getCodeBase(),"res/5.gif"); tracker.addImage(characterImg[5],92); characterImg[6] = getImage(getCodeBase(),"res/6.gif"); tracker.addImage(characterImg[6],91); characterImg[7] = getImage(getCodeBase(),"res/7.gif"); tracker.addImage(characterImg[7],90); fallImg = getImage(getCodeBase(),"res/fallguy.gif"); tracker.addImage(fallImg,89); loseSnd = getAudioClip(getCodeBase(),"res/yeeuh.au"); // tracker.addClip(loseSnd,89); winSnd = getAudioClip(getCodeBase(),"res/alright.au"); // tracker.addSound(winSnd,88); // Load images try { for (int i=89;i<=98;i++) tracker.waitForID(i); } catch (InterruptedException e) {} } public void init() { setBackground(new Color(100,100,255)); // Setup double-buffering variables offscreenImg = createImage(this.size().width, this.size().height); h = offscreenImg.getGraphics(); add(startB); add(stepB); loadMyMedia(); receiver = getAppletContext().getApplet(receiverName); characterImgIndex = 0; repaint(); } public void checkIfWin() { if (!trialComplete && xpos > 400) { // If win trialComplete = true; winSnd.play(); winsNum++; } if (!trialComplete && xpos < 250) { // If fall trialComplete = true; loseSnd.play(); losesNum++; xpos -= 10; } if (receiver != null && receiver instanceof CliffStat) { ((CliffStat)receiver).updateVal(winsNum,losesNum,forwardNum,backNum); } } public void paint(Graphics g) { // Paint background g.drawImage(backgroundImg,0,0,this); // On cliff if (xpos <= 400 && xpos >=250) { if (characterImgIndex >= 1) characterImgIndex++; if (characterImgIndex >= characterImg.length) characterImgIndex=0; g.drawImage(characterImg[characterImgIndex],xpos,ypos,this); } // To the right and winning if (trialComplete && xpos > 400){ g.setColor(Color.red); g.setFont(new Font("TimesRoman",Font.BOLD,72)); g.drawString("You Win!",40,200); } // To the left and losing if (trialComplete && xpos < 250){ if (ypos < 550) { ypos+=10; xpos-=5; g.drawImage(fallImg,xpos,ypos,this); } } } // Paint // Call paint and send buffer to screen public void update(Graphics g) { paint(h); g.drawImage(offscreenImg,0,0,this); } public boolean action(Event evt, Object arg) { if (evt.target == startB) { trialComplete = false; xpos = 250; ypos = 14; forwardNum=0; backNum=0; repaint(); checkIfWin(); } if (evt.target == stepB && ypos == 14) { if (xpos < 401) { moveGuy(); characterImgIndex++; repaint(); checkIfWin(); } } return true; } public void moveGuy() { int move=(int)(Math.random()*3); switch (move) { case 1: xpos-=10; forwardNum++; break; default: xpos+=10; backNum++; } } public String getAppletInfo() { return "Cliff Hanger Applet copyright 1998 MSTE"; } /// Start Thread stuff public void start() { if (runner == null) { runner= new Thread(this); runner.start(); threadRun = true; } } public synchronized void stop() { if (runner != null) { runner.stop(); runner = null; //startLoopSnd.stop(); } } public void run() { while (true) try { Thread.sleep(fps); repaint(); } catch (InterruptedException e) {} } // End Run } // End class ///////////////////////////////////// class CliffStat extends Applet { Image backCliff; Image offscreenImage; Graphics offscreenGraphics; int winsNum=0, losesNum=0, forwardNum=0, backNum=0; public void init(){ backCliff= getImage(getCodeBase(),"res/trial.jpg"); offscreenImage = createImage(this.size().width, this.size().height); offscreenGraphics = offscreenImage.getGraphics(); repaint(); } public void paint(Graphics g) { offscreenGraphics.drawImage(backCliff,0,0,this); offscreenGraphics.setColor(Color.yellow); //Big font offscreenGraphics.setFont(new Font("TimesRoman",Font.BOLD,32)); offscreenGraphics.drawString(""+(winsNum+losesNum),64,55); offscreenGraphics.setFont(new Font("TimesRoman",Font.BOLD,18)); offscreenGraphics.drawString(""+winsNum,97,81); offscreenGraphics.drawString(""+losesNum,97,107); offscreenGraphics.setFont(new Font("TimesRoman",Font.BOLD,10)); //small font offscreenGraphics.drawString(""+forwardNum,110,180); offscreenGraphics.drawString(""+backNum,110,196); offscreenGraphics.drawString(""+(backNum+forwardNum),110,212); g.drawImage(offscreenImage,0,0,this); } // Paint public void updateVal(int wins, int loses, int forward, int back) { winsNum=wins; losesNum=loses; forwardNum=forward; backNum=back; repaint(); } public double roundDouble(double x, int place) { double times=1.0; for (int j=0;j