Basic window and rendering thread.
Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
This commit is contained in:
		
							parent
							
								
									7a3cd28039
								
							
						
					
					
						commit
						1175c900a3
					
				
							
								
								
									
										93
									
								
								src/sig/Panel.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								src/sig/Panel.java
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,93 @@ | ||||
| package sig; | ||||
| 
 | ||||
| import java.awt.Graphics; | ||||
| import javax.swing.JPanel; | ||||
| import java.awt.image.ColorModel; | ||||
| import java.awt.GraphicsEnvironment; | ||||
| import java.awt.GraphicsConfiguration; | ||||
| import java.awt.Image; | ||||
| import java.awt.image.MemoryImageSource; | ||||
| import java.awt.Toolkit; | ||||
| 
 | ||||
| public class Panel extends JPanel implements Runnable { | ||||
|     long startTime = System.nanoTime(); | ||||
|     long endTime = System.nanoTime(); | ||||
|     private ColorModel cm;     | ||||
|     private Thread thread; | ||||
|     public int width=SigKeeper.SCREEN_WIDTH; | ||||
|     public int height=SigKeeper.SCREEN_HEIGHT; | ||||
|     private Image imageBuffer;    | ||||
|     private MemoryImageSource mImageProducer;    | ||||
|     public int pixel[]; | ||||
| 
 | ||||
|     public Panel() { | ||||
|         super(true); | ||||
|         thread = new Thread(this, "Panel Thread"); | ||||
|     } | ||||
| 
 | ||||
|     protected static ColorModel getCompatibleColorModel(){         | ||||
|         GraphicsConfiguration gfx_config = GraphicsEnvironment. | ||||
|                 getLocalGraphicsEnvironment().getDefaultScreenDevice(). | ||||
|                 getDefaultConfiguration();         | ||||
|         return gfx_config.getColorModel(); | ||||
|     } | ||||
| 
 | ||||
|     public void init(){         | ||||
|         cm = getCompatibleColorModel(); | ||||
|         width = getWidth(); | ||||
|         height = getHeight(); | ||||
|         SigKeeper.SCREEN_WIDTH=getWidth(); | ||||
|         SigKeeper.SCREEN_HEIGHT=getHeight(); | ||||
|         int screenSize = width * height; | ||||
|         if(pixel == null || pixel.length < screenSize){ | ||||
|             pixel = new int[screenSize]; | ||||
|         }         | ||||
|         mImageProducer =  new MemoryImageSource(width, height, cm, pixel,0, width); | ||||
|         mImageProducer.setAnimated(true); | ||||
|         mImageProducer.setFullBufferUpdates(true);   | ||||
|         imageBuffer = Toolkit.getDefaultToolkit().createImage(mImageProducer);         | ||||
|         if(thread.isInterrupted() || !thread.isAlive()){ | ||||
|             thread.start(); | ||||
|         } | ||||
|     } | ||||
|     public /* abstract */ void render(){ | ||||
|         int[] p = pixel; // this avoid crash when resizing | ||||
|         if(p.length != width * height) return;       | ||||
|         //a=h/w | ||||
|     } | ||||
| 
 | ||||
|     public void repaint() { | ||||
|         super.repaint(); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void paintComponent(Graphics g) { | ||||
|         startTime = System.nanoTime(); | ||||
|         super.paintComponent(g); | ||||
|         // perform draws on pixels | ||||
|         render(); | ||||
|         // ask ImageProducer to update image | ||||
|         mImageProducer.newPixels();             | ||||
|         // draw it on panel           | ||||
|         g.drawImage(this.imageBuffer, 0, 0, this);   | ||||
|         endTime=System.nanoTime();       | ||||
|         SigKeeper.DRAWLOOPTIME=(endTime-startTime)/1000000f; | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Overrides ImageObserver.imageUpdate. | ||||
|      * Always return true, assuming that imageBuffer is ready to go when called | ||||
|      */ | ||||
|     @Override | ||||
|     public boolean imageUpdate(Image image, int a, int b, int c, int d, int e) { | ||||
|         return true; | ||||
|     } | ||||
|     @Override | ||||
|     public void run() { | ||||
|         while (true) { | ||||
|             // request a JPanel re-drawing | ||||
|             repaint();                                   | ||||
|             try {Thread.sleep(5);} catch (InterruptedException e) {} | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -1,7 +1,163 @@ | ||||
| package sig; | ||||
| 
 | ||||
| class SigKeeper{ | ||||
| import javax.swing.JFrame; | ||||
| import java.awt.Cursor; | ||||
| import java.awt.event.MouseWheelListener; | ||||
| import java.awt.event.WindowEvent; | ||||
| import java.awt.event.WindowFocusListener; | ||||
| import java.awt.event.MouseEvent; | ||||
| import java.awt.event.MouseListener;  | ||||
| import java.awt.event.MouseMotionListener; | ||||
| import java.awt.event.MouseWheelEvent; | ||||
| import java.awt.event.KeyEvent; | ||||
| import java.awt.event.KeyListener; | ||||
| import java.awt.BorderLayout; | ||||
| import java.awt.image.BufferedImage; | ||||
| import java.awt.GraphicsDevice; | ||||
| import java.awt.GraphicsEnvironment; | ||||
| import java.awt.Point; | ||||
| import java.awt.Toolkit; | ||||
| 
 | ||||
| public class SigKeeper implements WindowFocusListener,KeyListener,MouseListener,MouseMotionListener,MouseWheelListener{ | ||||
|     JFrame frame; | ||||
|     Panel panel; | ||||
|     public static int SCREEN_WIDTH=1280; | ||||
|     public static int SCREEN_HEIGHT=720; | ||||
|     public final static long TIMEPERTICK = 16666667l; | ||||
|     public static float DRAWTIME=0; | ||||
|     public static float DRAWLOOPTIME=0; | ||||
| 
 | ||||
|     public static Cursor invisibleCursor; | ||||
| 
 | ||||
|     SigKeeper() { | ||||
|         frame = new JFrame("SigKeeper"); | ||||
|         panel = new Panel(); | ||||
| 
 | ||||
|         frame.getContentPane().addMouseListener(this); | ||||
|         frame.getContentPane().addMouseMotionListener(this); | ||||
|         frame.addKeyListener(this); | ||||
|         frame.getContentPane().addMouseWheelListener(this); | ||||
|         frame.setSize(SCREEN_WIDTH,SCREEN_HEIGHT); | ||||
|         frame.add(panel,BorderLayout.CENTER); | ||||
|         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | ||||
| 
 | ||||
|         invisibleCursor = frame.getToolkit().createCustomCursor(new BufferedImage(1,1,BufferedImage.TYPE_INT_ARGB),new Point(),null); | ||||
| 
 | ||||
|         panel.setCursor(invisibleCursor); | ||||
|         frame.setVisible(true); | ||||
|         GraphicsDevice screen = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); | ||||
|         frame.setLocation((screen.getDisplayMode().getWidth()-SCREEN_WIDTH)/2,(screen.getDisplayMode().getHeight()-SCREEN_HEIGHT)/2); | ||||
|         panel.init(); | ||||
| 
 | ||||
|         new Thread() { | ||||
|             public void run(){ | ||||
|                 while (true) { | ||||
|                     long startTime = System.nanoTime(); | ||||
|                     runGameLoop(); | ||||
|                     panel.repaint(); | ||||
|                     Toolkit.getDefaultToolkit().sync(); | ||||
|                     long endTime = System.nanoTime(); | ||||
|                     long diff = endTime-startTime; | ||||
|                     try { | ||||
|                         long sleepTime = TIMEPERTICK - diff; | ||||
|                         long millis = (sleepTime)/1000000; | ||||
|                         int nanos = (int)(sleepTime-(((sleepTime)/1000000)*1000000)); | ||||
|                         //System.out.println("FRAME DRAWING: Sleeping for ("+millis+"ms,"+nanos+"ns) - "+(diff)+"ns"); | ||||
|                         DRAWTIME = (float)diff/1000000; | ||||
|                         frame.setTitle("Game Loop: "+DRAWTIME+"ms, Draw Loop: "+DRAWLOOPTIME+"ms"); | ||||
|                         if (sleepTime>0) { | ||||
|                             Thread.sleep(millis,nanos); | ||||
|                         } | ||||
|                     } catch (InterruptedException e) { | ||||
|                         e.printStackTrace(); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         }.start(); | ||||
|     } | ||||
|      | ||||
|     protected void runGameLoop() { | ||||
|     } | ||||
| 
 | ||||
|     public static void main(String[] args) { | ||||
|         System.out.println("Hello World!"); | ||||
|         SigKeeper keeper = new SigKeeper(); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void mouseWheelMoved(MouseWheelEvent e) { | ||||
|         // TODO Auto-generated method stub | ||||
|          | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void mouseDragged(MouseEvent e) { | ||||
|         // TODO Auto-generated method stub | ||||
|          | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void mouseMoved(MouseEvent e) { | ||||
|         // TODO Auto-generated method stub | ||||
|          | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void mouseClicked(MouseEvent e) { | ||||
|         // TODO Auto-generated method stub | ||||
|          | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void mousePressed(MouseEvent e) { | ||||
|         // TODO Auto-generated method stub | ||||
|          | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void mouseReleased(MouseEvent e) { | ||||
|         // TODO Auto-generated method stub | ||||
|          | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void mouseEntered(MouseEvent e) { | ||||
|         // TODO Auto-generated method stub | ||||
|          | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void mouseExited(MouseEvent e) { | ||||
|         // TODO Auto-generated method stub | ||||
|          | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void keyTyped(KeyEvent e) { | ||||
|         // TODO Auto-generated method stub | ||||
|          | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void keyPressed(KeyEvent e) { | ||||
|         // TODO Auto-generated method stub | ||||
|          | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void keyReleased(KeyEvent e) { | ||||
|         // TODO Auto-generated method stub | ||||
|          | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void windowGainedFocus(WindowEvent e) { | ||||
|         // TODO Auto-generated method stub | ||||
|          | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void windowLostFocus(WindowEvent e) { | ||||
|         // TODO Auto-generated method stub | ||||
|          | ||||
|     } | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user