RGB 16 位精灵(C# 按位)

RGB 16Bit Sprites (C# Bitwise)

我们正在改装旧的 16 位时代视频游戏卡带。我们希望在游戏中注入一些我们自己的 Sprites 来试一试。

为此,我们正在开发一个应用程序来显示 Sprites 并将新的 Sprites 转换为 Hex(以便于注入。)

游戏将单个像素存储为 2 位十六进制值 (0x0~0xFFFF)。游戏使用位移来建立单独的红色、绿色和蓝色。我们不得不从 Sprite Resources 社区返回一些旧文档来确认这一点。这确认使用了两个口罩。

我们的显示功能运行良好。该函数接收 HEX,然后 returns 具有 3 个值的 ARRAY:R、G、B。

在我们小组中,没有特别擅长按位移位的人。我们正在寻求帮助,将 3 种“int”颜色变回原来的单一 2 位十六进制。

已回答!!谢谢

首先,您确定要在计算中使用 ~ 吗:

colorRGB0R = ~(((HexPixelValue >> 11) & PixelMask1) << 3);
colorRGB0G = ~(((HexPixelValue >> 5) & PixelMask2) << 2);
colorRGB0B = ~((HexPixelValue & PixelMask1) << 3);

因为除此之外数学看起来还不错?也许评论部分对这些值做了一些事情,但我不太确定你为什么要反转它们。无论如何...

基本上,您正在使用 565 16 位颜色。如果你像这样编写 16 位值的位布局,而不是那个位掩码,它会更容易理解:rrrrrggg gggbbbbb 因为它可视化你想用什么值设置哪些位。

表示红色和蓝色是 5 位值 (0-31),绿色是 6 位值 (0-63)。但是,由于颜色值应该在 0-255 的范围内,因此在提取位后,您必须将它们相乘以获得范围。这里的乘法也是通过位移来完成的。

要重建 16 位值,您可以这样做:

int ToHex(int red, int green, int blue)
{
  if (red < 0 || red >= 256)
    throw new ArgumentOutOfRangeException(nameof(red));
  if (green < 0 || green >= 256)
    throw new ArgumentOutOfRangeException(nameof(green));
  if (blue < 0 || blue >= 256)
    throw new ArgumentOutOfRangeException(nameof(blue));

  // red & 0xF8 cuts off the bottom 3 bits to be save
  // green & 0xFC cuts off the bottom 2 bits
  // blue needs to be shifted to the right anyway, so we use that to cut off 3 bits

  return ((red & 0xF8) << 8) |
    ((green & 0xFC) << 3) |
    (blue >> 3);
}