缓冲图像和像素数组切尔诺



所以我一直在看TheChernoProject的Java2D游戏开发系列,直到第9集。到目前为止,我一直在了解该系列中的所有内容,但是我似乎无法理解缓冲图像和像素数组。

(剧集链接:https://www.youtube.com/watch?v=HwUnMy_pR6A)

我不明白像素数组与缓冲图像对象的关系。据我了解,当您启动程序时,您会创建一个称为图像的BuferredImage,然后将该图像中的每个像素中的数据复制到称为像素的数组中,使用

public int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();

但是,您绝不会将像素中的数据放回该图像中,那么如何

g.drawImage(image, 0, 0, getWidth(), getHeight(), null);

将数据从像素数组绘制到屏幕上?我希望它只会画一个黑色的图像。

您的getData()返回对实际int[]引用,因此,这样,当您更改其元素时,您正在更改实际的数组元素。

参考资料:Filthy Rich Client, Development Animation and Graphic Effects for Desktop Java(TM),Addison-Wesley,作者:Chet Haase 和 Romain Guy,BufferedImage,第 95 页

大多数 getter,包括 DataBufferInt 类中的 getData() -方法,都返回对 Object 的引用,这意味着在编辑 getter 返回的对象时,您可以编辑 getter 返回的引用指向的对象。

在这种情况下,调用 getData() 方法时,引用指向构建实际图像的像素数组。

让我们将此代码用作一个简单的示例:

public class MyClass1
{
    public static int myObject = new MyClass2(278);
    public static MyClass2 getMyObject()
    {
        return myObject;
    }
    class MyClass2
    {
        private int myInt;
        public MyClass2(int myInt)
        {
            this.myInt = myInt;
        }
        public void setMyInt(int newMyInt)
        {
            myInt = newMyInt;
        }
    }
}

然后,这个电话:

MyClass1.myObject.setMyInt(523);

等效于此调用:

MyClass.getMyObject().setMyInt(523);

因为MyClass1.getMyObject()返回对myObject的引用,而不是直接用MyClass1.myObject寻址myObject

由于许多原因,Getters很有用。

例如:

如果您允许字段访问,例如

形状.x = 90

然后,您将来无法添加任何逻辑来验证数据。

比如说,如果 x 不能小于 100,你就不能这样做,但是如果你有 像这样的二传手

这里还讨论了其中的更多问题。

最新更新