我将如何有效地制作假瓦片阴影?

所以我正在制作一个基于平铺的游戏,并且我想为这些贴砖添加一些假阴影。 这很难解释,所以我会用图片来做:

假设这是我的瓷砖世界:

我希望它有这样的阴影:

阴影

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

部分

但是现在我不知道如何将它带入代码。 其实,我确实有想法,但它们令人难以置信,而且它们不能以最佳方式工作。

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

但是,无论我做错了什么,或者他们只是拒绝工作。 有任何想法吗?


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

是的,这是“蛮力”解决方案,您可以使用一些更聪明的方法,通过更小的桌子来摆脱困境。 但是256个元素并没有那么多(你可以很容易地从数据文件中加载它),而且这种方法的好处在于它是完全通用的 - 如果你愿意的话,你可以让所有的256个tile看起来微妙不同。


好的,仔细看看你的示例瓷砖的阴影方式,看起来你真的只需要4位(因此是16个元素的表格):

  • 如果北,西和西北邻居都是绿色,请设置此位。
  • 如果北,东和东北邻居都是绿色的,请设置此位。
  • 如果南,西和西南邻居都是绿色,请设置此位。
  • 如果南,东和东南邻居都是绿色,请设置此位。
  • 即使这些16个瓷砖中的一些仍然是彼此的旋转/镜像版本,但可能最容易将方向存储在瓷砖索引旁边的表格中,而不是试图在代码中进行计算。


    我会尝试这样的事情:

    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);
    }
    
    链接地址: http://www.djcxy.com/p/10917.html

    上一篇: How would I efficiently make fake tile shadows?

    下一篇: Netbeans SCSS file autocomplete just like CSS file