2016-07-06 99 views
0
package local.ryan.grid; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JFrame; 

public class Game implements Runnable, KeyListener { 

    public boolean isRunning = false; 

    private long lastTime; 
    private double fps; 
    public int gamestage = 0; 

    public int width = 300, height = 300; 
    public String title = "Le Go!"; 

    public JFrame frame = new Frame(2, width, height, title); 

    public int x = 0, y = 0, velX = 0, velY = 0; 

    public static void main(String[] args) throws InterruptedException { 

     Thread game = new Thread(new Game()); 
     game.start(); 

    } 

    public void run() { 

     frame.addKeyListener(this); 
     frame.setFocusable(true); 
     frame.setFocusTraversalKeysEnabled(false); 
     start(); 

     while(isRunning) { 

      lastTime = System.nanoTime(); 

      try { 

       // Limit Each Frame, to 60 fps. 
       // Prevents performance issues with multiple objects. 

      Thread.sleep(1000/60); // 1000 miliseconds (1 second)/60 frames-per-second ~ 17 ms. 



      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

      render(frame.getGraphics()); 

      fps = 1000000000D/(System.nanoTime() - lastTime); //one second(nano) divided by amount of time it takes for one frame to finish 
      lastTime = System.nanoTime(); 

      // Change to integer, to remove decimals. 
      System.out.println("FPS: " + (int) fps + "."); 

     } 

    } 

    public void render(Graphics c) { 

     c.clearRect(0, 0, width, height); 
     Graphics2D g = (Graphics2D)c; 

     g.setColor(Color.RED); 
     g.fillRect(x, y, 30, 60); 

     g.dispose(); 

    } 

    public void start() { 

     if(isRunning) 
      return; 

     isRunning = true; 


    } 

    public void stop() { 

     if(!isRunning) 
      return; 

     isRunning = false; 


    } 

    @Override 
    public void keyPressed(KeyEvent e) { 

     if(e.getKeyCode() == KeyEvent.VK_D) { 

      velX += 1; 
      actionPerformed(); 
      try { 
       Thread.sleep(50); 
      } catch (InterruptedException e1) { 
       e1.printStackTrace(); 
      } 

     } 


    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
    } 

    @Override 
    public void keyTyped(KeyEvent e) { 
    } 

    public void actionPerformed() { 

     x = x + velX; 
     y = y + velY; 
     render(frame.getGraphics()); 

    } 

} 

我该如何防止渲染中的闪烁,它一切正常,除了烦人时闪烁。我想我可以添加一个if语句来检查VelX或VelY是否等于0,但是当我移动广场时它会闪烁!请收拾我。如何防止Java 2D图形闪烁?

+0

考虑绘制一个轻量级组件,覆盖它的'paintComponent'方法。请参见[this](http://www.oracle.com/technetwork/java/painting-140037.html)和[this](https://docs.oracle.com/javase/tutorial/uiswing/painting/) – copeg

回答

0

这可能有一些原因,但看看你的代码现在的原因是因为它没有双缓冲。当您的图形是双缓冲区时,计算机将绘制到虚拟屏幕,然后用显示的屏幕切换该屏幕,防止闪烁。

像这样的实现了双缓冲:

private void render(Graphics g) 
{ 
    BufferedImage bufferedImage = new BufferedImage(500, 500, BufferedImage.TYPE_ARGB); 
    Graphics2D g2d = bufferedImage.createGraphics(); 
    //paint using g2d ... 

    Graphics2D g2dComponent = (Graphics2D) g; 
    g2dComponent.drawImage(bufferedImage, null, 0, 0); 

}

欲了解更多信息,我相信Java文档有一些很好的教程。

+0

当我将方法更改为代码时,屏幕上没有显示任何内容。 – Ryan

+0

如果您决定使用JFrame,如[本教程](http://www.java2s.com/Tutorial/Java/0261__2D-Graphics/Doublebuffer.htm)。我个人推荐切换到使用Canvas进行主动渲染。 [This](http://jamesgames.org/resources/double_buffer/double_buffering_and_active_rendering.html)就是一个很好的例子。 – Calvin