• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

如何使用平铺位掩码自动平铺您的关卡布局

制作视觉上吸引人且多样的图块集是一个耗时的过程,但结果通常是值得的。然而,即使在创造了艺术之后,你仍然需要在你的关卡中将它们拼凑起来! 

您可以手动放置每个图块,或者,您可以使用位掩码自动执行该过程,因此您只需要绘制地形的形状。

什么是平铺位掩码?

如何使用平铺位掩码自动平铺您的关卡布局  第1张

平铺位掩码是一种从定义的平铺集中自动选择适当精灵的方法。这使您可以在希望出现特定类型地形的任何地方放置通用占位符图块,而不是手动放置可能大量选择的各种图块。 

请参阅此视频进行演示:

平铺位掩码:关卡设计的自动平铺解决方案

在处理多种类型的地形时,不同变化的数量可能会超过 300 个或更多图块。绘制这么多不同的精灵绝对是一个耗时的过程,但瓷砖位掩码确保放置这些瓷砖的行为快速而有效。

使用位掩码的静态实现,映射是在运行时生成的。通过一些小的调整,您可以扩展位掩码以允许在游戏过程中发生变化的动态图块。在本教程中,我们将介绍平铺位掩码的基础知识,同时努力实现使用角平铺和多种地形类型的更复杂的实现。

平铺位掩码的工作原理

概述

平铺位掩码就是计算一个数值并根据该值分配一个特定的精灵。每个图块查看其相邻图块以确定要分配给自己的集合中的哪个精灵。 

瓦片集中的每个精灵都被编号,位掩码过程返回一个与瓦片集中精灵的位置相对应的数字。在运行时,会执行位掩码过程,并使用适当的精灵更新每个图块。

如何使用平铺位掩码自动平铺您的关卡布局  第2张

上面的精灵表由具有所有可能边界配置的地形图块组成。每个图块上的数字代表位掩码值,我们将在下一节中学习如何计算。现在,了解位掩码值与地形图块集的关系非常重要。精灵按顺序排序,以便位掩码值0返回第一个精灵,一直到15返回第 16 精灵的值。 

计算位掩码值

计算这个值比较简单。在此示例中,我们假设没有角块的单一地形类型。 

每个图块检查北、西、东和南的图块是否存在,并且每次检查都返回一个布尔值,其中0表示一个空白区域并1表示存在另一个地形图块。 

然后将此布尔结果乘以二进制方向值并添加到位掩码值的运行总和中 - 通过一些示例更容易理解:

4 位方向值

  • 北 = 2 0 = 1

  • 西 = 2 1  = 2

  • 东 = 2 2  = 4

  • 南 = 2 3 = 8

如何使用平铺位掩码自动平铺您的关卡布局  第3张

上图中的绿色方块代表我们正在计算的地形图块。我们首先检查北方的瓷砖。北方没有平铺,因此布尔检查返回的值为0我们将 0 乘以 North 的方向值,2 0 = 1,得到 1*0 = 0

对于完全被空白空间包围的地形图块,每个布尔检查都会返回0,从而产生 4 位二进制数00001*0 + 2*0 + 4*0 + 8*0 = 0总共有 16 种可能的组合,从 0 到 15,因此图块集中的第一个精灵将用于表示这种类型的地形图块,其值为0.

如何使用平铺位掩码自动平铺您的关卡布局  第4张一个以单一瓦片为边界的地形瓦片返回一个二进制值 0001, 或 1*1 + 2*0 + 4*0 + 8*0 = 1图块集中的 第二个精灵将用于表示这种类型的地形,其值为 1如何使用平铺位掩码自动平铺您的关卡布局  第5张

由北面瓦片和东面瓦片接壤的地形瓦片返回二进制值0101, 或1*1 + 2*0 + 4*1 + 8*0 = 5图块集中的第 6 个精灵将用于表示这种类型的地形,其值为5.

如何使用平铺位掩码自动平铺您的关卡布局  第6张

由东面瓦片和西面瓦片接壤的地形瓦片返回二进制值 0110, 或1*0 + 2*1 + 4*1 + 8*0 = 6图块集中的第 7 个精灵将用于表示这种类型的地形,其值为6.

将精灵分配给瓷砖

