//Nathan Swem //April 27, 1998 //Final project, car racing game. import java.applet.*; import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class proj extends Applet implements ActionListener { private carCanvas c1, c2; private playerFrame p1, p2; private Button setp1, setp2, start, reset, directions; private Panel playerPanel; private TextField t; Image flag1, flag2, Ferrari, Lotus, Lambo, Ferrari4, NSX, Ferrari5, buffer1; private Graphics gContext1; private int pint1 = 1, car1x = 0, car2x = 0; private int pint2 = 2, tac1 = 44, tac2 = 44, turn = 1; private dir d; private AudioClip engine, song1, song2; double i = (double) (Math.PI); int x1t, y1t, x2t, y2t; int x1 = (int) ( 147 + ( 100*( Math.cos(Math.PI))) ); int y1 = (int) ( 350 + ( 100*( Math.sin(Math.PI))) ); int x2 = (int) ( 447 + ( 100*( Math.cos(Math.PI))) ); int y2 = (int) ( 350 + ( 100*( Math.sin(Math.PI))) ); private boolean s1 = false, s2 = false, turn1 = true; public void init() { engine = getAudioClip( getDocumentBase(), "car.au" ); song1 = getAudioClip( getDocumentBase(), "music1.au" ); song2 = getAudioClip( getDocumentBase(), "music2.au" ); Ferrari = getImage( getDocumentBase(), "355sd.gif" ); Lotus = getImage( getDocumentBase(), "Espritsd.jpg" ); Lambo = getImage( getDocumentBase(), "lambosd.jpg" ); Ferrari4 = getImage( getDocumentBase(), "F40sider.jpg" ); NSX = getImage( getDocumentBase(), "NSXsdb.jpg" ); Ferrari5 = getImage( getDocumentBase(), "512sd.gif" ); flag1 = getImage( getDocumentBase(), "Flag1.jpg" ); flag2 = getImage( getDocumentBase(), "Flag2.jpg" ); buffer1 = createImage( 120, 65 ); gContext1 = buffer1.getGraphics(); gContext1.setColor( Color.yellow ); p2 = new playerFrame( Ferrari, Lotus, Lambo, Ferrari4, NSX, Ferrari5, pint2 ); p2.setSize(660, 200); p2.setVisible( true ); p1 = new playerFrame( Ferrari, Lotus, Lambo, Ferrari4, NSX, Ferrari5, pint1 ); p1.setSize(660, 200); p1.setVisible( true ); c1 = new carCanvas( p1.i, flag1, flag2, 1, buffer1, gContext1, song2 ); c1.setBackground( Color.yellow ); c1.setSize( 620, 65 ); c1.setLocation(0, 95 ); add( c1 ); c2 = new carCanvas( p2.i, flag1, flag2, 2, buffer1, gContext1, song2 ); c2.setBackground( Color.yellow ); c2.setSize( 620, 65 ); c2.setLocation(0, 185 ); add( c2 ); d = new dir(); d.setSize(370, 200); d.setLocation( 200, 200 ); d.setVisible( false ); playerPanel = new Panel(); playerPanel.setLayout( new GridLayout( 1, 2 )); setp1 = new Button( "Player One Shift" ); setp1.addActionListener( this ); playerPanel.add( setp1 ); setLayout( null); setp2 = new Button( "Player Two Shift" ); setp2.addActionListener( this ); playerPanel.add( setp2 ); add( playerPanel ); playerPanel.setBounds(0, 360, 600, 20 ); t = new TextField( "Swem's Performance Car Challenge" ); t.setFont( new Font( "TimesRoman", Font.BOLD + Font.ITALIC, 22 )); add( t ); t.setBounds(50, 0, 400, 35 ); start = new Button( "Begin Game" ); start.addActionListener( this ); add( start ); start.setBounds( 160, 160, 100, 25 ); reset = new Button( "Reset" ); reset.addActionListener( this ); add( reset ); reset.setBounds( 340, 160, 40, 25 ); directions = new Button( "Directions" ); directions.addActionListener( this ); add( directions ); directions.setBounds( 260, 160, 80, 25 ); setSize( 600, 385 ); } public void paint( Graphics g ) { g.drawLine( 559, 50, 559, 270 ); g.drawString("Player 1", 0, 93); g.drawString("Player 2", 0, 183); g.drawString("Finish", 560, 93); g.drawArc(50, 250, 190, 180, 60, 180 ); g.drawArc(350, 250, 190, 180, 60, 180 ); g.fillArc(145, 350, 10, 10, 0, 180 ); g.fillArc(445, 350, 10, 10, 0, 180 ); g.setColor( Color.red ); g.drawArc(50, 250, 190, 180, 0, 60); g.drawArc(350, 250, 190, 180, 0, 60); if( s1 && i >= Math.PI && i <= 2 * Math.PI ) { g.setColor( Color.white ); x1t = (int) ( 150 + ( 100*( Math.cos(i-.05))) ); y1t = (int) ( 350 + ( 100*( Math.sin(i-.05))) ); g.drawLine( 150, 350, x1t, y1t ); g.setColor( Color.red); x1 = (int) ( 150 + ( 100*( Math.cos(i))) ); y1 = (int) ( 350 + ( 100*( Math.sin(i))) ); g.drawLine( 150, 350, x1, y1 ); try{ Thread.sleep( (tac1) ); } catch( InterruptedException r ) {} i = i + .05; repaint(); } g.setColor( Color.white ); g.drawLine( 450, 350, x2, y2 ); if(x1 > 195) car1x = 0; else { car1x = x1 - 50; } if( s2 && i >= Math.PI && i <= 2 * Math.PI ) { g.setColor( Color.white ); x2t = (int) ( 450 + ( 100*( Math.cos(i-.05))) ); y2t = (int) ( 350 + ( 100*( Math.sin(i-.05))) ); g.drawLine( 450, 350, x2t, y2t ); g.setColor( Color.red ); x2 = (int) ( 450 + ( 100*( Math.cos(i))) ); y2 = (int) ( 350 + ( 100*( Math.sin(i))) ); g.drawLine( 450, 350, x2, y2 ); try{ Thread.sleep( (tac1) ); } catch( InterruptedException q ) {} i = i + .05; repaint(); } g.setColor( Color.white ); g.drawLine( 150, 350, x1, y1 ); if(x2 > 495) car2x = 0; else { car2x = x2 - 350; } } public void actionPerformed( ActionEvent e ) { if( e.getSource() == setp1 ) { if ( turn1 ) { s1 = !s1; i = Math.PI; repaint(); tac1 = tac1 - 2; engine.play(); song1.stop(); if( s1 == false ) { c1.car = p1.i; c1.tempx1 = (int ) (car1x / 1.5 ); c1.t1++; c2.t1++; c2.tempx2 = (int ) (car1x / 1.5 ); c1.repaint(); c2.repaint(); turn1 = false; engine.stop(); } } } if( e.getSource() == setp2 ) { if( turn1 == false ) { s2 = !s2; i = Math.PI; repaint(); tac2 = tac2 - 2; song1.stop(); engine.play(); if( s2 == false ) { c2.car = p2.i; c1.tempx2 = (int ) (car2x / 1.5 ); c1.t2++; c2.t2++; c2.tempx1 = (int ) (car2x / 1.5 ); c1.repaint(); c2.repaint(); turn1 = true; engine.stop(); } } } if( e.getSource() == reset ) { turn = 0; c1.x1 = c1.x2 = c1.tempx1 = c1.tempx2 = c1.t1 = c1.t2 = c1.i = 0; c2.x1 = c2.x2 = c2.tempx1 = c2.tempx2 = c2.t1 = c2.t2 = c2.i = 0; tac1 = tac2 = 44; turn1 = true; s1 = s2 = false; c1.reset = 2; c2.reset = 2; c1.repaint(); c2.repaint(); p2.setVisible( true ); p1.setVisible( true ); } if( e.getSource() == directions) { d.setVisible( true ); } if( e.getSource() == start ) { c1.reset = 0; c2.reset = 0; c1.car = p1.i; c2.car = p2.i; c1.repaint(); c2.repaint(); song1.play(); } } public void update( Graphics g) { paint( g ); } } class carCanvas extends Canvas { Image car, flag1, flag2; int x1 = 0, x2 = 0, tempx1 = 0, tempx2 = 0, i = 0; int player, t1 = 0, t2 = 0, reset = 0; private Graphics gContext; private Image buffer; private AudioClip bad; public carCanvas( Image c, Image f1, Image f2, int p, Image a, Graphics q, AudioClip s ) { car = c; player = p; flag1 = f1; flag2 = f2; buffer = a; gContext = q; bad = s; } public void start() { gContext.drawImage( car, 0, 0, this ); } public void paint( Graphics g ) { if( reset == 2 ) { g.setColor( Color.yellow ); g.fillRect( 0, 0, 600, 65 ); } else if( i < (x1 + tempx1) && x1 < 559 ) { g.drawImage( buffer, i, 0, 120, 65, this ); gContext.fillRect( 0, 0, 1, 65 ); g.drawImage( buffer, i-1 , 0, 120, 65, this ); gContext.drawImage( car, 0, 0, this ); try{ Thread.sleep( 5 ); } catch( InterruptedException j ) {} i = i + 1; repaint(); } else if( i > 559 && t2 == t1 && i > x2 ) { g.setColor( Color.yellow ); gContext.fillRect( 0, 0, 120, 65 ); g.drawImage( buffer, 0 , 0, 600, 65, this ); g.drawImage( flag1, 0, 0, 65, 65, this ); g.drawImage( flag2, 65, 0, 65, 65, this ); g.drawImage( flag1, 130, 0, 65, 65, this ); g.drawImage( flag2, 195, 0, 65, 65, this ); g.drawImage( flag1, 260, 0, 65, 65, this ); g.drawImage( flag2, 325, 0, 65, 65, this ); g.drawImage( flag1, 390, 0, 65, 65, this ); g.drawImage( flag2, 455, 0, 65, 65, this ); g.drawImage( flag1, 520, 0, 65, 65, this ); bad.play(); } else { integers(); g.drawImage( car, x1, 0, 120, 65, this ); } } public void update( Graphics g ) { paint ( g ); } public void integers() { x1 = i; tempx1 = 0; x2 = tempx2 + x2; tempx2 = 0; } } class playerFrame extends Frame implements MouseListener, MouseMotionListener { private Image Ferrari, Lotus, Lambo, F40, NSX, F50; private TextField t, l; private int pint; Image i; public playerFrame( Image f3, Image lo, Image la, Image f4, Image nsx, Image f5, int a ) { Ferrari = f3; Lambo = la; Lotus = lo; F40 = f4; NSX = nsx; F50 = f5; pint = a; l = new TextField("Player " + Integer.toString( pint ) + " Please Choose Your Car:"); l.setFont( new Font( "Serif", Font.BOLD, 16 )); add( l, BorderLayout.NORTH ); t = new TextField( 60 ); t.setEditable( false ); add( t, BorderLayout.SOUTH ); addWindowListener( new CloseWindow() ); addMouseMotionListener( this ); addMouseListener( this ); } public void paint( Graphics g ) { g.drawImage( Ferrari, 1, 50, 110, 70, this ); g.drawImage( Lotus, 110, 50, 110, 90, this ); g.drawImage( Lambo, 220, 50, 110, 75, this ); g.drawImage( F40, 330, 50, 110, 65, this ); g.drawImage( NSX, 440, 50, 110, 50, this ); g.drawImage( F50, 550, 50, 110, 80, this ); } public void mouseClicked( MouseEvent e ) { if( e.getX() < 110 && e.getX() > 1 && e.getY() > 50 && e.getY() < 120 ) { t.setText( "You Picked the Ferrari 355!!" ); i = Ferrari; try{ Thread.sleep( 2000 ); } catch( InterruptedException i ) {} setVisible( false ); } if( e.getX() < 220 && e.getX() > 110 && e.getY() > 50 && e.getY() < 120 ) { t.setText( "You Picked the Lotus Esprit!!" ); i = Lotus; try{ Thread.sleep( 2000 ); } catch( InterruptedException i ) {} setVisible( false ); } if( e.getX() < 330 && e.getX() > 220 && e.getY() > 50 && e.getY() < 120 ) { t.setText( "You Picked the Lamborghini Diablo!!" ); i = Lambo; try{ Thread.sleep( 2000 ); } catch( InterruptedException i ) {} setVisible( false ); } if( e.getX() < 440 && e.getX() > 330 && e.getY() > 50 && e.getY() < 120 ) { t.setText( "You Picked the Ferrari F40!!" ); i = F40; try{ Thread.sleep( 2000 ); } catch( InterruptedException i ) {} setVisible( false ); } if( e.getX() < 550 && e.getX() > 440 && e.getY() > 50 && e.getY() < 120 ) { t.setText( "You Picked the Acura NSX!!" ); i = NSX; try{ Thread.sleep( 2000 ); } catch( InterruptedException i ) {} setVisible( false ); } if( e.getX() < 660 && e.getX() > 550 && e.getY() > 50 && e.getY() < 120 ) { t.setText( "You Picked the Ferrari 512 Testarossa!!" ); i = F50; try{ Thread.sleep( 2000 ); } catch( InterruptedException i ) {} setVisible( false ); } } public void mouseMoved( MouseEvent e ) { if( e.getX() < 110 && e.getX() > 1 && e.getY() > 50 && e.getY() < 120 ) { t.setText( "Ferrari 355" ); } if( e.getX() < 220 && e.getX() > 110 && e.getY() > 50 && e.getY() < 120 ) { t.setText( "Lotus Esprit" ); } if( e.getX() < 330 && e.getX() > 220 && e.getY() > 50 && e.getY() < 120 ) { t.setText( "Lamborghini Diablo" ); } if( e.getX() < 440 && e.getX() > 330 && e.getY() > 50 && e.getY() < 120 ) { t.setText( "Ferrari F40" ); } if( e.getX() < 550 && e.getX() > 440 && e.getY() > 50 && e.getY() < 120 ) { t.setText( "Acura NSX" ); } if( e.getX() < 660 && e.getX() > 550 && e.getY() > 50 && e.getY() < 120 ) { t.setText( "Ferrari 512 Testarossa" ); } } public void mouseDragged( MouseEvent e) {} public void mouseEntered( MouseEvent e) {} public void mouseExited( MouseEvent e) {} public void mousePressed( MouseEvent e) {} public void mouseReleased( MouseEvent e) {} } class CloseWindow extends WindowAdapter { public void windowClosing( WindowEvent e ) { e.getWindow().setVisible( false ); } } class dir extends Frame { private TextArea t; public dir() { String s = "Use the Player Shift buttons at the bottom" + "of the screen to start and stop the tachometers." + "Try and stop the tachometer as close as possible" + "the redline area. Your car will advance in" + "porportion to how close the tachometer needle is" + "to the redline area. However, redlining the" + "tachometer will not advance your car." + "Press begin before every game. Good Luck!"; setLayout( new BorderLayout() ); t = new TextArea( s, 6, 68, t.SCROLLBARS_NONE ); t.setEditable( false ); add( t, BorderLayout.CENTER ); addWindowListener( new CloseWindow() ); } }