【发布时间】:2014-05-13 23:20:54
【问题描述】:
我正在学习在
找到的中级 Java 教程https://www.youtube.com/watch?v=M2GoiOas2u8&list=PL54DB126285ED0420.
但我遇到了双缓冲闪烁的问题。
我的两个类中的相关代码如下
GamePanel.Java
private void gameRender()
{
if (dbImage == null) // create the buffer
{
dbImage = createImage(GWIDTH, GHEIGHT);
}
if (dbImage == null)
{
System.err.println("dbImage is still null!");
return;
}
else
{
dbg = dbImage.getGraphics();
}
// Clear the screen
dbg.setColor(Color.WHITE);
dbg.fillRect(0, 0, GWIDTH, GHEIGHT);
// Draw Game elements
draw(dbg);
}
// Draw all game content in this method
public void draw(Graphics g)
{
world.draw(g);
}
private void paintScreen()
{
Graphics g;
try
{
g = this.getGraphics();
if (dbImage != null && g != null)
{
g.drawImage(dbImage, 0, 0, null);
}
Toolkit.getDefaultToolkit().sync(); //For some OS.
g.dispose();
}
catch(Exception e)
{
System.err.println(e);
}
}
世界.Java
public void draw(Graphics g)
{
for (int i = 0; i < arrayNumber; i++)
{
g.drawImage(blockImg[i], blocks[i].x, blocks[i].y, null);
}
}
其中数组编号 = 1200。 该程序仅在地图向右或向下移动时才会出现闪烁问题(这意味着 blocks.x 和 blocks.y 会随着 i 的每个值而增加),而反之则不会。我尝试通过将每个 [i] 替换为 [arrayNumber - i] 并修改 for 循环的参数来从右下角向上绘制。这使得闪烁仅在向上和向左移动地图时发生。
所以我知道我应该以某种方式修改 world 类中的这个 run 方法以某种方式使用双缓冲,但我想知道由于 world 不扩展 JPanel,我将如何去做?
【问题讨论】:
-
如果您使用 swing 和
paintComponent方法,则不需要实现双缓冲(因为它会自动执行双缓冲)。这似乎有很多不好的做法。我在任何地方都看不到您的paint或paintComponent方法——我猜GamePanel.java扩展了某种面板,并且您通过获取它的图形对象来绘制它(非常糟糕的主意,imo)。 -
我认为你的教程指向了错误和危险的方向