Spritekit:如何将玩家移动限制在某些方块上

Spritekit: How to limit player movement to certain tiles only

问题背景: 如截图所示,我有一个 24*24 的 tilemap 和一个 player sprite 节点。目前我要解决的问题是,我希望将玩家的移动限制在字母A形的红色方块内。

我试过的解决方法: 我使用 intersects 方法逐帧检测 tilemap 和 player sprite 节点之间的碰撞。但是,我希望将玩家精灵节点与字母 A 形红色瓦片的框架而不是整个瓦片地图进行比较。

func detectMapCollision(){
    if player.frame.intersects(self.mainTileMap.frame){
        print("you are on the map! yay! ")
    }
}

那么,如何将字母 A 形的红色方块从整个地图中分离出来,然后将其帧与玩家进行比较,以便将玩家的移动限制在字母区域?

执行此操作的方法是为游戏的图块定义一个图块组和相应的图块定义。这样做允许您在每个磁贴组的 userData 信息中定义特定标识符,以便您可以在代码中区分它们。

https://developer.apple.com/documentation/spritekit/sktiledefinition/1645813-userdata

例如,在您的游戏中,您可以创建一个与组成字母 A 的所有红色方块相对应的方块组。然后您可以在 userData 字典中为该方块类型设置自定义键以识别它.然后每当玩家想要移动到新的图块时,检查代码中的键或键的值。您可以在变体的 tile 定义中的 Attributes Inspector 中直接设置 tile 的 userData 字典。

要检查的代码如下所示(假设您在 userData 字典中将布尔键 'letterA' 设置为 true:

let letterTile = myTileMap.tileDefinition(atColumn: column, row: row)

if letterTile.userData?.value(forKey: "letterA") == true {
    // Allow the player to move to this tile as it's one of the letter A tiles.
}

编辑:

根据您的查询,您不必在代码中填充您的游戏 map/grid。为此,我假设您已经创建了一个游戏项目,其中 GameScene.sks 已经预填充。在此文件中,您可以从对象库中删除 'Tile Map Node',您将在此处使用编辑器添加您的图块。

现在,带有用户数据的图块将来自 SpriteKit TileSet 资源文件,该文件也应该添加到您的项目中。从当前 Xcode (v11.3.1) 开始,默认图块集带有预建图块,但没有什么可以阻止您添加自己的自定义图块(字母 A 路线的红色图块)。然后当你创建了你的瓷砖组和瓷砖定义时,你可以通过选择特定的变体并在检查器 window.

中添加 keys/values 来修改他们的用户数据字典

如果您不确定如何执行我在前两段中概述的过程,可以在线免费获取各种最新的 SpriteKit TileMap 教程。我相信他们可能会在这方面进一步帮助你。

然而,必须编码的是检查特定图块中 UserData 信息的实际逻辑,以便您可以根据需要限制玩家移动——我在原始回复中给出了一个示例。