我正在创建一个参考RealtutsGML的java游戏编程系列的java游戏。我很难理解这段代码的某些部分是如何工作的。我理解图像部分的getWidth和getHeight,但在for循环中,我迷路了。
Wizard类是玩家,块是地图周围的障碍。地图是我在photoshop中制作的64 x 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,然后添加&amp; 0xff到他们身上?
最后一部分是我们将handler.addObject方法中的xx和yy值乘以32的原因。每个块对象和向导对象是32乘32,但为什么我们需要将整个图像乘以32。
我已经查看过oracle网站以解释&amp;按位运算符,它确实有所帮助,但我仍然很难理解它在这种情况下是如何工作的。
答案 0 :(得分:1)
单个像素可以存储在(32位)整数中。
颜色RGB的每个分量范围从0到255,其中(0,0,0)是黑色,(255,255,255)是白色,然后你有所有颜色。 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?。基本上,这是获取所需位数的简单方法。
因此,如果您想象32位整数中的24位颜色数据如下:
rrrrrrrrggggggggbbbbbbbb
通过说像素&gt;&gt; 8,你得到
rrrrrrrrgggggggg
但是,如果按原样读取结果值,您将获得所需的所有额外红色数据。所以你&amp;使用0xff以保留最后8位作为您的绿色组件,然后删除(或清零)任何其他位。
至于间隔为32的块和向导位置,我最好的猜测是你的游戏地图被表示为一个大小为32x32的瓷砖网格。为什么?因为如果你所有的精灵都存储了一个像素,你就会陷入困境。使用图像来创建生成点是通过从平铺坐标(在图像上)到屏幕上的像素坐标的映射来完成的。也就是说,图像中的像素(0,0)是网格的左上角,而图像中的像素(0,1)代表下面的一个图块(游戏中为32像素)。
基本上,你有一个64x64平铺地图,游戏将初始化屏幕上物体的位置,假设每个平铺尺寸为32x32,使用你的图像作为一种方式让你“画出”布局地图。