0

我正在学习 BufferStrategy 并且我对 BS 的创建有点困惑。

我的代码看起来像这样......

public class Game extends Canvas{


    /*code not relevant to this topic..
                                       */



    public void render(){
        BufferStrategy bs = this.getBufferStrategy();
        if(bs == null){
             createBufferStrategy(3);
        }
    }

}

基本上,我的“游戏”类是 Canvas 的子类。该类获取缓冲区策略并将其存储在bs.

但是,bs 没有“创建”缓冲区策略,如果它为空(在本例中为空),我会说“createBufferStrategy(3)”。

我很困惑当我createBufferStrategy(3)this.createBufferStrategy(3)(这是同一件事)时会发生什么。

存储的价值究竟在哪里createBufferStrategy(3)

它不能存储在.. 中,所以当我只告诉我的子类创建缓冲区策略时bs,如何bs从实际初始化或持有一个值。null我看不到我是如何将状态bs从 null 更改为任何..

我试图这样做bs = createBufferStrategy(3),但它显然不起作用。我想知道为什么以及如何以及到底发生了什么。

先感谢您。

4

2 回答 2

2

来自JavaDocs

公共缓冲区策略 getBufferStrategy()

返回此组件使用的 BufferStrategy。如果 BufferStrategy 尚未创建或已处置,此方法将返回 null。

默认情况下,Canvas不创建或使用任何类型的缓冲区策略。在您的代码中,当您调用

BufferStrategy bs = this.getBufferStrategy();
if(bs == null){

您正在检查是否有任何先前的缓冲区策略已被创建并且处于活动状态(尚未被释放),这确保了无论何时调用此方法,都会尝试提供一个有效的BufferStrategy

当您调用createBufferStrategy(3);它时,它会在内部构造一个BufferStrategy以满足您的要求并将结果分配回一个内部实例变量,该变量通过调用返回getBufferStrategy

您可以尝试将代码更改为更像...

BufferStrategy bs = this.getBufferStrategy();
if(bs == null){
    createBufferStrategy(3);
    bs = this.getBufferStrategy();
}

if (bs == null) {
    // It might not be possible to create a buffer strategy for your hardware,
    // or the component is not attached to a native peer
} else {
    // Start painting :D
}
于 2013-07-10T01:46:14.650 回答
1

您将 BufferStrategy bs 初始化为该组件 BufferStrategy ( this .getBufferStrategy)。我不太了解内部工作原理,但我现在已经并且正在将它用于我的游戏。这主要用于缓冲要显示的图像(即在游戏中),您每次在屏幕上绘画时都会调用 getBufferStrategy,因此 bs 只是一个参考。你也可以写:

if(this.getBufferStrategy() == null)

所以我要说的是 BufferStrategy 是在组件中创建的,检查它是否为 null 可能只是为了防止程序启动时出错,因为我认为在您手动创建它之前没有 BufferStrategy 。

于 2013-07-09T21:58:35.533 回答