SKTileMapNode:创建一个无限大小的瓦片地图

Posted

技术标签:

【中文标题】SKTileMapNode:创建一个无限大小的瓦片地图【英文标题】:SKTileMapNode: Create an infinitely sized tile map 【发布时间】:2017-11-08 10:49:07 【问题描述】:

在Apple Documents 上,它声称您可以制作无限大小的 SKTileMap

生成类似于自然地形的程序游戏世界地图。您可以通过使用程序噪声作为其底层表示来创建无限大小的游戏世界,并通过仅为玩家当前位置周围的区域创建噪声图(及其视觉表示)来有效地管理存储和内存。 (参见 SKTileMap 类。)

我可以使用 GKNoise 生成逼真的地形,就像 Apple Documents 声称的那样。

但是,我无法制作 1 个巨大的无限大小的 SKTileMapNode 在设备上运行会非常紧张

Apple 文档说只在玩家当前位置周围创建一个 SKTileMapNode(就像我的世界中的块)

我怎样才能快速做到这一点?我的 RPG 需要无限大,才能实现我想用这个游戏做的一切。

我需要将“块”作为 SKTileMapNodes,因为我需要将树木、石头、水等添加到地图中,以便玩家可以与之交互。

【问题讨论】:

我真的应该玩瓷砖地图似乎很有趣。这个想法是你制作一个足够大的地图让玩家可以行走,并且也足够大以在背景中加载下一个地图区域。由于您是通过程序生成来完成的,因此种子将允许一遍又一遍地创建相同类型的生成。不幸的是,您需要做很多工作,也许这里的一些东西可以帮助您raywenderlich.com/137216/… 我也一直在玩 SKTileMaps,实际上我对我用它取得的成就感到非常自豪 【参考方案1】:

您的问题的解决方案首先是使 GKNoise 可平铺。 您可能正在使用 GKNoiseMap 来生成它们。 当你使用初始化器时:

let map = GKNoiseMap(_ noise: GKNoise, size: vector_double2,  
origin: vector_double2, sampleCount: vector_int2, seamless: Bool)

重要提示:不要忘记将“无缝”变量设置为 true

这样你就得到了一个可平铺的地图。 让它们比屏幕大时看起来会更好。

假设地图的一部分(可平铺)是您的现实地形,到 2048 年将是 2048 年

例如,一张地图可能覆盖 128x128 个图块。在这种情况下,每个 SKTile 将是 16x16 像素

您制作了一个具有 128x128 瓷砖的 SKTileMap

现在 SKTileMap 需要一个背景图像,或图块定义(在本例中,它是您生成的 GKNoiseMap

现在您可以使用相同的 GKNoiseMap 地图,并将其放置在第一张地图旁边,在任何方向上,包含另一个 128x128 瓷砖地图。

您的地图现在是 256x128 块。当用户滚动时,他们无法分辨一个图像在哪里结束,而另一个图像从哪里开始,因此地图的整个大小可以任意大,通过重复相同的操作锻炼。

当您生成比屏幕大的 GKNoiseMap 时效果很好,此时您必须在下一个 GKNoiseMap 开始之前滚动几次。这样它就不会在视觉上重复。

“玩家位置”周围的区域可以是一张地图,然后当您滚动时,地图可以重复播放,让您无需加载除了已生成的地图之外的任何其他内容。这回答了您问题的“并通过创建噪声图来有效管理存储和内存”部分。

您还应该小心使用数据存储。如果每个 SKTile 需要存储的变量与 GKNoiseMap 所提供的变量不同,那么无限地图可能会很昂贵。

【讨论】:

以上是关于SKTileMapNode:创建一个无限大小的瓦片地图的主要内容,如果未能解决你的问题,请参考以下文章

Spritekit Hexagonal map:SKAction 中的瓦片检测。

捏手势不适用于 SKCameraNode

列和行索引高于 SKTileMapNode 中的列和行数

更改 SKTileMapNode 中特定图块的颜色

改变 SKTileMapNode 的位置不会改变它的行和列的位置

真实设备上的 SKTileMap 物理错误