【问题标题】:Java: Painting multiple objects to one frameJava:将多个对象绘制到一帧
【发布时间】:2012-04-11 10:27:16
【问题描述】:

我最近一直在做一个 java 游戏,我已经弄明白了很多。然而,有一件事仍然困扰着我。它的设置方式是,玩家在背景(游戏板)中移动。目前,每次玩家移动时,它都会重新绘制整个帧,包括背景。这会在玩家移动时导致短暂但令人讨厌的屏幕闪烁。

我已经将我的代码与需要重新绘制的东西分开来绘制背景:

public void drawMap(Graphics pane) {...}

public void drawPlayer(Graphics pane) {...}

问题是,当我使用 repaint(); 时,我找不到让板子留在屏幕上的方法; ,玩家移动的必要条件。有什么建议吗?

【问题讨论】:

    标签: java graphics paint


    【解决方案1】:

    您应该研究双缓冲,基本上您将图像绘制到缓冲区,然后绘制缓冲区。它应该消除您正在谈论的闪烁效果。以下是一些有用的链接:

    http://docs.oracle.com/javase/tutorial/extra/fullscreen/doublebuf.html
    http://content.gpwiki.org/index.php/Java:Tutorials:Double_Buffering
    http://www.ecst.csuchico.edu/~amk/classes/csciOOP/double-buffering.html

    如果您在理解上有困难,请发表评论。

    更新:我还建议您查看'Killer game programming in java'。您可以获得其中一个旧版本的免费电子书。其中一些有点过时了,但是关于设置游戏循环和绘制到屏幕等的前几章仍然非常相关。

    更新 2:从第二个链接,尝试这样的事情:

    private void drawStuff() { 
        BufferStrategy bf = this.getBufferStrategy();
        Graphics g = null;
    
      try {
        g = bf.getDrawGraphics();
    
           drawMap(g);
           drawPlayer(g);
    
      } finally {
        // It is best to dispose() a Graphics object when done with it.
        g.dispose();
      }
    
      // Shows the contents of the backbuffer on the screen.
      bf.show();
    
          //Tell the System to do the Drawing now, otherwise it can take a few extra ms until 
          //Drawing is done which looks very jerky
          Toolkit.getDefaultToolkit().sync();   
    }
    

    更新 3:这篇文章 here 提供了一个不错的代码示例,您可以使用和调整,这应该让您了解如何进行双缓冲

    【讨论】:

    • 我阅读了那些网站。我理解它背后的想法,但我不确定如何使用 Frame 和 paint 方法来实现它。 (paint方法调用上面列出的两个方法。)
    • 我看到了那个,但它似乎没有使用任何绘画方法。这就是我感到困惑的原因。
    • 我认为bf.show() 是将它绘制到屏幕上,drawMap(g) 是将你的东西绘制到图形对象之前。抱歉,我需要完成一些现实世界的工作,然后我可以为您更好地查看它。我认为 Stackoverflow 上有一些类似的问题隐藏在这个地方,所以也许同时尝试找到其中的一些
    • @Docithe 这是我正在寻找的帖子stackoverflow.com/questions/4430356/…,我已将其放在我的主要答案中,但这应该包含双缓冲所需的一切
    【解决方案2】:

    我建议避免每次更改都重绘所有内容。而是以固定间隔绘制整个帧,例如每 50 毫秒。只需保持类中每个元素的状态,如果发生变化,只需更改数据值。由于固定的重绘间隔,显示器将在下一次重绘时获取任何更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多