Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
难以理解java游戏开发的图像加载日期_Java_Bitwise Operators_Bufferedimage_Game Development - Fatal编程技术网

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

难以理解java游戏开发的图像加载日期,java,bitwise-operators,bufferedimage,game-development,Java,Bitwise Operators,Bufferedimage,Game Development,我正在创建一个java游戏,参考RealtutsGML的java游戏编程系列。我很难理解这段代码的某些部分是如何工作的。我了解图像部分的getWidth和getHeight,但在for循环中,我迷路了 向导类是玩家,区块是地图周围的屏障。这张地图是我在photoshop中制作的一张64乘64的图像,它由一组红色像素组成,这些像素表示块对象应该生成的位置,还有一个绿色像素表示向导/玩家生成的位置 private void loadLevel(BufferedImage image) {

我正在创建一个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));
        }
    }
}
为什么我们要将红色、蓝色和绿色变量的像素右移16和8,然后在其上添加&0xff

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


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

一个像素可以存储在32位整数中

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

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

按位运算符用于提取整数的特定部分,因为前8位存储蓝色数据,后8位存储绿色数据,后8位存储红色数据。请注意,首先,我从右向左读取,因为大量数据存储在中

如果您不知道按位移位是如何工作的,可以在此处阅读:。基本上,这是一个简单的方法来获得位你想要的

因此,如果您将24位颜色数据想象为32位整数,如下所示:

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

        rrrrrrrrgggggggg
但如果按原样读取结果值,就会得到所有不需要的额外红色数据。因此,您使用0xff保留最后8位,这是您的绿色组件,然后删除或归零任何其他位

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


基本上,你有一张64x64的平铺地图,游戏将初始化屏幕上对象的位置,假设每个平铺的大小为32x32,使用你的图像作为绘制地图布局的方式。

我将标记为重复,但我喜欢你的答案。这里字节的使用可能会令人困惑,因为字节通常是8位的单位。@anneb字节的使用不正确。我在考虑32位整数,但不确定为什么我称它为字节。我已经删除了对ByteTanks一词的引用,以供您回答。0xFF到底是什么,它代表什么?二进制中的@Louis 0xFF是1111 1111。将其用作AND掩码将保留前8位,并将其余的置零。
        rrrrrrrrgggggggg