Dou*_*oug 2 java swing timer paint double-buffering
我可以从谷歌搜索中看到这个问题被问到很多,但我找到的解决方案都没有为我做.你知道,我用Java制作一个带有图像的游戏,因为游戏通常都有这些东西.但整个表格不断闪烁,我无法阻止它.是的,我已经双重缓冲它并覆盖了update()方法,虽然这肯定有帮助,但闪烁仍然存在.我不知道我在做双重缓冲是否有问题,或者我是否需要完全不同的东西.
起初我觉得它可能与clearRect()行有关,但在删除它之后,游戏仍然闪烁,但当然每次都没有清除.所以这根本没有帮助.在减慢定时器时,闪烁几乎完全消失,但我需要将其减慢到100ms,即便如此,我仍然会有一些闪烁.此外,这对游戏来说太慢了.我试过让一个计时器在一个10ms的计时器上完成所有工作,一个单独的计时器在100ms进行绘画,但它看起来只是看起来很蠢.虽然闪烁仍然是一个问题,但我可以将绘画计时器减慢到大约30毫秒并保持平滑.
必须有一种方法每10-30ms这样做而不会闪烁.是否有其他方法类似于双缓冲但在这种情况下更好,或者我可以使用的东西?在此先感谢您的帮助.
public class main extends JApplet implements ActionListener {
//This Declares The Variables
Graphics2D buffer;
Image offscreen;
Timer timGame = new Timer(10, this);
//other variables
public void init(){
//This Creates The Offscreen Buffer Zone
offscreen = createImage(getSize().width, getSize().height);
buffer = (Graphics2D)offscreen.getGraphics();
//other initialization stuff irrelevant to drawing
}
public void actionPerformed(ActionEvent evt){
if (evt.getSource() == timGame)
runGame();
}
private void runGame(){
//Do stuff, move objects
repaint();
}
public void paint(Graphics g){
super.paint(g);
buffer.clearRect(0, 0, getSize().width, getSize().height);
//draw stuff to buffer
g.drawImage(offscreen, 0, 0, this);
}
public void update(Graphics gr){
paint(gr);
}
Run Code Online (Sandbox Code Playgroud)
不要直接绘制到paint(...)顶级窗口的方法(如JApplet或JFrame),因为丢失了所有双缓冲和所有Swing好东西.而是绘制paintComponent(...)您添加到JApplet的JPanel或其他JComponent派生组件(包括JComponent本身)的方法.
如果您在此处或在Google中搜索此主题,您会看到在此网站和其他网站上多次询问和回答,答案是相同的.
例如
| 归档时间: |
|
| 查看次数: |
3459 次 |
| 最近记录: |