2013-10-25 8 views
0

Java로 프로그래밍중인 게임에 문제가 있습니다. 여기에 코드가 있습니다.Java에서 이미지 깜박임

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.io.File; 

import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 

public class Game extends JFrame { 
    private static final long serialVersionUID = 1L; 

    Graphics dbg; 
    Image dbImage; 
    static Image block; 
    static Block block1 = new Block(); 
    static Image player1; 
    static Player player = new Player(193, 143); 

    public Game() { 
     Image playerIcon = new ImageIcon("res/play.png").getImage(); 
     setSize(500, 400); 
     setTitle("Game"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setIconImage(playerIcon); 
     setLocationRelativeTo(null); 
     setVisible(true); 
     addKeyListener(new InputHandler()); 
     setBackground(Color.BLACK); 
     setResizable(false); 
    } 

    public static void main(String[] args) { 
     new Game(); 
     Thread p = new Thread(player); 
     p.start(); 
    } 

    @SuppressWarnings("static-access") 
    public void paint(Graphics g) { 
     try { 
      dbImage = ImageIO.read(new File("res/background.png")); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     try { 
      player1 = ImageIO.read(new File("res/play.png")); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     try { 
      block = ImageIO.read(new File("res/grass.png")); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     dbg = dbImage.getGraphics(); 
     draw(dbg); 
     g.drawImage(dbImage, 0, 0, this); 
     g.drawImage(player1, player.x, player.y, this); 
     g.drawImage(block, block1.x, block1.y, this); 
    } 

    public void draw(Graphics g) { 
     repaint(); 
    } 
} 

이미지를 추가 한 곳이기 때문에이 클래스 만 추가했습니다. 다른 클래스를 보려면 댓글을 달아주세요. 문제는 이미지 player1과 블록이 깜박입니다.

+1

'Game' 생성자에서'setDoubleBuffered (true)'를 추가 해보십시오. – Zong

+0

@ZongZhengLi 스윙의 모든 것이 기본적으로 이중 버퍼링 된 것으로 생각했습니다. S – Cruncher

+0

@Cruncher 그래픽 컨텍스트에 직접 그릴 때 그 라인이 필요하다고 생각합니다. – Zong

답변

2
  1. EDT (이벤트 디스패처 스레드)에서 파일 I/O를 수행하지 마십시오. paint(Graphics g) 메서드는 EDT에서 AWT/Swing에 의해 호출되므로 이미지를로드하지 않아야합니다 (Zebby Dee가 올바르게 지적했듯이). 생성자에서 초기화하거나 SwingWorker 등을 통해로드하십시오.

  2. draw 메서드를 사용하여 간접적으로 수행 할 경우 에서 repaint을 호출하지 마십시오. 이렇게하면 끝없이 다시 그리는 루프가 발생합니다. 게임을 정기적으로 다시 칠하려면 Timer 또는 이와 비슷한 것을 사용하여 정기적으로 다른 스레드의 repaint 요청을 게시하십시오. 어떤 이유로 이미지의 Graphics 객체를 draw 메소드에 전달하고 절대 사용하지 마십시오. 나는 그 의도가 무엇인지 확신 할 수 없다.

이 두 가지 문제를 조합하면 깜박임 효과가 발생합니다.