import java.awt.Canvas; import java.awt.Graphics2D; import java.awt.Dimension; import java.awt.BorderLayout; import java.awt.event.KeyListener; import java.awt.event.KeyEvent; import java.awt.event.MouseListener; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import java.awt.event.MouseWheelListener; import java.awt.event.MouseWheelEvent; import java.awt.image.BufferStrategy; import javax.swing.JFrame; import javax.swing.JPanel; // TODO: implement pause (rendering) function public class Scene extends JPanel implements Runnable, KeyListener, MouseListener, MouseMotionListener, MouseWheelListener { // TODO: lowercase not constant values protected int WIDTH; protected int HEIGHT; protected BufferStrategy buffer; // TODO: make final protected long desiredFPS = 60; // TODO: make final protected long desiredDeltaLoop = (1000*1000*1000)/desiredFPS; protected JFrame frame; protected boolean running; protected Canvas canvas; // TODO: make accessible from user settings protected int guiSize = 2; // TODO: remove sub argument protected Scene(JFrame frame, Sub sub) { this.frame = frame; //getting window size this.WIDTH = (int) this.frame.getSize().getWidth(); this.HEIGHT = (int) this.frame.getSize().getHeight(); this.canvas = new Canvas(); this.canvas.setBounds(0, 0, this.WIDTH, this.HEIGHT); this.canvas.setIgnoreRepaint(true); this.canvas.addKeyListener(this); this.canvas.addMouseListener(this); this.canvas.addMouseMotionListener(this); this.canvas.addMouseWheelListener(this); } // TODO: fix this weird memory shit public void start() { this.canvas.createBufferStrategy(2); this.buffer = this.canvas.getBufferStrategy(); this.canvas.requestFocus(); this.running = true; new Thread(this).start(); } public void run() { long beginLoopTime; long endLoopTime; long currentUpdateTime = System.nanoTime(); long lastUpdateTime; long deltaLoop; while (running) { beginLoopTime = System.nanoTime(); // TODO: use WindowEventListener to wait for changes //getting window size this.WIDTH = (int) this.frame.getSize().getWidth(); this.HEIGHT = (int) this.frame.getSize().getHeight(); this.render(); lastUpdateTime = currentUpdateTime; currentUpdateTime = System.nanoTime(); this.update((int) ((currentUpdateTime - lastUpdateTime)/(1000*1000))); endLoopTime = System.nanoTime(); deltaLoop = endLoopTime - beginLoopTime; if (deltaLoop > this.desiredDeltaLoop) { // late => skip frame } else { try { Thread.sleep((this.desiredDeltaLoop - deltaLoop)/(1000*1000)); } catch (InterruptedException e ) { } } } } // TODO: make abstract protected void render() {} protected void update(int deltaTime) {} @Override public void keyTyped(KeyEvent e) {} public void keyPressed(KeyEvent e) {} public void keyReleased(KeyEvent e) {} public void mouseClicked(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mouseDragged(MouseEvent e) {} public void mouseMoved(MouseEvent e) {} public void mouseWheelMoved(MouseWheelEvent e) {} }