gpt4 book ai didi

java - (Java) 屏幕闪烁

转载 作者:行者123 更新时间:2023-12-01 14:51:33 25 4
gpt4 key购买 nike

我已经开始使用 Java 编写一个小型且简单的引擎(用于游戏)。当我重新绘制屏幕时,它有时会闪烁。我查找了这个问题的答案,答案建议使用 Swing 计时器(这就是我正在做的)。以下是相关代码片段(我在一些注释中添加了):

public class Game extends JPanel implements ActionListener {
private static final long serialVersionUID = 1L;

private static Window window;
private static ObjectUpdater objects;
private static Timer timer;

private static boolean init = false;


public Game(){
timer = new Timer(30,this);
timer.start();
}

public static void main (String[] self){
new Game();
}

private static void initialize(){
//Tests
//Setting up the window
window = new Window();

//Setting up the updater
objects = new ObjectUpdater();

new Picture(Path.images+Path.img_black,10);
// These are just some objects for the game...

Entity r = new Entity(new Picture(Path.images+Path.img_lapras,0));
r.setVelocity(0.5,0);
Entity r2 = new Entity(new Picture(Path.images+Path.img_lapras,1));
Vector i = new Vector(0,0.5);
r2.setVelocity(i.values()[0],i.values()[1]);
}
// This is where repaint(); is called.
public void actionPerformed(ActionEvent e) {
setDoubleBuffered(true);
if (init == false){
initialize();
init = true;

}

objects.update(); // This updates all the game object's information
window.update(); // This updates the window itself, it's literally: repaint();

}
}

这是窗口对象的代码,因为这也是发生事情的地方。

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

public static int refresh_rate = 25;
public static Picture[] image_list = new Picture[0]; // All the images I want to render
private static String win_title = "Window"; // The name of the window
private static int[] win_xy = {640,360}; // The size of the window

public Window(){
//initializes window
setTitle(win_title);
//setUndecorated(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(win_xy[0],win_xy[1]);
setLocationRelativeTo(null);
setVisible(true);
setResizable(false);

}

public static int[] getWinSize(){
return win_xy;
}

// Here I'm just "painting" everything in the image_list array...
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
for (Picture i:image_list){
g2d.drawImage(i.getPic(), i.getXY()[0], i.getXY()[1], null);
}
Toolkit.getDefaultToolkit().sync();
g.dispose();
}


public static void addPicture(Picture element){// This adds images to the image_list
Picture[] result = Arrays.copyOf(image_list, image_list.length +1);
result[image_list.length] = element;
image_list = result;
Arrays.sort(image_list);

}

public void update() {
repaint();

}

}

就是这样...谢谢!

最佳答案

顶级包含(例如JFrame)不是双缓冲的。这是我们不建议从顶级容器进行扩展的原因之一。

相反,为您自己创建一个自定义组件(例如来自 JPanel)并覆盖它的 paintComponent 方法(不要忘记调用 super.paintComponent)

查看

举一些例子

关于java - (Java) 屏幕闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14789082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com