【问题标题】:RGB 16Bit Sprites (C# Bitwise)RGB 16 位精灵(C# 按位)
【发布时间】:2021-05-10 00:05:08
【问题描述】:

我们正在对旧的 16 位时代视频游戏卡带进行改装。我们希望在游戏中注入一些我们自己的 Sprite,让我们的脚趾浸入水中。

为此,我们正在开发一个应用来显示 Sprite 并将新的 Sprite 转换为 Hex(以便更容易注入。)

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

我们的显示功能完美运行。该函数接收 HEX,然后返回一个包含 3 个值的 ARRAY:R、G、B。

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

已回答!!谢谢

【问题讨论】:

    标签: c# bitwise-operators


    【解决方案1】:

    首先,您确定要在此处的计算中使用~

    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);
    }
    

    【讨论】:

    • 是的,[code]~[code] 必须颠倒每一位。存储在保存数据中的大多数游戏值/值都是相反的(又名 FF 是 0 而不是 255。)如原始主题中所述,上述按位对于从墨盒中读取 Sprites 是 100% 正确的。该公式已从游戏的来源以及为该系列生成 Sprite 表的各种人员得到证实。它是非可选的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    相关资源
    最近更新 更多