Basic window and rendering thread.

Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
main
Nic0Nic0Nii 3 years ago
parent 7a3cd28039
commit 1175c900a3
  1. 93
      src/sig/Panel.java
  2. 160
      src/sig/SigKeeper.java

@ -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…
Cancel
Save