从零开始的 Godot 之旅 — EP11:初识瓦片地图

从零开始的 Godot 之旅 --- EP11:初识瓦片地图

在之前的章节中,我们已经成功创建了一个能跑能打的玩家角色。不过,这位勇士目前还只能在一片虚无的混沌中徘徊。为了让他能在丰富多彩的世界中冒险,我们需要引入游戏开发中的重要概念------地图。

在 Godot 引擎中,瓦片地图 (TileMap) 正是构建 2D 游戏世界的利器。本章将带大家初识瓦片地图,亲手搭建我们的第一个游戏场景。

什么是瓦片地图

所谓瓦片地图,顾名思义,就是像铺地砖一样,通过重复使用小块图像(称为"瓦片"或 Tile)来拼接出巨大的游戏地图。每个瓦片通常是固定大小的图像(如 16x16、32x32 像素)。通过巧妙排列这些小方块,我们可以高效地构建出森林、城镇、地下城等复杂场景,既节省内存,又便于编辑。

在 2D 游戏中,常见的瓦片地图主要分为两种类型:

  1. 正交瓦片地图 (Orthogonal TileMap):瓦片以矩形网格排列,适用于大多数传统的 2D 游戏(如《超级马里奥》、《星露谷物语》)。
  1. 等距瓦片地图 (Isometric TileMap):瓦片以菱形网格排列,能产生伪 3D 的视觉效果(如《饥荒》、《帝国时代 2》)。

相对来说,等距瓦片地图的逻辑稍显复杂。作为游戏开发的新手(其实是我自己还没完全参透),本章我们将重点介绍最基础也最常用的正交瓦片地图

准备素材

工欲善其事,必先利其器。在开始绘制之前,我们需要准备一套瓦片素材。本章我们将使用下面这张简单的素材图:

请按照以下步骤操作:

  1. scenes(场景)目录下新建一个名为 maps 的目录。

  2. maps 目录下创建一个 assets 文件夹。

  3. 将下载好的瓦片素材放入其中,并重命名为 tileset.png

创建场景

在 Godot 中,地图本身也是一个场景。

  1. 点击左上角的 Scene 菜单,选择 New Scene 创建新场景。
  1. 将新场景命名为 Map01,并保存到刚刚创建的 maps 目录下。

小贴士:在 Godot 中,场景(Scene)是游戏的基础组成单位。角色是场景,UI 是场景,地图自然也是一个场景。这种设计让我们可以灵活地组合和复用各种元素。

添加 TileMapLayer 节点

选中场景的根节点,点击添加子节点(或按 Ctrl+A / Cmd+A),搜索 TileMap。这里请注意选择 TileMapLayer 节点。

注意 :请选择 TileMapLayer 而不是 TileMap
在 Godot 4.0 及后续版本中,官方对瓦片地图系统进行了重构,引入了 TileMapLayer 节点来替代旧版的 TileMap 节点。虽然旧版节点仍保留用于兼容,但新版功能更强大且逻辑更清晰,建议大家从现在开始习惯使用新节点。

选中刚创建的 TileMapLayer 节点,你会发现底部面板多了一个 TileMap 选项卡,但目前它会提示"没有 TileSet 资源"。

创建 TileSet 资源

在开始绘制之前,我们需要先理解两个核心概念:TileSetTileMap

我们可以用"乐高积木"来打个比方:

  • TileSet(瓦片集) 就像是一盒乐高积木。它定义了盒子里有哪些形状的积木(瓦片),以及每块积木的属性(如碰撞体积、导航网格、地形规则等)。它是我们的"素材库"。

  • TileMapLayer(瓦片地图层) 就像是拼搭积木的底板。我们从 TileSet 这个盒子里拿出积木,按格子铺在这个底板上,最终拼出城堡或森林。

现在,我们来创建这个"积木盒"。

  1. 选中 TileMapLayer 节点,在右侧检查器(Inspector)中找到 Tile Set 属性。

  2. 点击右侧的 [空] 按钮,选择 新建 TileSet

创建好 TileSet 后,底部面板会自动切换到 TileSet 选项卡。将我们准备好的 tileset.png 素材直接拖入这个面板。

拖入后,Godot 会弹窗询问:"是否自动在不透明区域创建图块?"(Automatically create tiles in the atlas?)。直接点击 (Yes)。Godot 会自动扫描图片,将有内容的区域切分为一个个瓦片。

