generated from sigonasr2/JavaProjectTemplate
	Render loop now paints properly
Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
This commit is contained in:
		
							parent
							
								
									010ac996e6
								
							
						
					
					
						commit
						ca082c3f2c
					
				| @ -1,10 +1,7 @@ | |||||||
| package sig; | package sig; | ||||||
| 
 | 
 | ||||||
| import javax.swing.JFrame; |  | ||||||
| 
 |  | ||||||
| import sig.engine.Color; | import sig.engine.Color; | ||||||
| import sig.engine.Panel; | import sig.engine.Panel; | ||||||
| import java.awt.RenderingHints; |  | ||||||
| 
 | 
 | ||||||
| public class JavaProjectTemplate { | public class JavaProjectTemplate { | ||||||
| 	public static final String PROGRAM_NAME="Sig's Java Project Template"; | 	public static final String PROGRAM_NAME="Sig's Java Project Template"; | ||||||
| @ -12,10 +9,14 @@ public class JavaProjectTemplate { | |||||||
| 	public static int WINDOW_HEIGHT=720; | 	public static int WINDOW_HEIGHT=720; | ||||||
| 	public static Panel game; | 	public static Panel game; | ||||||
| 
 | 
 | ||||||
|  | 	public static void updateGame() { | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	public static void drawGame() { | 	public static void drawGame() { | ||||||
| 		game.Clear(Color.BRIGHT_BLUE); | 		game.Clear(Color.BRIGHT_BLUE); | ||||||
| 
 | 		game.Draw(100,20,Color.BLACK); | ||||||
| 		game.Draw_Line(null, WINDOW_HEIGHT, WINDOW_HEIGHT, WINDOW_WIDTH, WINDOW_HEIGHT, 0); | 		game.Draw_Line(10,10,35,35,Color.BLACK); | ||||||
|  | 		game.FillCircle(Color.MAGENTA,200,200,50); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public static void main(String[] args) { | 	public static void main(String[] args) { | ||||||
|  | |||||||
| @ -35,4 +35,11 @@ public class Color { | |||||||
| 	public int getColor() { | 	public int getColor() { | ||||||
| 		return (a<<24)+(r<<16)+(g<<8)+b; | 		return (a<<24)+(r<<16)+(g<<8)+b; | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public java.lang.String toString() { | ||||||
|  | 		return "Color [r=" + r + ", g=" + g + ", b=" + b + ", a=" + a + "]"; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	 | ||||||
| } | } | ||||||
|  | |||||||
| @ -51,6 +51,9 @@ public class Panel extends JPanel implements Runnable,KeyListener { | |||||||
| 	public HashMap<Integer,Boolean> MOUSE = new HashMap<>(); | 	public HashMap<Integer,Boolean> MOUSE = new HashMap<>(); | ||||||
| 	private Point mousePosition = new Point(0,0); | 	private Point mousePosition = new Point(0,0); | ||||||
| 	private MouseScrollValue scrollWheel=null; | 	private MouseScrollValue scrollWheel=null; | ||||||
|  | 	public static final int UPDATE_LOOP_FRAMERATE = 244; | ||||||
|  | 	public static final long UPDATE_LOOP_NANOTIME = (long)((1d/UPDATE_LOOP_FRAMERATE)*1000000000l); | ||||||
|  | 	public static final double UPDATE_MULT = 1d / UPDATE_LOOP_FRAMERATE; | ||||||
| 
 | 
 | ||||||
| 	public static RenderingHints RENDERHINTS = new RenderingHints(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF); | 	public static RenderingHints RENDERHINTS = new RenderingHints(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF); | ||||||
| 
 | 
 | ||||||
| @ -85,9 +88,37 @@ public class Panel extends JPanel implements Runnable,KeyListener { | |||||||
| 				(int) ((Toolkit.getDefaultToolkit().getScreenSize().getHeight() - f.getHeight()) / 2)); | 				(int) ((Toolkit.getDefaultToolkit().getScreenSize().getHeight() - f.getHeight()) / 2)); | ||||||
| 		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | 		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | ||||||
| 		f.setVisible(true); | 		f.setVisible(true); | ||||||
| 		f.createBufferStrategy(2); |  | ||||||
| 		 | 		 | ||||||
| 		p.render(); | 		p.render(); | ||||||
|  | 
 | ||||||
|  | 		long lastGameTime = System.nanoTime(); | ||||||
|  | 		long dt = 0; | ||||||
|  | 		while (true) { | ||||||
|  | 			dt += System.nanoTime() - lastGameTime; | ||||||
|  | 			lastGameTime = System.nanoTime(); | ||||||
|  | 			while (dt >= UPDATE_LOOP_NANOTIME) { | ||||||
|  | 				JavaProjectTemplate.updateGame(); | ||||||
|  | 				dt -= UPDATE_LOOP_NANOTIME; | ||||||
|  | 				TIME += UPDATE_LOOP_NANOTIME; | ||||||
|  | 			} | ||||||
|  | 			gameUpdateLoopStabilizer(dt); //This is hackish. Removing this slows down the game by about 30%. The timer runs slower. ???  | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private static void gameUpdateLoopStabilizer(long dt) { | ||||||
|  | 		if (dt < UPDATE_LOOP_NANOTIME) { | ||||||
|  | 			lastReportedTime = System.currentTimeMillis(); | ||||||
|  | 		} else { | ||||||
|  | 			if (System.currentTimeMillis() - lastReportedTime > 5000) { | ||||||
|  | 				System.out.println("WARNING! Game is lagging behind! Frames Behind: " + (dt / UPDATE_LOOP_NANOTIME)); | ||||||
|  | 				lastReportedTime = System.currentTimeMillis(); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		try { | ||||||
|  | 			Thread.sleep(4); | ||||||
|  | 		} catch (InterruptedException e) { | ||||||
|  | 			e.printStackTrace(); | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|     public Panel(JFrame f) { |     public Panel(JFrame f) { | ||||||
| @ -200,11 +231,10 @@ public class Panel extends JPanel implements Runnable,KeyListener { | |||||||
| 
 | 
 | ||||||
| 	 | 	 | ||||||
|     public /* abstract */ void render(){ |     public /* abstract */ void render(){ | ||||||
|         //a=h/w |  | ||||||
| 		JavaProjectTemplate.drawGame(); | 		JavaProjectTemplate.drawGame(); | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     public void FillCircle(byte[] p,byte col,double center_x,double center_y,double r) { |     public void FillCircle(Color col,double center_x,double center_y,double r) { | ||||||
|     	int counter=0; |     	int counter=0; | ||||||
|     	Point[] points = new Point[CIRCLE_PRECISION]; |     	Point[] points = new Point[CIRCLE_PRECISION]; | ||||||
|     	for (double theta=0;theta<Math.PI*2;theta+=((Math.PI*2)/CIRCLE_PRECISION)) { |     	for (double theta=0;theta<Math.PI*2;theta+=((Math.PI*2)/CIRCLE_PRECISION)) { | ||||||
| @ -212,11 +242,11 @@ public class Panel extends JPanel implements Runnable,KeyListener { | |||||||
|     		//System.out.println("X:"+(Math.sin(theta)*r+center_x)+" Y:"+(Math.cos(theta)*r+center_y)); |     		//System.out.println("X:"+(Math.sin(theta)*r+center_x)+" Y:"+(Math.cos(theta)*r+center_y)); | ||||||
|     		points[counter++]=new Point((int)(Math.round(Math.sin(theta)*r+center_x)),(int)(Math.round(Math.cos(theta)*r+center_y))); |     		points[counter++]=new Point((int)(Math.round(Math.sin(theta)*r+center_x)),(int)(Math.round(Math.cos(theta)*r+center_y))); | ||||||
|     	} |     	} | ||||||
|         FillPolygon(p,col,0,0,points); |         FillPolygon(col,0,0,points); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|      |      | ||||||
|     public void FillOval(byte[] p,byte col,double center_x,double center_y,double w,double h) { |     public void FillOval(Color col,double center_x,double center_y,double w,double h) { | ||||||
|     	int counter=0; |     	int counter=0; | ||||||
|     	Point[] points = new Point[CIRCLE_PRECISION]; |     	Point[] points = new Point[CIRCLE_PRECISION]; | ||||||
|     	double r = Math.max(w,h); |     	double r = Math.max(w,h); | ||||||
| @ -234,10 +264,10 @@ public class Panel extends JPanel implements Runnable,KeyListener { | |||||||
|     		newP.y+=center_y; |     		newP.y+=center_y; | ||||||
|     		points[counter++]=newP; |     		points[counter++]=newP; | ||||||
|     	} |     	} | ||||||
|         FillPolygon(p,col,0,0,points); |         FillPolygon(col,0,0,points); | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     public void FillPolygon(byte[] p,byte col,double x_offset,double y_offset,Point...points) { |     public void FillPolygon(Color col,double x_offset,double y_offset,Point...points) { | ||||||
|     	Edge[] edges = new Edge[points.length]; |     	Edge[] edges = new Edge[points.length]; | ||||||
|     	List<Edge> edges_sorted = new ArrayList<Edge>(); |     	List<Edge> edges_sorted = new ArrayList<Edge>(); | ||||||
|     	for (int i=0;i<points.length;i++) { |     	for (int i=0;i<points.length;i++) { | ||||||
| @ -272,8 +302,8 @@ public class Panel extends JPanel implements Runnable,KeyListener { | |||||||
| 				//System.out.println("Drawing from "+((int)Math.round(e1.x_of_min_y))+" to "+e2.x_of_min_y+" on line "+scanLine); | 				//System.out.println("Drawing from "+((int)Math.round(e1.x_of_min_y))+" to "+e2.x_of_min_y+" on line "+scanLine); | ||||||
|     			for (int x=(int)Math.round(e1.x_of_min_y);x<=e2.x_of_min_y;x++) { |     			for (int x=(int)Math.round(e1.x_of_min_y);x<=e2.x_of_min_y;x++) { | ||||||
|     				int index = (scanLine+(int)y_offset)*getWidth()+x+(int)x_offset; |     				int index = (scanLine+(int)y_offset)*getWidth()+x+(int)x_offset; | ||||||
|     				if (index<p.length&&index>=0) { |     				if (index<pixel.length&&index>=0) { | ||||||
| 						Draw(p,index,col); | 						Draw(index,col.getColor()); | ||||||
| 					} | 					} | ||||||
|     			} |     			} | ||||||
|     		} |     		} | ||||||
| @ -335,36 +365,34 @@ public class Panel extends JPanel implements Runnable,KeyListener { | |||||||
|     	} |     	} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public void Draw(int index, byte col) { | 	public void Draw(int x, int y, Color col) { | ||||||
|  | 		Draw(y*JavaProjectTemplate.WINDOW_WIDTH+x,col.getColor()); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	void Draw(int index, int col) { | ||||||
| 		pixel[index]=col; | 		pixel[index]=col; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	public void run() { | 	public void run() { | ||||||
| 		if (mImageProducer==null) return; |  | ||||||
| 		while (true) { | 		while (true) { | ||||||
|             // request a JPanel re-drawing |             // request a JPanel re-drawing | ||||||
|             //repaint();       |  | ||||||
| 			render(); | 			render(); | ||||||
| 			mImageProducer.newPixels(); | 			mImageProducer.newPixels(); | ||||||
| 			if (f!=null&&f.getBufferStrategy()!=null) { | 			if (f!=null) { | ||||||
| 				do { | 				Graphics2D g2 = (Graphics2D)f.getGraphics(); | ||||||
| 					do { | 				if (g2!=null) { | ||||||
| 						if (f.getBufferStrategy()!=null) { | 					g2.setRenderingHints(RENDERHINTS); | ||||||
| 							Graphics2D g2 = (Graphics2D)f.getBufferStrategy().getDrawGraphics(); | 					try { | ||||||
| 							g2.setRenderingHints(RENDERHINTS); | 						repaint();       | ||||||
| 							if (g2!=null) { | 					} finally { | ||||||
| 								try { | 						g2.dispose(); | ||||||
| 									paintComponent(g2); | 					} | ||||||
| 								} finally { | 				} else { | ||||||
| 									g2.dispose(); | 					System.out.println("Invalid frame!"); | ||||||
| 								} | 				} | ||||||
| 							} | 			} else { | ||||||
| 						} | 				System.out.println("Invalid frame!"); | ||||||
| 					} while (f.getBufferStrategy().contentsRestored()); |  | ||||||
| 					f.getBufferStrategy().show(); |  | ||||||
| 					Toolkit.getDefaultToolkit().sync(); |  | ||||||
| 				} while (f.getBufferStrategy().contentsLost()); |  | ||||||
| 			} | 			} | ||||||
| 			updateFPSCounter(); | 			updateFPSCounter(); | ||||||
|             //System.out.println("Repaint "+frameCount++); |             //System.out.println("Repaint "+frameCount++); | ||||||
| @ -438,7 +466,7 @@ public class Panel extends JPanel implements Runnable,KeyListener { | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public void Draw_Line(byte[] canvas,int x1,int y1,int x2,int y2,byte col) { | 	public void Draw_Line(int x1,int y1,int x2,int y2,Color col) { | ||||||
|         int x,y,dx,dy,dx1,dy1,px,py,xe,ye; |         int x,y,dx,dy,dx1,dy1,px,py,xe,ye; | ||||||
|         dx=x2-x1;dy=y2-y1; |         dx=x2-x1;dy=y2-y1; | ||||||
|         dx1=Math.abs(dx);dy1=Math.abs(dy); |         dx1=Math.abs(dx);dy1=Math.abs(dy); | ||||||
| @ -449,7 +477,6 @@ public class Panel extends JPanel implements Runnable,KeyListener { | |||||||
|             } else { |             } else { | ||||||
|                 x=x2-1;y=y2-1;xe=x1; |                 x=x2-1;y=y2-1;xe=x1; | ||||||
|             } |             } | ||||||
|             Draw(canvas,y*JavaProjectTemplate.WINDOW_WIDTH+x,col); |  | ||||||
|             while (x<xe) { |             while (x<xe) { | ||||||
|                 x=x+1; |                 x=x+1; | ||||||
|                 if (px<0) { |                 if (px<0) { | ||||||
| @ -462,7 +489,7 @@ public class Panel extends JPanel implements Runnable,KeyListener { | |||||||
|                     } |                     } | ||||||
|                     px=px+2*(dy1-dx1); |                     px=px+2*(dy1-dx1); | ||||||
|                 } |                 } | ||||||
| 				Draw(canvas,y*JavaProjectTemplate.WINDOW_WIDTH+x,col); | 				Draw(y*JavaProjectTemplate.WINDOW_WIDTH+x,col.getColor()); | ||||||
|             } |             } | ||||||
|         } else { |         } else { | ||||||
|             if (dy>=0) { |             if (dy>=0) { | ||||||
| @ -470,7 +497,7 @@ public class Panel extends JPanel implements Runnable,KeyListener { | |||||||
|             } else { |             } else { | ||||||
|                 x=x2-1;y=y2-1;ye=y1; |                 x=x2-1;y=y2-1;ye=y1; | ||||||
|             } |             } | ||||||
|             Draw(canvas,y*JavaProjectTemplate.WINDOW_WIDTH+x,col); |             Draw(y*JavaProjectTemplate.WINDOW_WIDTH+x,col.getColor()); | ||||||
|             while (y<ye) { |             while (y<ye) { | ||||||
|                 y=y+1; |                 y=y+1; | ||||||
|                 if (py<=0) { |                 if (py<=0) { | ||||||
| @ -483,17 +510,17 @@ public class Panel extends JPanel implements Runnable,KeyListener { | |||||||
|                     } |                     } | ||||||
|                     py=py+2*(dx1-dy1); |                     py=py+2*(dx1-dy1); | ||||||
|                 } |                 } | ||||||
| 				Draw(canvas,y*JavaProjectTemplate.WINDOW_WIDTH+x,col); | 				Draw(y*JavaProjectTemplate.WINDOW_WIDTH+x,col.getColor()); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     public void Fill_Rect(byte[] p,byte col,double x,double y,double w,double h) { |     public void Fill_Rect(Color col,double x,double y,double w,double h) { | ||||||
|     	for (int xx=0;xx<w;xx++) { |     	for (int xx=0;xx<w;xx++) { | ||||||
|         	for (int yy=0;yy<h;yy++) { |         	for (int yy=0;yy<h;yy++) { | ||||||
| 				if (x+xx>=0&&y+yy>=0&&x+xx<JavaProjectTemplate.WINDOW_WIDTH&&y+yy<JavaProjectTemplate.WINDOW_HEIGHT) { | 				if (x+xx>=0&&y+yy>=0&&x+xx<JavaProjectTemplate.WINDOW_WIDTH&&y+yy<JavaProjectTemplate.WINDOW_HEIGHT) { | ||||||
| 					int index = ((int)y+yy)*JavaProjectTemplate.WINDOW_WIDTH+(int)x+xx; | 					int index = ((int)y+yy)*JavaProjectTemplate.WINDOW_WIDTH+(int)x+xx; | ||||||
| 					Draw(p,index,col); | 					Draw(index,col.getColor()); | ||||||
| 				} | 				} | ||||||
|         	}	 |         	}	 | ||||||
|     	} |     	} | ||||||
| @ -550,7 +577,7 @@ public class Panel extends JPanel implements Runnable,KeyListener { | |||||||
| 					if (((sprite.getImg().getRGB(X,Y)>>>24)&0xFF)==0||index<0||index>=pixel.length) { | 					if (((sprite.getImg().getRGB(X,Y)>>>24)&0xFF)==0||index<0||index>=pixel.length) { | ||||||
| 						continue; | 						continue; | ||||||
| 					} else { | 					} else { | ||||||
| 						Draw(pixel,index,(col==Color.WHITE)?sprite.getImg().getRGB(X,Y):col.getColor());	 | 						Draw(index,(col==Color.WHITE)?sprite.getImg().getRGB(X,Y):col.getColor());	 | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 			}	 | 			}	 | ||||||
| @ -560,12 +587,8 @@ public class Panel extends JPanel implements Runnable,KeyListener { | |||||||
| 	public void Clear(Color col){ | 	public void Clear(Color col){ | ||||||
| 		for (int y=0;y<JavaProjectTemplate.WINDOW_HEIGHT;y++) { | 		for (int y=0;y<JavaProjectTemplate.WINDOW_HEIGHT;y++) { | ||||||
| 			for (int x=0;x<JavaProjectTemplate.WINDOW_WIDTH;x++) { | 			for (int x=0;x<JavaProjectTemplate.WINDOW_WIDTH;x++) { | ||||||
| 				Draw(pixel,y*JavaProjectTemplate.WINDOW_WIDTH+x,col.getColor()); | 				Draw(y*JavaProjectTemplate.WINDOW_WIDTH+x,col.getColor()); | ||||||
|         	} |         	} | ||||||
|         } |         } | ||||||
| 	} | 	} | ||||||
| 
 |  | ||||||
| 	public void Draw(int[] canvas,int index, int col) { |  | ||||||
| 		canvas[index]=col; |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user