7

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

假设这是我的瓷砖世界:

世界

我希望它有这样的阴影:

阴影

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

部分

但现在我不知道如何将它带到代码中。好吧,实际上我确实有一些想法,但它们非常乏味,而且它们不能以最佳方式工作。

我尝试了一个巨大的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 }
                                                                                         })
                                        };

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

4

2 回答 2

3

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

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


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

  1. 如果北、西和西北邻居都是绿色的,则设置该位。
  2. 如果北部、东部和东北部的邻居都是绿色的,则设置该位。
  3. 如果南、西和西南邻居都是绿色的,则设置该位。
  4. 如果南部、东部和东南部的邻居都是绿色的,则设置该位。

即使这 16 个图块中的一些图块仍然是彼此的旋转/镜像版本,但将方向存储在图块索引旁边的表格中可能是最简单的,而不是尝试在代码中计算它。

于 2012-07-03T23:17:25.930 回答
0

我会尝试这样的事情:

struct surroundingTiles
{
    static bool blockNE;
    static bool blockN;
    static bool blockNW;
    static bool blockW;
    static bool blockSW;
    static bool blockS;
    static bool blockSE;
    static bool blockE;
}
foreach(object tile in floor)
{
    if(currentTile.surroundingTiles.blockW && currentTile.surroundingTiles.blockNW && currentTile.surroundingTiles.blockN)
        useTexture(currentTile, shadowSEtexture);
}
于 2012-07-03T23:28:30.097 回答