import java.awt.Canvas; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.image.BufferStrategy; import javax.swing.JFrame; import javax.swing.JPanel; public class Main implements Runnable { private final int WIDTH = 1000; private final int HEIGHT = 500; private long desiredFPS = 60; private String title = "Maple Story"; private long desiredDeltaLoop = (1000*1000*1000)/desiredFPS; private boolean running = true; private JFrame frame; private Canvas canvas; private BufferStrategy bufferStrategy; public Main() { // create new Frame frame = new JFrame(title); // create new JPanel with specified width and height JPanel panel = (JPanel) frame.getContentPane(); panel.setPreferredSize(new Dimension(WIDTH, HEIGHT)); panel.setLayout(null); // create a canvas inside the JPanel with specified width and height canvas = new Canvas(); canvas.setBounds(0, 0, WIDTH, HEIGHT); canvas.setIgnoreRepaint(true); panel.add(canvas); // Add Mouse and Key Listeners canvas.addMouseListener(new MouseControl()); canvas.addKeyListener(new KeyInputHandler()); // initialize the window frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setResizable(false); frame.setVisible(true); setup(); // set graphics device canvas.createBufferStrategy(2); bufferStrategy = canvas.getBufferStrategy(); // focus on the window canvas.requestFocus(); } /* * Main game loop */ public void run() { long beginLoopTime; long endLoopTime; long currentUpdateTime = System.nanoTime(); long lastUpdateTime; long deltaLoop; while(running) { beginLoopTime = System.nanoTime(); render(); lastUpdateTime = currentUpdateTime; currentUpdateTime = System.nanoTime(); update((int) ((currentUpdateTime - lastUpdateTime)/(1000*1000))); endLoopTime = System.nanoTime(); deltaLoop = endLoopTime - beginLoopTime; if(deltaLoop > desiredDeltaLoop) { //Do nothing. We are already late. } else { try { Thread.sleep((desiredDeltaLoop - deltaLoop)/(1000*1000)); } catch(InterruptedException e) { //Do nothing } } } } /* * Method to initialise graphics that are going to be painted to the screen */ private void render() { Graphics2D g = (Graphics2D) bufferStrategy.getDrawGraphics(); g.clearRect(0, 0, WIDTH, HEIGHT); render(g); g.dispose(); bufferStrategy.show(); } /* * Initialise all of your Objects in here */ public void setup() { } /* * Method that handles all the movements that are supposed to happen * So initialise all the x and y changes here * deltaTime tells you how many nanoseconds have passed by since this function * was last called */ protected void update(int deltaTime) { } /* * Method where you paint to the screen */ protected void render(Graphics2D g) { /* * START PAINTING * START PAINTING * START PAINTING * START PAINTING * START PAINTING * START PAINTING */ /* * STOP PAINTING * STOP PAINTING * STOP PAINTING * STOP PAINTING * STOP PAINTING * STOP PAINTING */ } /* * Keyboard Action listeners * Key esc closes the program by default */ private class KeyInputHandler extends KeyAdapter { public void keyPressed(KeyEvent e) { if(e.getKeyCode()==27) { System.exit(0); } } public void keyReleased(KeyEvent e) { } } /* * Mouse Action Listeners */ private class MouseControl extends MouseAdapter { } /* * public static void main * I do not even have to explain this */ public static void main(String [] args) { Main ex = new Main(); new Thread(ex).start(); } }