c# - 我将如何有效地制作假瓷砖阴影?

标签 c# block

所以我正在制作一个基于图 block 的游戏,我想为图 block 添加一些假阴影。这有点难以解释,所以我会用图片来解释:

假设这是我的瓷砖世界:

world

我希望它有这样的阴影:

shadows

因为世界是基于图 block 的,所以我可以将所有阴影部分拆分成单独的图像:

parts

但现在我不知道如何将其转化为代码。好吧,实际上我确实有想法,但它们非常乏味,而且效果不佳。

我已经尝试过大量的 if 语句...

bool ul = adjacentBlocks[0, 0] == Block.Type.Rock; //Upper Left
bool um = adjacentBlocks[1, 0] == Block.Type.Rock; //Upper Middle
bool ur = adjacentBlocks[2, 0] == Block.Type.Rock; //Upper Right

bool ml = adjacentBlocks[0, 1] == Block.Type.Rock; //Center Left
//bool cm = adjacentBlocks[1, 1] == Block.Type.Rock; //CURRENT BLOCK - NOT NEEDED
bool mr = adjacentBlocks[2, 1] == Block.Type.Rock; //Center Right

bool ll = adjacentBlocks[0, 2] == Block.Type.Rock; //Lower Left
bool lm = adjacentBlocks[1, 2] == Block.Type.Rock; //Lower Middle
bool lr = adjacentBlocks[2, 2] == Block.Type.Rock; //Lower Right

if (ml) { texture = "Horizontal"; flipX = false; flipY = false; }
if (mr) { texture = "Horizontal"; flipX = true;  flipY = false; }
if (um) { texture = "Vertical"; flipX = false; flipY = false; }
if (lm) { texture = "Vertical"; flipX = false; flipY = true; }
if (ml && ul && um) texture = "HorizontalVertical";
//More if statements I can't be bothered to write
if (ul && um && ur && ml && mr && ll && lm & lr) texture = "Full";

还有一个巨大的查找表...

var table = new List<TextureBlockLayout>
                                        {
                                            new TextureBlockLayout("Horizontal", false, false, new[,]
                                                                                         {
                                                                                             { true, true, false },
                                                                                             { true, true, false },
                                                                                             { true, true, false }
                                                                                         }),
                                            new TextureBlockLayout("Horizontal", true, false, new[,]
                                                                                         {
                                                                                             { false, true, true },
                                                                                             { false, true, true },
                                                                                             { false, true, true }
                                                                                         }),
                                            new TextureBlockLayout("Full", false, false, new[,]
                                                                                         {
                                                                                             { true, true, true },
                                                                                             { true, true, true },
                                                                                             { true, true, true }
                                                                                         })
                                        };

但要么我做错了什么,要么他们根本拒绝工作。有什么想法吗?

最佳答案

每个图 block 都有八个邻居。每个邻居都有两种可能的状态。将邻居的状态映射到一个字节中的位,并将该字节作为一个索引到一个 256 元素的查找表中。

是的,这是“蛮力”解决方案,您可以使用一些更聪明的方法来获得一个小得多的表。但是 256 个元素并没有那么多(您可以轻松地从数据文件中加载它),这种方法的好处在于它完全通用 — 如果您愿意,您可以让所有 256 个图 block 看起来略有不同。


好吧,仔细看看你的示例图 block 的着色方式,看起来你真的只需要四位(因此是一个 16 元素的表):

  1. 如果北边、西边和西北边的邻居都是绿色的,就设置这个位。
  2. 如果北边、东边和东北边的邻居都是绿色的,就设置这个位。
  3. 如果南边、西边和西南边的邻居都是绿色的,就设置这个位。
  4. 如果南边、东边和东南边的邻居都是绿色的,就设置这个位。

即使这 16 个图 block 中的一些仍然是彼此的旋转/镜像版本,但将方向与图 block 索引一起存储在表中可能比尝试在代码中计算它更容易。

关于c# - 我将如何有效地制作假瓷砖阴影?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11320359/

相关文章:

c# - 从控制台\Web 应用程序记录到 Azure 诊断

c# - Foreach 可以抛出 InvalidCastException 吗?

javascript - 如何将对象列表传递给 Controller ​​?

c# - 什么是最快的 winforms 数据网格?

layout - Magento:如何使用 XML 布局更新仅更新 block 参数

ruby-on-rails - Ruby 中 do/end block 的一般用途是什么

string - 如何将 Red/Rebol 字符串转换为系列

c# - 在 Controller 中实现 System.Web.Caching.Cache 对象来缓存特定查询

css - 如何使用 BEM CSS 修改 block 的多个元素

iphone - 如何选择端口号?