Advertisement
Guest User

GameLoop

a guest
May 3rd, 2012
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.68 KB | None | 0 0
  1. import java.awt.*;
  2. import java.util.*;
  3. import java.awt.image.*;
  4. import javax.swing.JFrame;
  5.  
  6. public class TestLoop extends Canvas implements Runnable{
  7.    
  8.     private static final int WIDTH = 800;
  9.     private static final int HEIGHT = 600;
  10.     private boolean running = false;
  11.     private int tick;
  12.     private int frames;
  13.     private int tickCount;
  14.    
  15.     private BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
  16.     private int[] pixel = ((DataBufferInt)image.getRaster().getDataBuffer()).getData();
  17.        
  18.     public void start(){
  19.         if(!running){
  20.             running = true;
  21.             new Thread(this).start();
  22.         }
  23.     }
  24.    
  25.     public void stop(){
  26.         if(running)running = false;
  27.     }
  28.    
  29.     public void run(){
  30.         long lastTime = 0;
  31.         double updateInterval = 1000000000.0 / 60.0;
  32.         long nextUpdateTick = System.nanoTime();
  33.         long now = 0;
  34.         long start = 0;
  35.         long timer = System.currentTimeMillis();
  36.         long fps = 60;
  37.        
  38.         while(running){
  39.             long deltaTime = System.nanoTime() - lastTime;
  40.             lastTime += deltaTime;
  41.             start = System.nanoTime();
  42.             for(now = System.nanoTime(); now > nextUpdateTick; nextUpdateTick += updateInterval){
  43.                 tick++;
  44.                 update();
  45.             }
  46.  
  47.             render();
  48.             Toolkit.getDefaultToolkit().sync();
  49.  
  50.                
  51.             long sleepTime = Math.round((1e9/fps - (System.nanoTime() - lastTime)) /1e6);
  52.             if(sleepTime < 0)continue;
  53.            
  54.             long prev = System.nanoTime(), diff;
  55.             while((diff = System.nanoTime() - prev) < sleepTime){
  56.                 if(diff < sleepTime * 0.8){
  57.                     try{
  58.                         Thread.sleep(1);
  59.                         } catch(Exception e){
  60.                             e.printStackTrace();
  61.                         }
  62.                 } else {
  63.                     Thread.yield();
  64.                 }
  65.             }
  66.             if(System.currentTimeMillis() - timer > 1000){
  67.                 System.out.println("FPS: " + frames + " Ticks: " + tick);
  68.                 frames = 0;
  69.                 tick = 0;
  70.                 timer += 1000;
  71.             }
  72.         }
  73.        
  74.     }
  75.    
  76.     public void update(){
  77.         tickCount++;
  78.     }
  79.    
  80.     public void render(){
  81.         frames++;
  82.         BufferStrategy bs = getBufferStrategy();
  83.         if(bs == null){
  84.             createBufferStrategy(3);
  85.             return;
  86.         }
  87.        
  88.         for(int i = 0; i < pixel.length; i++){
  89.             pixel[i] = (i + tickCount);
  90.         }
  91.        
  92.         Graphics g = bs.getDrawGraphics();
  93.         g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
  94.         g.dispose();
  95.         bs.show();
  96.        
  97.     }
  98.    
  99.     public static void main(String[] args){
  100.         TestLoop game = new TestLoop();
  101.         game.setPreferredSize(new Dimension(WIDTH, HEIGHT));
  102.         game.setMaximumSize(new Dimension(WIDTH, HEIGHT));
  103.         game.setMinimumSize(new Dimension(WIDTH, HEIGHT));
  104.        
  105.         JFrame frame = new JFrame();
  106.         frame.add(game);
  107.         frame.pack();
  108.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  109.         frame.setResizable(false);
  110.         frame.setLocationRelativeTo(null);
  111.         frame.setVisible(true);
  112.        
  113.         game.start();
  114.     }
  115.  
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement