所以我一直在用Java看过TheChernoProject的2D游戏开发系列,我已经到了第9集了。到目前为止,我已经理解了系列中的所有内容,但是我似乎无法绕过BufferedImage和像素数组。
(链接到剧集:https://www.youtube.com/watch?v=HwUnMy_pR6A)
我不明白像素数组与BufferedImage对象的关系。根据我的理解,当你启动程序时,你创建一个名为image的BuferredImage,然后使用
将该图像中每个像素的数据复制到一个名为像素的数组中。public int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();
但是你没有把像素中的数据放回到那个图像中,所以
是怎样的g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
将像素数组中的数据绘制到屏幕上?我希望它只会画一个黑色的图像。
答案 0 :(得分:0)
您的getData()
会向实际 int[]
返回参考,因此,当您更改其元素时,您正在更改实际数组元素。
参考:肮脏的富客户端,为Desktop Java(TM)开发动画和图形效果,Addison-Wesley,作者:Chet Haase和Romain Guy, BufferedImage,第95页
答案 1 :(得分:0)
大多数getter,包括getData()
类中的DataBufferInt
- 方法,返回对Object的引用,这意味着在编辑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
的引用,而不是直接使用myObject
解决MyClass1.myObject
。
例如:
如果允许像
这样的字段访问shape.x = 90
然后您将来无法添加任何逻辑来验证数据。
如果x不能小于100你就不能这样做,但是如果你有的话 像
这样的二传手
其中一些问题得到解决here。