0

我用 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 和块正在闪烁。

4

1 回答 1

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

  2. 不要调用repaintfrom paint,因为您间接使用您的draw方法。这将导致无休止的重绘循环。如果您需要定期重绘游戏,请使用 aTimer或类似工具,以定期发布repaint来自不同线程的请求。出于某种原因,您还将Graphics图像的对象传递给该draw方法,并且永远不要使用它。我不确定那里的意图是什么。

这两个问题的结合导致了闪烁效果。

于 2013-10-25T20:25:33.397 回答