我在用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和块闪烁。
答案 0 :(得分:2)
永远不要在EDT(事件调度程序线程)上执行文件I / O.在EDT上由AWT / Swing调用paint(Graphics g)
方法,所以你不应该在那里加载图像(正如Zebby Dee正确指出的那样)。在构造函数中初始化它们,或通过SwingWorker或类似工具加载。
请勿repaint
从paint
调用draw
,因为您间接使用Timer
方法。这将导致无休止的重绘循环。如果您需要定期重新绘制游戏,请使用repaint
或类似内容,定期发布来自其他主题的Graphics
个请求。出于某种原因,您还将图像的draw
对象传递给{{1}}方法,并且从不使用它。我不确定那是什么意思。
这两个问题的结合会导致眨眼效果。