GameBoy具有多个调色板的意义何在?

时间:2019-06-29 10:29:57

标签: emulation gameboy retro-computing

每个像素由两位组成,最多允许4个灰度阴影。通过LCD Monochrome Palettes section of the pandocs,我们可以开发用于获取颜色的算法(在我正确理解的情况下):

COLOR_NUMBER_PALETTE_BITS = {
    0: (1, 0),
    1: (3, 2),
    2: (5, 4),
    3: (7, 6)
}
COLORS = {0: WHITE, 1: LIGHT_GRAY, 2: DARK_GRAY, 3: BLACK}


def get_pixel_color(palette_address, color_number):
    palette = read_memory(palette_address)
    high_bit, low_bit = COLOR_NUMBER_PALETTE_BITS[color_number]

    color_high_bit = get_bit(palette, high_bit)
    color_low_bit = get_bit(palette, low_bit)

    color = (color_high_bit << 1) | color_low_bit

    return COLORS[color]

但是只要看一下函数签名,我们就可以推断出相同的色号可能会导致不同的颜色。这取决于我们使用的调色板。

我的问题是,为什么其中两个相同时我们需要多个调色板,而与第三个唯一的区别是0是透明的而不是白色?为什么要更改调色板定义,而不是更改用于从调色板获取颜色的色号?

1 个答案:

答案 0 :(得分:1)

您是什么意思“其中两个相同”?您有三种不同的调色板。一个用于背景和窗口。您可以使用Sprite属性中的特殊位为每个Sprite分别选择两个。为什么要更改调色板而不是色号?更改调色板或子画面属性比重写子画面或窗口的每个图块以在屏幕上获得某种效果要便宜得多。当Gameboy在屏幕上绘制图像时,您甚至可以实时更改调色板。

例如,假设我要实现闪烁效果,即整个背景在正常颜色和白色或黑色之间闪烁。不必重写每个帧上的每个背景图块,我只需更改调色板并将其准确计时,以仅影响我需要的部分屏幕即可。甚至还有article描述类似的技术。