2016-07-06 1 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()); 

    } 

} 

어떻게하면 렌더링의 깜박임을 방지 할 수 있습니까? 깜박일 때 깜박임을 제외하고는 모두 잘 작동합니다. VelX 또는 VelY가 0이 아닌지 확인하기 위해 if 문을 추가 할 수 있다고 가정합니다. 그러나 사각형을 옮길 때 깜박입니다. 제발 절 끌어주세요.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); 

}

자세한 내용은, 내가 자바 문서가 좋은 튜토리얼이 생각이 같은

뭔가 더블 버퍼를 달성 할 것입니다.

+0

을 참조하십시오. 메소드를 코드로 변경하면 화면에 아무 것도 표시되지 않습니다. – Ryan

+0

[이 튜토리얼] (http://www.java2s.com/Tutorial/Java/0261__2D-Graphics/Doublebuffer.htm)과 같은 JFrame을 사용하기로 결정했다면. 개인적으로 활성 렌더링을 위해 캔버스를 사용하도록 전환하는 것이 좋습니다. [This] (http://jamesgames.org/resources/double_buffer/double_buffering_and_active_rendering.html)는 좋은 예입니다. – Calvin

관련 문제