Canyon Animation
<< Perspective | FinalProjectsTrailIndex | Sound Stuff >>
MovingSurface.java
import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Polygon; import java.awt.TexturePaint; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class MovingSurface { public static final int UP=0; public static final int DOWN=1; public static final int LEFT=2; public static final int RIGHT=3; private Polygon p; private int speed,direction; private BufferedImage img; //the texture // see http://oreilly.com/catalog/java2d/chapter/ch04.html public MovingSurface(String graphicFileName,int speed, int direction){ this.p=new Polygon(); this.direction=direction; this.speed=speed; this.img = null; try { img = ImageIO.read(new File(graphicFileName)); } catch (IOException e) {} } public void addPoint(int x, int y){ p.addPoint(x, y); } public int getWidth(){ return img.getWidth();} public int getHeight(){ return img.getHeight();} /** * * @param g the Graphics object to draw on * @param f the frame number used to animate img on the polygon */ public void draw(Graphics g, int f){ Graphics2D g2=(Graphics2D)g; int height=img.getHeight(); int width=img.getWidth(); int i= speed*f % width;// presume right Rectangle2D tr=new Rectangle2D.Double(i,0,width, height);//horiz //now check: if (direction==LEFT){ i= width-(speed*f % width);//left } else if (direction==DOWN){ i= speed*f % img.getHeight();//down tr=new Rectangle2D.Double(0,i,width, height);//vert } else if (direction==UP){ i= height-(speed*f % height);//up tr=new Rectangle2D.Double(0,i,width, height);//vert } TexturePaint tp=new TexturePaint(img,tr); g2.setPaint(tp); g2.fill(p); } }
CanyonAnimation.java
import java.awt.event.*; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.applet.*; import java.awt.*; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.*; public class CanyonAnimation extends Applet implements ActionListener { Timer timer; int frame, lastFrame; Image virtualMem; BufferedImage img; Graphics gBuffer; Button startButton; MovingSurface leftWall,rtWall,bottom,bottomRt; //AudioClip racingSound; public void init(){ int width=getWidth(); int height=getHeight(); timer = new Timer(1, this); frame=0; lastFrame=100; virtualMem = createImage(width,height); gBuffer = virtualMem.getGraphics(); gBuffer.setColor(Color.white); gBuffer.fillRect(0,0,width,height); gBuffer.setColor(Color.black); gBuffer.drawLine(width-10,height-frame,width+10,height-frame); startButton= new Button("Start"); //the class is its own button listener startButton.addActionListener (this); add(startButton); //Audio //racingSound = getAudioClip(getDocumentBase(), "racing.wav"); //Initialize side polygons leftWall=new MovingSurface("sand1.gif", -15, MovingSurface.LEFT); leftWall.addPoint(0,0); leftWall.addPoint(300, 100); leftWall.addPoint(300, 500); leftWall.addPoint(0, 600); rtWall=new MovingSurface("sand2.gif", 15, MovingSurface.RIGHT); rtWall.addPoint(800,0); rtWall.addPoint(500, 100); rtWall.addPoint(500, 500); rtWall.addPoint(800, 600); //lastFrame=rtWall.getWidth(); bottom=new MovingSurface("sand3.gif", 10, MovingSurface.DOWN); bottom.addPoint(0,600); bottom.addPoint(300,400); bottom.addPoint(500, 400); bottom.addPoint(800, 600); } public void paint(Graphics g){ int width=getWidth(); int height=getHeight(); //blue sky gBuffer.setColor(Color.white); gBuffer.fillRect(0,0,width,height); //draw sides //cover sides with sky and road leftWall.draw(gBuffer, frame); rtWall.draw(gBuffer, frame); bottom.draw(gBuffer, frame); gBuffer.setColor(Color.black); int deltaX=3*frame; int y=height/2+frame*frame/5; gBuffer.fillRect(width/2-deltaX,y,deltaX,deltaX); //Now we send the result to the screen g.drawImage(virtualMem,0,0,this); } @Override public void actionPerformed(ActionEvent e) { Object source = e.getSource(); if (source == timer) { if (frame < lastFrame) { frame++; } else { frame=0; } } else { //restart button pressed frame=0; if (timer.isRunning()) { timer.stop(); startButton.setLabel("Start"); } else { timer.start(); startButton.setLabel("Stop"); } } repaint(); } public void update(Graphics g) { paint(g); //get rid of flicker with this method } }