难以理解 java 游戏开发的图像加载日期

Difficulty understanding image loading date for java game development

我正在参考 RealtutsGML 的 java 游戏编程系列创建一个 java 游戏。我很难理解这段代码的某些部分是如何工作的。我了解图像部分的 getWidth 和 getHeight,但在 for 循环中,我迷路了。

巫师class是玩家,方块是地图周围的屏障。该地图是我在 photoshop 中制作的 64 x 64 图像,由一堆红色像素组成,代表应该在其中生成 Block 对象的位置,以及一个代表 Wizard/Player 生成的绿色像素位置。

    private void loadLevel(BufferedImage image) {
    int w = image.getWidth();
    int h = image.getHeight();

    for(int xx = 0; xx < w; xx++) {
        for(int yy = 0; yy < h; yy++) {
            int pixels = image.getRGB(xx, yy);
            int red = (pixels >> 16) & 0xff;
            int green = (pixels >> 8) & 0xff;
            int blue = (pixels) & 0xff;

            if(red == 255) 
                handler.addObject(new Block(xx * 32, yy * 32, ID.Block));
            if(green == 255)
                handler.addObject(new Wizard(xx * 32, yy * 32, ID.Player, 
                handler));
        }
    }
}

我很难理解的部分是int pixels = image.getRGB(xx, yy) 这是否意味着像素存储红色、绿色和蓝色的值,如果是这样,像素如何存储多个值?

我不明白的下一部分是

 int red = (pixels >> 16) & 0xff;
 int green = (pixels >> 8) & 0xff;
 int blue = (pixels) & 0xff;

为什么我们将红色、蓝色和绿色变量的像素向右移动 16 和 8,然后添加 & 0xff?

最后一部分是为什么我们将 handler.addObject 方法中的 xx 和 yy 值乘以 32。每个块对象和向导对象都是 32 x 32 但为什么我们需要将整个图像乘以 32 .

我已经查看了 oracle 站点来解释 & 按位运算符,它确实有一点帮助,但我仍然很难理解它在这种情况下是如何工作的。

单个像素可以存储在一个(32 位)整数中。

颜色 RGB 的每个分量的范围从 0 到 255,其中 (0,0,0) 是黑色,(255,255,255) 是白色,然后是介于两者之间的所有颜色。 0 到 255 可以用 8 位存储,这意味着你可以用 24 位存储 RGB 数据。接下来的 8 位可能未使用,或用于存储 alpha 数据或其他任何内容,但这在这里并不重要。

因此,像素可以作为整数读取,这通常是您处理图像数据的方式,因为值是整数。

按位运算符用于"extract"整数的特定部分,因为前8位存储蓝色数据,接下来的8位存储绿色数据,接下来的8位存储红色数据。请注意,"first",我是从右到左阅读的,因为很多数据存储在 little endian even though it looks reversed to humans.

如果您不知道位移是如何工作的,您可以在这里阅读:What are bitwise shift (bit-shift) operators and how do they work?。基本上,这是获得所需位的简单方法。

所以如果你把你的 24 位颜色数据想象成一个 32 位整数如下:

rrrrrrrrggggggggbbbbbbbb

通过说像素 >> 8,你得到

        rrrrrrrrgggggggg

但是如果你按原样读取结果值,你会得到所有你不想要的额外红色数据。所以你 & 与 0xff 为了保留最后 8 位,这是你的绿色组件,然后删除(或清零)任何其他位。

至于以 32 为间隔的方块和向导位置,我的最佳猜测是您的游戏地图表示为具有大小为 32x32 的方块的网格。为什么?因为如果你所有的精灵都存储一个像素,你就会一团糟。使用图像创建生成点是通过从图块坐标(在您的图像上)映射到屏幕上的像素坐标来完成的。也就是说,图像中的像素 (0,0) 是网格的左上角,而图像中的像素 (0, 1) 代表下方的一个图块(在游戏中为 32 像素)。

基本上,您有一个 64x64 的图块地图,假设每个图块的大小为 32x32,游戏将初始化屏幕上对象的位置,使用您的图像作为您 "draw out"地图布局。