在计算出图块的位掩码值后,我们从图块集中分配适当的精灵。最后一步可以在地图加载时实时执行,或者可以将结果保存并加载到您选择的图块编辑器中以进行进一步编辑。

如何使用平铺位掩码自动平铺您的关卡布局  第7张

左边的图代表一个 4 位的单地形图块集,因为它会按顺序出现在图块表上。右图描绘了使用位掩码程序放置瓷砖后在游戏中的外观。每个图块都标有其位掩码值,以显示图块在图块表上的顺序与其在游戏中的位置之间的关系。 

作为一个例子,让我们检查一下右图右上角的瓦片。这块瓷砖与 West 和 Souh 的瓷砖接壤。布尔检查返回二进制值 1010, 或 1*0 + 2*1 + 4*0 + 8*1 = 10该值对应 于平铺表中的第 11个精灵。

瓦片集复杂性

所需的定向布尔检查的数量取决于您的瓦片集的预期复杂性。通过忽略角落部分,您可以使用这个简化的 4 位解决方案,它只需要四个方向二进制检查。 

但是,当您想要创建更具视觉吸引力的地形时会发生什么?您将需要处理角块的存在,这会将精灵的数量从 16 个增加到 48 个。以下 8 位位掩码示例需要每个块进行 8 次布尔方向检查。

带有角块的 8 位位掩码

对于这个例子,我们正在创建一个自上而下的瓷砖集,描绘海洋附近的草地地形。在这种情况下,我们的海洋存在于地形图块下方的图层上。这允许我们使用单地形解决方案,同时仍然保持两种地形类型正在碰撞的错觉。 

一旦游戏运行并且位掩码过程完成,精灵将永远不会改变。这是位掩码的无缝、静态实现,所有事情都发生在玩家看到图块之前。

介绍角砖

我们希望地形比之前的 4 位解决方案更具视觉吸引力,因此需要角块。这种额外的视觉复杂性需要艺术家、程序员和游戏本身进行指数级的额外工作。通过扩展我们从 4 位解决方案中学到的知识,我们可以快速了解如何处理 8 位解决方案。

如何使用平铺位掩码自动平铺您的关卡布局  第8张

这是我们海边地形图块的完整精灵表。你注意到瓷砖的数量有什么特别之处吗?前面的 4 位示例产生 2 4 = 16 个图块,因此这个 8 位示例肯定会产生 2 8 = 256 个图块,但显然比那里少。 

虽然这个 8 位位掩码过程确实会产生 256 个可能的二进制值,但并不是每个组合都需要一个完全唯一的图块。以下示例将帮助解释 256 种组合如何仅由 48 个图块表示。

8 位方向值

  • 西北 = 2 0  = 1

  • 北 = 2 1  = 2

  • 东北 = 2 2  = 4

  • 西 = 2 3  = 8

  • 东 = 2 4  = 16

  • 西南 = 2 5  = 32

  • 南= 2 6  = 64

  • 东南 = 2 7  = 128

如何使用平铺位掩码自动平铺您的关卡布局  第9张

现在我们要进行八次布尔定向检查。上面的中心图块与北、东北和东的图块接壤,因此此布尔检查返回二进制值00010110or 1*0 + 2*1 + 4*1 + 8*0 + 16*1 + 32*0 + 64*0 + 128*0 = 22

如何使用平铺位掩码自动平铺您的关卡布局  第10张

左上方的瓷砖与之前的瓷砖相似,但现在它也由向西南和东南部的瓷砖接壤。此布尔定向检查10110110返回或的二进制值1*0 + 2*1 + 4*1 + 8*0 + 16*1 + 32*1 + 64*0 + 128*1 = 182。 

该值与前一个图块不同,但两个图块实际上在视觉上是相同的,因此它变得多余。 

为了消除冗余,我们在布尔方向检查中添加了一个额外条件:在检查是否存在边界块时,我们还必须检查四个基本方向(直接北、东、南或西)上的相邻图块. 

例如,东北部的瓷砖与现有瓷砖相邻,而西南和东南部的瓷砖则不是。这意味着位掩码计算中不包括西南和东南瓦片。 

