import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.util.ArrayList; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.Timer; public class JumperScreen implements ActionListener { /** * A simple method to make the game runnable. You should not modify * this main method: it should say nothing except "new JoustScreen();" */ public static void main(String[] args) { new JumperScreen(); } private ArrayList walls; // DO NOT CHANGE the next four fields (the window and timer) private JFrame window; // the window itself private BufferedImage content; // the current game graphics private Graphics2D paintbrush; // for drawing things in the window private Timer gameTimer; // for keeping track of time passing // DO NOT CHANGE the previous four fields (the window and timer) private Jumper jumper; // TODO: add your own fields here public JumperScreen() { // DO NOT CHANGE the window, content, and paintbrush lines below this.window = new JFrame("Mario Clone"); this.content = new BufferedImage(800, 600, BufferedImage.TYPE_INT_ARGB); this.paintbrush = (Graphics2D)this.content.getGraphics(); this.window.setContentPane(new JLabel(new ImageIcon(this.content))); this.window.pack(); this.window.setVisible(true); this.window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); // DO NOT CHANGE the window, content, and paintbrush lines above this.jumper = new Jumper(); this.window.addKeyListener(this.jumper); this.walls = new ArrayList(); this.walls.add(new Rectangle(0,550,800,30)); this.walls.add(new Rectangle(300,450,60,100)); this.walls.add(new Rectangle(200, 400, 50, 30)); // DO NOT CHANGE the next two lines nor add lines after them this.gameTimer = new Timer(20, this); // tick at 1000/20 fps this.gameTimer.start(); // and start ticking now // DO NOT CHANGE the previous two lines nor add lines after them } /** * Java will call this every time the gameTimer ticks (50 times a second). * If you want to stop the game, invoke this.gameTimer.stop() in this method. */ public void actionPerformed(ActionEvent event) { // DO NOT CHANGE the next four lines, and add nothing above them if (! this.window.isValid()) { // the "close window" button this.gameTimer.stop(); // should stop the timer return; // and stop doing anything else } // DO NOT CHANGE the previous four lines // TODO: add every-frame logic in here (gravity, momentum, collisions, etc) this.jumper.tick(0.02); this.jumper.setNotOnGround(); for(Rectangle r : this.walls) { this.jumper.bumpInto(r); } // DO NOT CHANGE the next line; it must be last in this method this.refreshScreen(); // redraws the screen after things move // DO NOT CHANGE the above line; it must be last in this method } /** * Re-draws the screen. You should erase the old image and draw a * new one, but you should not change anything in this method * (use actionPerformed instead if you need something to change). */ private void refreshScreen() { this.paintbrush.setColor(new Color(150, 210, 255)); // pale blue this.paintbrush.fillRect(0, 0, this.content.getWidth(), this.content.getHeight()); // erases the previous frame // TODO: replace the following example code with code that does // the right thing (i.e., draw the birds, walls, and score) this.jumper.draw(this.paintbrush); this.paintbrush.setColor(Color.WHITE); for(Rectangle r : this.walls) { this.paintbrush.fill(r); } // DO NOT CHANGE the next line; it must be last in this method this.window.repaint(); // displays the frame to the screen // DO NOT CHANGE the above line; it must be last in this method } }