package com.base.engine; import java.awt.Canvas; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.RenderingHints; import java.awt.image.BufferStrategy; import javax.swing.JFrame; public class Window extends Canvas implements Runnable{ public JFrame frame; public Input input; public Dimension frameSize; public Dimension canvasSize; public boolean isRunning; public double frameTime; public Thread thread; public String title; public boolean drag = false; public Point m1; public Window(int width, int height, int frameRate, String title){ frameSize = new Dimension(width+4,height+23); canvasSize = new Dimension(width,height); setMaximumSize(frameSize); setMinimumSize(frameSize); setPreferredSize(frameSize); setSize(frameSize); this.frameTime = 1.0 / frameRate; input = new Input(this); this.title = title; addKeyListener(input); addFocusListener(input); addMouseListener(input); addMouseMotionListener(input); createFrame(); start(); } public void start(){ if(isRunning) return; isRunning = true; thread = new Thread(this); thread.start(); } public JFrame createFrame(){ frame = new JFrame(); frame.setUndecorated(true); frame.add(this); frame.setPreferredSize(frameSize); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setResizable(false); frame.setLocationRelativeTo(null); frame.setTitle(title); frame.setVisible(true); return frame; } public void run() { isRunning = true; int frames = 0; long frameCounter = 0; double lastTime = Time.getTime(); double unprocessedTime = 0; while(isRunning) { boolean render = false; double startTime = Time.getTime(); double passedTime = startTime - lastTime; lastTime = startTime; unprocessedTime += passedTime; frameCounter += (long) passedTime; if((input.getMouseX()<=2 || input.getMouseX()>=frameSize.width-2) || (input.getMouseY()<=21 || input.getMouseY()>= frameSize.height-2) || drag){ if(input.getMouse(1)){ if(!drag){ m1 = new Point(input.getMouseAbsX(), input.getMouseAbsY()); drag = true; } Point f = frame.getLocation(); Point m2 = new Point(input.getMouseAbsX(), input.getMouseAbsY()); if(!m2.equals(m1)){ int xc = m1.x-m2.x; int yc = m1.y-m2.y; System.out.println("Changed "+ (m1.x-m2.x) + " "+ (m1.y-m2.y)); frame.setLocation(f.x-xc,f.y-yc); m1=m2; } }else{ drag = false; } }else{ drag = false; } while(unprocessedTime > frameTime) { render = true; unprocessedTime -= frameTime; //if(Window.isCloseRequested()) //stop(); input.update((int)frameTime); //game.update((float)frameTime); if(frameCounter >= 1.0) { //System.out.println(frames); frames = 0; frameCounter = 0; } } if(render) { render(); frames++; } else { try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } } //cleanUp(); } public void mouseClick(int b){ } public Graphics2D getGrahics(){ return null; } public void render(){ BufferStrategy bs = getBufferStrategy(); if(bs == null) { createBufferStrategy(2); return; } Graphics g1 = bs.getDrawGraphics(); Graphics2D g = (Graphics2D) g1; g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); g.setColor(Color.WHITE); g.fillRect(0, 0, (int) frameSize.getWidth(), (int) frameSize.getHeight()); g.setColor(Color.BLACK); g.drawString(input.mouseAbsToString(), 50, 50); g.drawString(input.mouseToString(), 50, 100); g.drawString("("+frame.getLocation().getX()+","+frame.getLocation().getY()+")", 50, 150); //BORDER-------------------- g.setColor(Color.BLACK); g.fillRect(0, 0, (int) frameSize.getWidth(), 21); g.fillRect(0, 0, 2, (int) frameSize.getHeight()); g.fillRect(0, (int) frameSize.getHeight()-2, (int) frameSize.getWidth(), 2); g.fillRect((int) frameSize.getWidth()-2, 0, 2, (int) frameSize.getHeight()); //TITLE--------------------- Font arial = Cache.getFont("/Arial/ARIAL.TTF").deriveFont(18.0f); g.setFont(arial); g.setColor(Color.WHITE); g.drawString(title, 10, 18); //BUTTONS------------------- g.setColor(Color.DARK_GRAY); g.fillRect((int) (frameSize.getWidth()-40), 0, 35, 15); g.fillRect((int) (frameSize.getWidth()-61), 0, 20, 15); g.dispose(); g1.dispose(); bs.show(); } }