图像在Java中闪烁

时间:2013-10-25 19:56:23

标签: java image swing javax.imageio

我在用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();
    }
}

我只添加了这个类,因为这是我添加图像的地方。评论是否要查看其他课程。问题是图像播放器1和块闪烁。

1 个答案:

答案 0 :(得分:2)

  1. 永远不要在EDT(事件调度程序线程)上执行文件I / O.在EDT上由AWT / Swing调用paint(Graphics g)方法,所以你不应该在那里加载图像(正如Zebby Dee正确指出的那样)。在构造函数中初始化它们,或通过SwingWorker或类似工具加载。

  2. 请勿repaintpaint调用draw,因为您间接使用Timer方法。这将导致无休止的重绘循环。如果您需要定期重新绘制游戏,请使用repaint或类似内容,定期发布来自其他主题的Graphics个请求。出于某种原因,您还将图像的draw对象传递给{{1}}方法,并且从不使用它。我不确定那是什么意思。

  3. 这两个问题的结合会导致眨眼效果。