import java.awt.*; import java.awt.event.*; import java.awt.Graphics; import javax.swing.*; import java.rmi.*; public class hrclient extends JFrame { public int FRAMEDELAY = 50; // this is just the default private Graphics brush; public Graphics display; private Image canvas; // off-screen graphics buffer private Image background; // racing background gif private Image staticbkgrd; // static (stretched) background; private Image racergif; // horse and rider animated gif public int HN = 3; // number of horses public int TW = 800; // track length; public int TH; // track height - depends on number of racers public int LW = 60; // lane width private byte id; // my id in the race private horse[] H; // information for all horses private horserace server; // remote server object public void paint(Graphics g) {} // overrides auto-update // args[0] is name of horse, args[1] is server ip args[2] is delaytime public static void main(String[] args) // needed for application { hrclient session = new hrclient(); if (args.length>2) session.FRAMEDELAY = Integer.parseInt(args[2]); session.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} }); session.init(args); } // main public void init(String[] args) { try { // register with server: /* System.setProperty("java.security.policy", "client.policy"); System.setSecurityManager( new RMISecurityManager()); */ horserace server; // remote server String serverloc = "10.1.0.3"; if (args.length>1) serverloc=args[1]; server = (horserace)Naming.lookup("//"+serverloc+"/hrserver"); System.out.println("waiting for other racers ..."); raceinfo idh = null; try { idh = server.joinrace(args[0]); } catch (RemoteException re) {System.out.println(re); System.exit(1);} id = idh.id; // id returned by server; H = idh.horses; HN = H.length; // when returned, this will # of horses in race TH = (this.HN * this.LW) + this.LW+10; setBounds(0,0,TW,TH); setVisible(true); // show(); background = Toolkit.getDefaultToolkit().getImage("hrbackground.gif"); prepareImage(background,this); racergif = Toolkit.getDefaultToolkit().getImage("racer.gif"); prepareImage(racergif,this); canvas = createImage(TW,TH); staticbkgrd = createImage(TW,TH); brush = canvas.getGraphics(); // to double buffer brush.setColor(Color.blue); display = this.getGraphics(); // to screen try { Thread.sleep(750); } catch (InterruptedException IE) {} staticbkgrd.getGraphics().drawImage(background,0,0,TW,TH-30,null); resetbackground(); displayStatus("waiting for other racers ..."); display.drawImage(canvas,0,0,null); // draws to screen race(server); } catch (Exception e) {System.out.println(e);} } // init public int randint(int min, int max) { return (int) (Math.random() * (max-min+1) + min); } private void resetbackground() { brush.drawImage(staticbkgrd,0,30,null); // draw track lines brush.setColor(Color.blue); for(int i=1;i<=HN+1;i++) { brush.drawLine(0,(i*LW)-5,TW-1,(i*LW)-5); } // finish line: brush.setColor(Color.red); brush.drawLine(TW-15,0,TW-15,TH-1); // finish line } // resetbackground public void nextframe(int delay) // delay in ms { try { Thread.sleep(delay); } catch (InterruptedException IE) {} display.drawImage(canvas,0,0,null); // draws to screen resetbackground(); } // nextframe with ms delay public void displayStatus(String message) { Font oldfont = brush.getFont(); brush.setFont(new Font("Serif",Font.BOLD,24)); brush.drawString(message,TW/3,LW-10); brush.setFont(oldfont); } public void draw(horse racer) { if (racer==null) return; brush.setColor(Color.black); brush.drawString(racer.name,10,(racer.y+55)); brush.drawImage(racergif,racer.x,racer.y,null); } public void race(horserace server) { int i; // loop counter boolean stoprace = false; int winner; for(i=0;i lead) { lead = H[i].x; winner = i; } else if (H[i].x == lead) winner = -1; } // for loop return winner; } // determineLeader } // class hrclient