/********************************************************************
* 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