我最近开始做一些简单的游戏制作教程。
到目前为止,它是非常基本的东西,我可以包裹我的头脑或已经理解。 但是,我刚刚完成了关于双缓冲的教程 - 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();
}
所以你创建了一个窗口的图像,然后是该图像的图形(不太确定它的区别是什么,并且找不到足够简单的定义来满足)。 然后将图像传递给第二个创建椭圆形的方法,然后通过重绘更新窗口(我非常肯定)。最后,回到油漆区,绘制图像。
因此,如果有人可以向我解释信息流以及图形与图像之间的区别以及重绘命令,我会非常感激 - 欢呼!
答案 0 :(得分:1)
那段代码太糟糕了。
以下是一些更好的教程:
Performing Custom Painting - 给出一个简单的例子并解释Swing中的基本绘画 Painting in AWT and Swing - 关于绘画如何运作的更详细解释
答案 1 :(得分:0)
这是所谓双重缓冲的基本示例。您不是直接绘制到设备上(通过Graphics
上下文),而是先将所有内容渲染到缓冲区(在本例中为dbImage
)并绘制所需的所有内容。
完成后,您可以在一个绘制步骤中将生成的图像渲染到设备的Graphics
上下文中。这可以在一小段时间内进行大量更改时减少闪烁。
dbImage = createImage(getWidth(), getHeight());
“创建一个用于双缓冲的屏幕外可绘制图像”,有关详细信息,请参阅Component#createImage
。
dbg = dbImage.getGraphics();
获取图片Graphics
上下文。这是一个统一的绘画API,可以轻松绘制到多个不同的来源,例如屏幕,打印或图像
paintComponent(dbg);
Off将绘画加载到另一个方法,正如您所说,绘制一个椭圆
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);
是一个稍好的例子
我也刚刚意识到,我的代码中没有其他地方是那些方法 叫......他们怎么没有理由被召唤?
有关绘画如何运作的解释,请参阅Painting in AWT and Swing
根据其他评论进行了更新
通常,直接绘制到顶级容器是个坏主意,例如JFrame
或JPanel
。相反,您应该使用类似JPanel
的内容并覆盖paintComponent
方法。
Swing组件已经是双缓冲的,因此您无需担心它。
有关详细信息,请参阅Performing Custom Painting