在这个新条件下,这个布尔检查返回一个二进制值000101101*0 + 2*1 + 4*1 + 8*0 + 16*1 + 32*0 + 64*0 + 128*0 = 22就像以前一样。现在您可以看到 256 种组合如何仅由 48 个图块表示。

瓷砖顺序

您可能会注意到的另一个问题是,由 8 位位掩码过程计算的值不再与精灵表中图块的顺序相关。只有 48 个图块,但我们可能的计算值范围从 0 到 255,因此我们在抓取合适的精灵时不能再将计算值作为直接参考。 

因此,我们需要一个数据结构来包含计算值列表及其对应的平铺值。您希望如何实现这取决于您,但请记住,您检查周围图块的顺序决定了您的图块应放置在 sprite 表中的顺序。 

对于此示例,我们按以下顺序检查边界图块:西北、北、东北、西、东、西南、南、东南。 

下面是完整的位掩码值集,因为它们与我们的 sprite 表中的图块位置相关(可以在您的项目中随意使用这些值以节省时间):

{ 2 = 1, 8 = 2, 10 = 3, 11 = 4, 16 = 5, 18 = 6, 22 = 7, 24 = 8, 26 = 9, 27 = 10, 30 = 11, 31 = 12, 64 = 13, 66 = 14, 72 = 15, 74 = 16, 75 = 17, 80 = 18, 82 = 19, 86 = 20, 88 = 21, 90 = 22, 91 = 23, 94 = 24, 95 = 25 , 104 = 26, 106 = 27, 107 = 28, 120 = 29, 122 = 30, 123 = 31, 126 = 32, 127 = 33, 208 = 34, 210 = 35, 214 = 36, 216 = 37, 218 = 38, 219 = 39, 222 = 40, 223 = 41, 248 = 42, 250 = 43, 251 = 44, 254 = 45, 255 = 46, 0 = 47 }

多种地形类型

我们之前的所有示例都假设单一地形类型,但是如果我们在等式中引入第二个地形呢?我们需要一个5 位的位掩码解决方案,并且我们需要定义我们的两种地形类型。我们还需要为仅在特定条件下计算的中心图块分配一个值。请记住,我们不再像前面的示例中那样考虑“空白空间”;瓷砖现在必须在四面八方被另一块瓷砖包围。

如何使用平铺位掩码自动平铺您的关卡布局  第11张

上图显示了一个具有两种地形类型且没有角块的示例。类型 1总是在方向检查期间检测到它时 返回一个值; 仅当地形类型 2 时才0计算和使用中心瓦片值 。

上例中的中心图块被北、西和东的地形类型 2 和南的地形类型 1 包围。中心瓦片是地形类型 1,因此不计算在内。00111此布尔检查返回或  的二进制值  1*1 + 2*1 + 4*1 + 8*0 + 16*0 = 7

如何使用平铺位掩码自动平铺您的关卡布局  第12张

在这个例子中,我们的中心瓦片是地形类型 2,所以它会被计入计算中。中心板块被北面和西面的地形类型 2 包围。它也被东部和南部的地形类型 1 包围。10011此布尔检查返回或  的二进制值  1*1 + 2*1 + 4*0 + 8*0 + 16*1 = 19 。

动态实施

位掩码计算也可以在游戏过程中执行,允许实时更改图块的位置和外观。这对于可破坏的地形以及允许制作和建造的游戏很有用。初始位掩码过程对于所有图块都是强制性的,但任何额外的动态计算只应在绝对必要时执行。例如,被破坏的地形图块将触发仅针对周围图块的位掩码计算。

结论

平铺位掩码是构建工作系统以帮助您进行游戏开发的完美示例。这不是直接影响玩家体验的东西;相反,这种自动化关卡设计的耗时部分的方法为开发人员提供了宝贵的好处。简而言之:平铺位掩码是一种让游戏完成繁琐工作的快速方法,让您可以专注于更重要的任务。


文章目录
  • 什么是平铺位掩码?
  • 平铺位掩码的工作原理
    • 概述
    • 计算位掩码值
      • 4 位方向值
    • 将精灵分配给瓷砖
    • 瓦片集复杂性
  • 带有角块的 8 位位掩码
    • 介绍角砖
      • 8 位方向值
    • 瓷砖顺序
  • 多种地形类型
  • 动态实施
  • 结论