如何在Java游戏中增加缓冲区?
所以在我正在做的游戏中,我有一个大理石跟着鼠标,但是当它这样做的时候屏幕闪烁。
背景包括两个JPEG和九个矩形。 我怎么去双缓冲呢? 这是主窗口的代码。
/** * Write a description of class Window here. * * @author (your name) * @version (a version number or a date) */ public class Window extends JApplet implements MouseMotionListener { private BufferedImage image; private BufferedImage side; private int mouseX; private int mouseY; public Window(){ try { image = ImageIO.read(new File("Backgrounds/violet.jpg")); side = ImageIO.read(new File("Backgrounds/side margin.jpg")); } catch (IOException ex) { } } private void delay(int delay) { try { Thread.sleep(delay); } catch (InterruptedException e) {} } public void init() { this.addMouseMotionListener(this); } public void paint (Graphics page) { page.drawImage(image, 0, 0, null); page.setColor(Color.blue); page.fillRect(0, 0, 160, 160); page.setColor(Color.black); page.fillRect(15, 15, 130, 130); page.setColor(Color.green); page.fillRect(340, 0, 160, 160); page.setColor(Color.black); page.fillRect(355, 15, 130, 130); page.setColor(Color.yellow); page.fillRect(0, 340, 160, 160); page.setColor(Color.black); page.fillRect(15, 355, 130, 130); page.setColor(Color.red); page.fillRect(340, 340, 160, 160); page.setColor(Color.black); page.fillRect(355, 355, 130, 130); page.drawImage(side, 500, 0, null); page.drawString(Score.getScore(), 560, 110); //conveyors page.setColor(Color.gray); page.fillRect(235, 0, 30, 160); //marble delay(100); page.fillOval(mouseX, mouseY , 40, 40); } public void mouseMoved(MouseEvent e) { mouseX = e.getX(); mouseY = e.getY(); repaint(); } public void mouseDragged(MouseEvent e) { } }
双缓冲在概念上相当简单,而不是逐个绘制对象,而是在图像上绘制它们,然后告诉渲染器绘制整个图像。 这消除了闪烁。
这里是一个例子,你可以做这个( 源 )
class DoubleBufferedCanvas extends Canvas { public void update(Graphics g) { Graphics offgc; Image offscreen = null; Dimension d = size(); // create the offscreen buffer and associated Graphics offscreen = createImage(d.width, d.height); offgc = offscreen.getGraphics(); // clear the exposed area offgc.setColor(getBackground()); offgc.fillRect(0, 0, d.width, d.height); offgc.setColor(getForeground()); // do normal redraw paint(offgc); // transfer offscreen to window g.drawImage(offscreen, 0, 0, this); } }
现在,你不必自己实现这个,你可以使用BufferStrategy和相关的类。 看到lakam99的答案为例。
Swing支持自动双缓冲,所以你不需要编码任何东西。
只需在顶级组件(通常是JPanel)上调用setDoubleBuffered(true)
),它应该都可以工作。
请参阅: setDoubleBuffered
另一个解决scheme是使用一个库,将为您加倍缓冲。 既然你正在使用Java2D,我假设你想保持一切都非常轻量级和较低的水平。 我认为Slick2D在提供简单的2d绘图和inputfunction方面做得非常出色,不会妨碍您的进行。 这感觉就像一个更优雅的Java2D版本,但写在OpenGL上。 一旦你用纯Java做了几个应用程序,我认为转移到Slick2D是一个伟大的想法。 这不是你的问题的直接解决scheme,但是因为它已经被解决了,所以我认为Id提供了一些build议,这将使你的Java游戏开发更轻松。 检查出来,如果你有机会http://slick.cokeandcode.com/
我认为你的问题不是双缓冲。 你必须添加super.paint(page);
在你的绘画方法的第一行。