0

我最近开始做一些简单的游戏制作教程。

到目前为止,这是我可以理解或已经理解的非常基本的东西。但是我刚刚完成了关于双缓冲的教程 - http://youtu.be/4T3WJEH7zrc

无论如何,我无法理解的代码是这样的:

public void paint(Graphics g) {
    dbImage = createImage(getWidth(), getHeight());     
    dbg = dbImage.getGraphics();                        
    paintComponent(dbg);                                
    g.drawImage(dbImage, 0, 0, this);                   
}

public void paintComponent (Graphics g) {           
    g.fillOval(x, y, 15, 15);                       
    repaint();                                      
}

因此,您创建了窗口的图像,然后创建了该图像的图形(不太确定有什么区别,也找不到足够简单的定义来满足)。然后将图像传递给创建椭圆的第二个方法,然后通过重绘更新窗口(我很确定)。最后,回到绘画中,图像被绘制出来。

因此,如果有人可以向我解释信息流以及图形与图像和重绘命令之间的区别,我将非常感激 - 干杯!

4

2 回答 2

1

那个代码太可怕了。

  1. 自定义绘画是通过覆盖paintComponent() 方法而不是paint() 方法来完成的,您不应该直接调用paintComponent()。
  2. 你永远不会在绘画方法中调用 repaint() 因为你会导致无限循环。

这里有几个更好的教程可供阅读:

Performing Custom Painting - 给出一个简单的示例并解释 Swing 中的基本绘画
在 AWT 和 Swing中绘画- 更详细地解释绘画的工作原理

于 2013-11-06T04:05:57.273 回答
0

这是所谓的双缓冲的基本示例。不是直接绘制到设备(通过Graphics上下文),而是首先将所有内容渲染到缓冲区(dbImage在本例中为缓冲区),然后将所需的所有内容绘制到它。

完成后,您可以Graphics在单个绘制步骤中将生成的图像渲染到设备的上下文中。这可以减少在短时间内进行大量更改时的闪烁。

dbImage = createImage(getWidth(), getHeight());  

“创建用于双缓冲的屏幕外可绘制图像”,请参阅Component#createImage更多详细信息。

dbg = dbImage.getGraphics();   

获取图像Graphics上下文。这是一个统一的绘画 API,可以很容易地绘制到多个不同的来源,例如屏幕、印刷或图像

paintComponent(dbg);   

将绘画卸载到另一种方法,正如您所说,该方法绘制一个椭圆

g.drawImage(dbImage, 0, 0, this); 

将结果渲染到屏幕上

这个例子有点差。

您应该避免在repaint任何方法中调用或任何可能导致repaint调用的paint方法,因为这将导致paint再次调用,这可能会很快失控。

此外,您应该处理Graphics您创建的任何上下文。

我会考虑类似...

Image dbImage = createImage(getWidth(), getHeight());     
dbg = dbImage.getGraphics();                        
paintComponent(dbg);                                
dbg.dispose()
g.drawImage(dbImage, 0, 0, this);   

做一个稍微好一点的例子

另外我刚刚意识到,在我的代码中没有其他地方调用过这些方法......它们是如何无缘无故被调用的?

请参阅在 AWT 和 Swing中绘画,了解绘画的工作原理

根据其他评论更新

一般来说,直接在顶层容器上绘制是个坏主意,比如JFrameor JPanel。相反,您应该使用类似的东西JPanel并覆盖那里paintComponent的方法。

Swing 组件已经是双缓冲的,所以你不需要太担心。

有关更多详细信息,请参阅执行自定义绘画

于 2013-11-06T04:09:18.680 回答