调整瓦片尺寸

如果你使用的是和我一样的素材,你会发现自动切分的网格和图片对不上。这是因为素材中每个瓦片的实际尺寸是 20x20 像素,而 Godot 默认的瓦片大小是 16x16 像素。

我们需要在 TileSet 面板右侧的 Setup 栏中,将 Texture Region Size 修改为 20x20

注意 :这里只需要修改 Texture Region Size (纹理区域大小),不要修改 TileSet 属性里的 Tile Size(那是地图网格的大小,通常保持默认或根据需求调整,但在本例中我们先只调整纹理切分大小)。

现在我们已经配置好了 TileSet,接下来就可以开始挥洒创意了!

绘制瓦片地图

一切准备就绪,开始绘制!

  1. 确保选中 TileMapLayer 节点。

  2. 在底部面板切换到 TileMap 选项卡(注意不是 TileSet 了)。

你会看到一个类似画图工具的界面:

  • 左侧工具栏:提供了画笔、矩形框选、油漆桶填充等工具。

  • 右侧瓦片库:展示了我们刚刚导入的瓦片素材。

选中 画笔工具,然后在右侧选择你想要绘制的瓦片,接着在中间的网格区域点击鼠标左键,就可以将瓦片"画"在地图上了。

快速绘制草地

为了演示,我们来快速绘制一片草地。

  1. 在右侧瓦片库中,按住鼠标左键拖动,选中几个不同的草地瓦片(多选)。

  2. 在左侧工具栏中,选中 矩形工具

  3. 启用 随机散布(Dice 图标/Place Random Tile)。这个功能非常实用,它会在你绘制时随机从选中的瓦片中挑选一个,这样画出来的草地不会千篇一律,看起来更自然。

  4. 在地图区域拖动鼠标,画出一大片草地。

就这样,一个最简单的草地场景就诞生了!(虽然除了绿草啥也没有,但好歹是个落脚地了 [笑哭])

将地图添加到主场景中

最后一步,我们需要把画好的地图放入游戏主世界。

  1. 调整层级 :为了不让地图遮挡住玩家,我们需要调整图层顺序。选中 TileMapLayer 节点,在检查器中找到 Z Index 属性,将其设置为 -1。这样地图就会永远显示在玩家(默认 Z Index 为 0)的下方。

  2. 实例化场景 :回到主场景(Main Scene),点击 实例化子场景 (链接图标),选择我们刚刚制作的 Map01.tscn

运行游戏,你会发现我们的主角终于不再是漂浮在虚空中,而是脚踏实地站在了草地上!

小结

至此,我们已经成功绘制并加载了第一个游戏地图。虽然它现在还只是一片简单的草地,但这是构建庞大游戏世界的第一步。

在下一节中,我们将为地图添加更多细节------树木、灌木、石头、围墙,并学习如何设置碰撞,让玩家真正能与这个世界产生交互,而不是像幽灵一样穿墙而过。

敬请期待!

相关推荐
SmalBox14 小时前
【节点】[GammaToLinearSpaceExact节点]原理解析与实际应用
unity3d·游戏开发·图形学
_大学牲20 小时前
Flutter 勇闯2D像素游戏之路(四):与哥布林战斗的滑步魔法师
flutter·游戏·游戏开发
SmalBox2 天前
【节点】[LinearToGammaSpaceExact节点]原理解析与实际应用
unity3d·游戏开发·图形学
技术小甜甜3 天前
[Godot] 解决导出APK安装失败的常见问题:深入分析与调试方法
游戏引擎·godot·游戏开发
SmalBox3 天前
【节点】[RGBtoGrayscale节点]原理解析与实际应用
unity3d·游戏开发·图形学
技术小甜甜3 天前
[Godot][入门] 安装与版本选择:3.x 还是 4.x?(按项目类型一键决策)
游戏引擎·godot·游戏开发·2d
SmalBox4 天前
【节点】[RGBtoLuminance节点]原理解析与实际应用
unity3d·游戏开发·图形学
SmalBox5 天前
【节点】[ColorspaceConversion节点]原理解析与实际应用
unity3d·游戏开发·图形学
_大学牲6 天前
Flutter 勇闯2D像素游戏之路(三):人物与地图元素的交互
flutter·游戏·游戏开发
wonder135796 天前
UGUI重建流程和优化
unity·游戏开发·ugui