有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

位运算符难以理解java游戏开发中的图像加载日期

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

向导类是玩家,区块是地图周围的屏障。这张地图是我在photoshop中制作的一张64乘64的图像,它由一组红色像素组成,这些像素表示块对象应该生成的位置,还有一个绿色像素表示向导/玩家生成的位置

    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,然后添加&;他们怎么了

最后一部分是为什么我们在处理程序中乘以xx和yy值。通过32添加对象方法。每个块对象和向导对象都是32乘32,但是为什么我们需要将整个图像乘以32呢

我已经看过甲骨文网站来解释&;位运算符,它确实有一点帮助,但我仍然很难理解它在这种情况下是如何工作的


共 (1) 个答案

  1. # 1 楼答案

    单个像素可以存储为(32位)整数

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

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

    位运算符用于“提取”整数的特定部分,因为前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,使用你的图像作为一种方式,让你“绘制”地图的布局