--- title: RPG地图示例 brief: 在本示例项目中,你将学习一种创建大型RPG地图的方法。 --- # RPG地图 - 示例项目 在本示例项目中,你可以[从编辑器打开](/manuals/project-setup/)或[从GitHub下载](https://github.com/defold/sample-rpgmap),我们展示了在Defold中创建大型RPG地图的一种方法。该设计基于以下假设: 1. 世界一次呈现一个屏幕。这允许游戏自然地将敌人和NPC角色包含在单个屏幕的边界内。关卡设计师可以完全控制世界如何在玩家的屏幕上呈现。 2. 玩家角色应该能够任意远距离移动,而游戏不会出现浮点精度问题。这些问题通常会导致物体在远离原点移动时出现奇怪的抖动。 3. 玩家的移动受到地图上障碍物的限制,因此关卡设计师可以使用树木、岩石、水和其他障碍物引导玩家在屏幕之间移动。 4. 应该可以混合搭配瓦片地图、精灵和其他视觉内容。 首先,运行示例并穿过3x3屏幕大小的世界,以了解示例的设置。你可以使用方向键控制角色。 ## 主集合 打开"/main/main.collection"以查看此示例的引导集合。 ![](images/rpgmap/main_collection.png) 主集合包含玩家角色游戏对象,使用方向按钮在8个方向上控制,以及第二个名为"game"的游戏对象,它控制游戏的流程。"game"对象由一个脚本和游戏中每个屏幕的一个集合工厂组成。工厂根据屏幕网格命名方案命名。 脚本"/main/game.script"跟踪玩家当前所在的屏幕。该脚本还会对名为"load_screen"的自定义消息做出反应。此消息加载新屏幕并将其与英雄移动方向上的当前屏幕交换。最初,一个屏幕被加载到屏幕中心,没有其他屏幕可以与之交换位置。 ## 更换屏幕 英雄由脚本"/main/hero.script"控制。该脚本检查英雄游戏对象是否移动到靠近屏幕边缘的顶部、底部、左侧或右侧线附近: ![](images/rpgmap/change_screen.png) 1. 如果英雄移动到足够接近屏幕边缘,会向"game"对象脚本发送一条消息以加载下一个屏幕。 2. 通过在正确的集合工厂组件上调用`factory.create()`来生成下一个屏幕集合。集合的内容被定位在屏幕外。 3. 下一个屏幕滚动到视图中心,当前屏幕向相反方向滚动出去。玩家角色也以相同的距离和速度滚动。 4. 现在在屏幕外的旧当前屏幕被删除,下一个屏幕被提升为新的当前屏幕。 5. 英雄在新屏幕中动画进入视图,玩家重新获得控制。 所有这些都在一秒钟内发生,因此过渡是平滑且无干扰的。 ## 屏幕 游戏世界中的每个屏幕都在一个单独的集合中构建,包含瓦片地图、碰撞对象和该屏幕独有的其他游戏对象。为了便于管理和加载屏幕,屏幕集合根据简单的方案命名: ![](images/rpgmap/screens.png) 每个屏幕集合根据其在世界网格中的位置命名。第一个数字是X网格位置,第二个是Y网格位置。 在*资产*视图中,导航并打开集合"/main/screens/0-0.collection",它描述了地图左下角的屏幕: ![](images/rpgmap/screen_collection.png) 请注意,有一个名为"root"的游戏对象,它是屏幕所有内容的父对象。这是示例中使用的另一个约定,它有一个非常重要的目的:当屏幕被带入视图时,只需要移动"root"游戏对象。所有子对象都会自动与根父对象一起移动。如果屏幕上有特殊的游戏对象,它们也可以自由动画,因为它们的移动是相对于根父对象的。当屏幕滚动进入或退出时,这些子对象会随着屏幕一起移动。只有当对象需要在屏幕之间移动时才需要特殊代码。 屏幕0-1上的蜜蜂是这个想法的简单展示: ![](images/rpgmap/bees.png) ## 在世界上下文中编辑屏幕 每个屏幕都有自己的瓦片地图,可以在内置的瓦片地图编辑器中编辑。然而,单独编辑每个屏幕的主要缺点是无法轻松地看到它如何与相邻屏幕连接,这是创建游戏世界连续性的一个重要方面。 因此,创建了一个特殊的集合。打开"/main/map/test_layout.collection"以查看这个世界测试布局集合: ![](images/rpgmap/test_layout.png) 这个集合的唯一目的是在开发过程中用作编辑工具。与测试布局集合并排编辑特定屏幕可以为你提供当前正在处理的屏幕的上下文,编辑过程会更加愉快: ![](images/rpgmap/side_by_side.png) 对屏幕瓦片地图的任何编辑(这里在右侧窗格中)都会立即反映在测试集合中(在左侧窗格中)。还要注意,测试布局集合没有添加到静态层次结构中,因此它会自动从所有构建中排除。 ## 总结 正如你所看到的,这个示例是根据关于游戏世界和游戏英雄如何穿越它的特定约束构建的。如果你的游戏有不同的需求,你可能需要找到不同的解决方案。例如,如果你的游戏要求相机应该在世界地图上无缝移动,你需要不同的方式来分割你的内容,不同的加载机制,以及不同的工具来帮助你创作游戏世界。 这结束了RPG地图示例的演练。与往常一样,你可以以任何你认为合适的方式使用示例的内容。要了解更多关于Defold的信息,请查看我们的[文档页面](https://defold.com/learn)以获取更多示例、教程、手册和API文档。 如果你遇到问题或有疑问,[请访问我们的论坛](https://forum.defold.com/)。 祝Defold开发愉快!